Skip to content

Commit 5262703

Browse files
lunnybkcsoft
authored andcommitted
Add markup package to prepare for org markup format (#1493)
1 parent f0db3da commit 5262703

File tree

6 files changed

+157
-51
lines changed

6 files changed

+157
-51
lines changed

modules/markdown/markdown.go

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"golang.org/x/net/html"
2020

2121
"code.gitea.io/gitea/modules/base"
22+
"code.gitea.io/gitea/modules/markup"
2223
"code.gitea.io/gitea/modules/setting"
2324
)
2425

@@ -40,18 +41,6 @@ func IsMarkdownFile(name string) bool {
4041
return false
4142
}
4243

43-
// IsReadmeFile reports whether name looks like a README file
44-
// based on its name.
45-
func IsReadmeFile(name string) bool {
46-
name = strings.ToLower(name)
47-
if len(name) < 6 {
48-
return false
49-
} else if len(name) == 6 {
50-
return name == "readme"
51-
}
52-
return name[:7] == "readme."
53-
}
54-
5544
var (
5645
// MentionPattern matches string that mentions someone, e.g. @Unknwon
5746
MentionPattern = regexp.MustCompile(`(\s|^|\W)@[0-9a-zA-Z-_\.]+`)
@@ -707,3 +696,31 @@ func RenderString(raw, urlPrefix string, metas map[string]string) string {
707696
func RenderWiki(rawBytes []byte, urlPrefix string, metas map[string]string) string {
708697
return string(render(rawBytes, urlPrefix, metas, true))
709698
}
699+
700+
var (
701+
// MarkupName describes markup's name
702+
MarkupName = "markdown"
703+
)
704+
705+
func init() {
706+
markup.RegisterParser(Parser{})
707+
}
708+
709+
// Parser implements markup.Parser
710+
type Parser struct {
711+
}
712+
713+
// Name implements markup.Parser
714+
func (Parser) Name() string {
715+
return MarkupName
716+
}
717+
718+
// Extensions implements markup.Parser
719+
func (Parser) Extensions() []string {
720+
return setting.Markdown.FileExtensions
721+
}
722+
723+
// Render implements markup.Parser
724+
func (Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte {
725+
return render(rawBytes, urlPrefix, metas, isWiki)
726+
}

modules/markdown/markdown_test.go

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
// Copyright 2017 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
15
package markdown_test
26

37
import (
@@ -586,31 +590,6 @@ func TestMisc_IsMarkdownFile(t *testing.T) {
586590
}
587591
}
588592

589-
func TestMisc_IsReadmeFile(t *testing.T) {
590-
trueTestCases := []string{
591-
"readme",
592-
"README",
593-
"readME.mdown",
594-
"README.md",
595-
}
596-
falseTestCases := []string{
597-
"test.md",
598-
"wow.MARKDOWN",
599-
"LOL.mDoWn",
600-
"test",
601-
"abcdefg",
602-
"abcdefghijklmnopqrstuvwxyz",
603-
"test.md.test",
604-
}
605-
606-
for _, testCase := range trueTestCases {
607-
assert.True(t, IsReadmeFile(testCase))
608-
}
609-
for _, testCase := range falseTestCases {
610-
assert.False(t, IsReadmeFile(testCase))
611-
}
612-
}
613-
614593
func TestMisc_IsSameDomain(t *testing.T) {
615594
setting.AppURL = AppURL
616595
setting.AppSubURL = AppSubURL

modules/markup/markup.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// Copyright 2017 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package markup
6+
7+
import (
8+
"path/filepath"
9+
"strings"
10+
)
11+
12+
// Parser defines an interface for parsering markup file to HTML
13+
type Parser interface {
14+
Name() string // markup format name
15+
Extensions() []string
16+
Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte
17+
}
18+
19+
var (
20+
parsers = make(map[string]Parser)
21+
)
22+
23+
// RegisterParser registers a new markup file parser
24+
func RegisterParser(parser Parser) {
25+
for _, ext := range parser.Extensions() {
26+
parsers[strings.ToLower(ext)] = parser
27+
}
28+
}
29+
30+
// Render renders markup file to HTML with all specific handling stuff.
31+
func Render(filename string, rawBytes []byte, urlPrefix string, metas map[string]string) []byte {
32+
return render(filename, rawBytes, urlPrefix, metas, false)
33+
}
34+
35+
func render(filename string, rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte {
36+
extension := strings.ToLower(filepath.Ext(filename))
37+
if parser, ok := parsers[extension]; ok {
38+
return parser.Render(rawBytes, urlPrefix, metas, isWiki)
39+
}
40+
return nil
41+
}
42+
43+
// RenderString renders Markdown to HTML with special links and returns string type.
44+
func RenderString(filename string, raw, urlPrefix string, metas map[string]string) string {
45+
return string(render(filename, []byte(raw), urlPrefix, metas, false))
46+
}
47+
48+
// RenderWiki renders markdown wiki page to HTML and return HTML string
49+
func RenderWiki(filename string, rawBytes []byte, urlPrefix string, metas map[string]string) string {
50+
return string(render(filename, rawBytes, urlPrefix, metas, true))
51+
}
52+
53+
// Type returns if markup format via the filename
54+
func Type(filename string) string {
55+
extension := strings.ToLower(filepath.Ext(filename))
56+
if parser, ok := parsers[extension]; ok {
57+
return parser.Name()
58+
}
59+
return ""
60+
}
61+
62+
// IsReadmeFile reports whether name looks like a README file
63+
// based on its name.
64+
func IsReadmeFile(name string) bool {
65+
name = strings.ToLower(name)
66+
if len(name) < 6 {
67+
return false
68+
} else if len(name) == 6 {
69+
return name == "readme"
70+
}
71+
return name[:7] == "readme."
72+
}

modules/markup/markup_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright 2017 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package markup
6+
7+
import (
8+
"testing"
9+
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
func TestMisc_IsReadmeFile(t *testing.T) {
14+
trueTestCases := []string{
15+
"readme",
16+
"README",
17+
"readME.mdown",
18+
"README.md",
19+
}
20+
falseTestCases := []string{
21+
"test.md",
22+
"wow.MARKDOWN",
23+
"LOL.mDoWn",
24+
"test",
25+
"abcdefg",
26+
"abcdefghijklmnopqrstuvwxyz",
27+
"test.md.test",
28+
}
29+
30+
for _, testCase := range trueTestCases {
31+
assert.True(t, IsReadmeFile(testCase))
32+
}
33+
for _, testCase := range falseTestCases {
34+
assert.False(t, IsReadmeFile(testCase))
35+
}
36+
}

routers/repo/view.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
"code.gitea.io/gitea/modules/highlight"
2222
"code.gitea.io/gitea/modules/lfs"
2323
"code.gitea.io/gitea/modules/log"
24-
"code.gitea.io/gitea/modules/markdown"
24+
"code.gitea.io/gitea/modules/markup"
2525
"code.gitea.io/gitea/modules/setting"
2626
"code.gitea.io/gitea/modules/templates"
2727
"github.com/Unknwon/paginater"
@@ -56,7 +56,7 @@ func renderDirectory(ctx *context.Context, treeLink string) {
5656

5757
var readmeFile *git.Blob
5858
for _, entry := range entries {
59-
if entry.IsDir() || !markdown.IsReadmeFile(entry.Name()) {
59+
if entry.IsDir() || !markup.IsReadmeFile(entry.Name()) {
6060
continue
6161
}
6262

@@ -87,17 +87,16 @@ func renderDirectory(ctx *context.Context, treeLink string) {
8787
if isTextFile {
8888
d, _ := ioutil.ReadAll(dataRc)
8989
buf = append(buf, d...)
90-
switch {
91-
case markdown.IsMarkdownFile(readmeFile.Name()):
90+
newbuf := markup.Render(readmeFile.Name(), buf, treeLink, ctx.Repo.Repository.ComposeMetas())
91+
if newbuf != nil {
9292
ctx.Data["IsMarkdown"] = true
93-
buf = markdown.Render(buf, treeLink, ctx.Repo.Repository.ComposeMetas())
94-
default:
93+
} else {
9594
// FIXME This is the only way to show non-markdown files
9695
// instead of a broken "View Raw" link
9796
ctx.Data["IsMarkdown"] = true
98-
buf = bytes.Replace(buf, []byte("\n"), []byte(`<br>`), -1)
97+
newbuf = bytes.Replace(buf, []byte("\n"), []byte(`<br>`), -1)
9998
}
100-
ctx.Data["FileContent"] = string(buf)
99+
ctx.Data["FileContent"] = string(newbuf)
101100
}
102101
}
103102

@@ -182,13 +181,15 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
182181
d, _ := ioutil.ReadAll(dataRc)
183182
buf = append(buf, d...)
184183

185-
isMarkdown := markdown.IsMarkdownFile(blob.Name())
186-
ctx.Data["IsMarkdown"] = isMarkdown
184+
tp := markup.Type(blob.Name())
185+
isSupportedMarkup := tp != ""
186+
// FIXME: currently set IsMarkdown for compitable
187+
ctx.Data["IsMarkdown"] = isSupportedMarkup
187188

188-
readmeExist := isMarkdown || markdown.IsReadmeFile(blob.Name())
189+
readmeExist := isSupportedMarkup || markup.IsReadmeFile(blob.Name())
189190
ctx.Data["ReadmeExist"] = readmeExist
190-
if readmeExist && isMarkdown {
191-
ctx.Data["FileContent"] = string(markdown.Render(buf, path.Dir(treeLink), ctx.Repo.Repository.ComposeMetas()))
191+
if readmeExist && isSupportedMarkup {
192+
ctx.Data["FileContent"] = string(markup.Render(blob.Name(), buf, path.Dir(treeLink), ctx.Repo.Repository.ComposeMetas()))
192193
} else {
193194
// Building code view blocks with line number on server side.
194195
var fileContent string

routers/repo/wiki.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"code.gitea.io/gitea/modules/base"
2020
"code.gitea.io/gitea/modules/context"
2121
"code.gitea.io/gitea/modules/markdown"
22+
"code.gitea.io/gitea/modules/markup"
2223
)
2324

2425
const (
@@ -322,7 +323,7 @@ func Wiki(ctx *context.Context) {
322323
}
323324

324325
ename := entry.Name()
325-
if !markdown.IsMarkdownFile(ename) {
326+
if markup.Type(ename) != markdown.MarkupName {
326327
ext := strings.ToUpper(filepath.Ext(ename))
327328
ctx.Data["FormatWarning"] = fmt.Sprintf("%s rendering is not supported at the moment. Rendered as Markdown.", ext)
328329
}

0 commit comments

Comments
 (0)