@@ -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, | |||
}) | |||
} | |||
} | |||
@@ -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> |