aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorslene <vslene@gmail.com>2014-03-17 18:46:54 +0800
committerslene <vslene@gmail.com>2014-03-17 18:46:54 +0800
commit5bc2a1a6f98ae42ab5c30299d26082ffae54b859 (patch)
tree5bed6b099888bf745a9f749e90de22d61ee14618
parent26f9962b6e0089773615ca34ab80ca01ede79790 (diff)
show readme.md
-rw-r--r--models/repo2.go16
-rw-r--r--modules/base/markdown.go39
-rw-r--r--routers/repo/single.go51
-rw-r--r--templates/repo/single.tmpl12
4 files changed, 101 insertions, 17 deletions
diff --git a/models/repo2.go b/models/repo2.go
index 0c17a583..b31244b4 100644
--- a/models/repo2.go
+++ b/models/repo2.go
@@ -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,
})
}
}
diff --git a/modules/base/markdown.go b/modules/base/markdown.go
new file mode 100644
index 00000000..d170abe1
--- /dev/null
+++ b/modules/base/markdown.go
@@ -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
+}
diff --git a/routers/repo/single.go b/routers/repo/single.go
index c144106c..f47a2f7b 100644
--- a/routers/repo/single.go
+++ b/routers/repo/single.go
@@ -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
diff --git a/templates/repo/single.tmpl b/templates/repo/single.tmpl
index 153910f7..c22f129f 100644
--- a/templates/repo/single.tmpl
+++ b/templates/repo/single.tmpl
@@ -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>