show readme.md

This commit is contained in:
slene 2014-03-17 18:46:54 +08:00
parent 26f9962b6e
commit 5bc2a1a6f9
4 changed files with 101 additions and 17 deletions

@ -5,6 +5,7 @@
package models
import (
"fmt"
"path"
"strings"
"time"
@ -22,12 +23,25 @@ type Commit struct {
Message string
}
var (
ErrRepoFileNotLoaded = fmt.Errorf("repo file not loaded")
)
type RepoFile struct {
*git.TreeEntry
Path string
Message string
Created time.Time
Size int64
Repo *git.Repository
}
func (file *RepoFile) LookupBlob() (*git.Blob, error) {
if file.Repo == nil {
return nil, ErrRepoFileNotLoaded
}
return file.Repo.LookupBlob(file.Id)
}
func GetBranches(userName, reposName string) ([]string, error) {
@ -80,6 +94,7 @@ func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile,
lastCommit.Message(),
lastCommit.Committer.When,
size,
repo,
})
case git.FileModeTree:
repodirs = append(repodirs, &RepoFile{
@ -88,6 +103,7 @@ func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile,
lastCommit.Message(),
lastCommit.Committer.When,
size,
repo,
})
}
}

39
modules/base/markdown.go Normal file

@ -0,0 +1,39 @@
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package base
import (
"github.com/slene/blackfriday"
)
func RenderMarkdown(rawBytes []byte) []byte {
htmlFlags := 0
htmlFlags |= blackfriday.HTML_USE_XHTML
// htmlFlags |= blackfriday.HTML_USE_SMARTYPANTS
// htmlFlags |= blackfriday.HTML_SMARTYPANTS_FRACTIONS
// htmlFlags |= blackfriday.HTML_SMARTYPANTS_LATEX_DASHES
htmlFlags |= blackfriday.HTML_SKIP_HTML
htmlFlags |= blackfriday.HTML_SKIP_STYLE
htmlFlags |= blackfriday.HTML_SKIP_SCRIPT
htmlFlags |= blackfriday.HTML_GITHUB_BLOCKCODE
htmlFlags |= blackfriday.HTML_OMIT_CONTENTS
htmlFlags |= blackfriday.HTML_COMPLETE_PAGE
renderer := blackfriday.HtmlRenderer(htmlFlags, "", "")
// set up the parser
extensions := 0
extensions |= blackfriday.EXTENSION_NO_INTRA_EMPHASIS
extensions |= blackfriday.EXTENSION_TABLES
extensions |= blackfriday.EXTENSION_FENCED_CODE
extensions |= blackfriday.EXTENSION_AUTOLINK
extensions |= blackfriday.EXTENSION_STRIKETHROUGH
extensions |= blackfriday.EXTENSION_HARD_LINE_BREAK
extensions |= blackfriday.EXTENSION_SPACE_HEADERS
extensions |= blackfriday.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK
body := blackfriday.Markdown(rawBytes, renderer, extensions)
return body
}

@ -8,9 +8,11 @@ import (
"strings"
"github.com/codegangsta/martini"
// "github.com/slene/blackfriday"
"github.com/gogits/git"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/middleware"
)
@ -43,12 +45,14 @@ func Single(ctx *middleware.Context, params martini.Params) {
params["branchname"] = "master"
}
// Directory and file list.
// Get tree path
treename := params["_1"]
// Directory and file list.
files, err := models.GetReposFiles(params["username"], params["reponame"],
params["branchname"], treename)
if err != nil {
ctx.Handle(200, "repo.Single", err)
ctx.Render.Error(404)
return
}
ctx.Data["Username"] = params["username"]
@ -58,7 +62,7 @@ func Single(ctx *middleware.Context, params martini.Params) {
// Branches.
brs, err := models.GetBranches(params["username"], params["reponame"])
if err != nil {
ctx.Handle(200, "repo.Single", err)
ctx.Render.Error(404)
return
}
ctx.Data["Branches"] = brs
@ -73,22 +77,41 @@ func Single(ctx *middleware.Context, params martini.Params) {
}
}
// Latest commit.
// Get latest commit according username and repo name
commit, err := models.GetLastestCommit(params["username"], params["reponame"])
if err != nil {
ctx.Handle(200, "repo.Single", err)
ctx.Render.Error(404)
return
}
ctx.Data["LatestCommit"] = commit
// README.
// for _, f := range files {
// if f.Name == "README.md" {
// ctx.Data["ReadmeName"] = "README.md"
// ctx.Data["ReadmeContent"] =
// break
// }
// }
var readmeFile *models.RepoFile
for _, f := range files {
if !f.IsFile() {
continue
}
if len(f.Name) < 6 {
continue
}
if strings.ToLower(f.Name[:6]) == "readme" {
readmeFile = f
break
}
}
if readmeFile != nil {
// if file large than 1M not show it
if readmeFile.Size > 1024*1024 || readmeFile.Filemode != git.FileModeBlob {
ctx.Data["FileIsLarge"] = true
} else if blob, err := readmeFile.LookupBlob(); err != nil {
ctx.Data["FileIsLarge"] = true
} else {
ctx.Data["ReadmeContent"] = string(base.RenderMarkdown(blob.Contents()))
}
}
ctx.Data["Paths"] = Paths
ctx.Data["Treenames"] = treenames

@ -87,9 +87,15 @@
<div class="panel-heading file-head">
<i class="icon fa fa-book"></i> README.md
</div>
<div class="panel-body file-body markdown">
markdown content
</div>
{{if .FileIsLarge}}
<div class="panel-footer">
Large file size 1000kb
</div>
{{else}}
<div class="panel-body file-body markdown">
{{.ReadmeContent|str2html}}
</div>
{{end}}
</div>
</div>
</div>