mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 03:18:24 +00:00 
			
		
		
		
	Add init support of orgmode document type on file view and readme (#2525)
* add init support of orgmode document type on file view and readme * fix imports * fix imports and readmeExist * fix imports order * fix format * remove unnecessary convert
This commit is contained in:
		
							
								
								
									
										200
									
								
								modules/markup/markdown/markdown.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								modules/markup/markdown/markdown.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,200 @@ | ||||
| // 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 markdown | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"strings" | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/markup" | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
|  | ||||
| 	"github.com/russross/blackfriday" | ||||
| ) | ||||
|  | ||||
| // Renderer is a extended version of underlying render object. | ||||
| type Renderer struct { | ||||
| 	blackfriday.Renderer | ||||
| 	URLPrefix string | ||||
| 	IsWiki    bool | ||||
| } | ||||
|  | ||||
| // Link defines how formal links should be processed to produce corresponding HTML elements. | ||||
| func (r *Renderer) Link(out *bytes.Buffer, link []byte, title []byte, content []byte) { | ||||
| 	if len(link) > 0 && !markup.IsLink(link) { | ||||
| 		if link[0] != '#' { | ||||
| 			lnk := string(link) | ||||
| 			if r.IsWiki { | ||||
| 				lnk = markup.URLJoin("wiki", lnk) | ||||
| 			} | ||||
| 			mLink := markup.URLJoin(r.URLPrefix, lnk) | ||||
| 			link = []byte(mLink) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	r.Renderer.Link(out, link, title, content) | ||||
| } | ||||
|  | ||||
| // List renders markdown bullet or digit lists to HTML | ||||
| func (r *Renderer) List(out *bytes.Buffer, text func() bool, flags int) { | ||||
| 	marker := out.Len() | ||||
| 	if out.Len() > 0 { | ||||
| 		out.WriteByte('\n') | ||||
| 	} | ||||
|  | ||||
| 	if flags&blackfriday.LIST_TYPE_DEFINITION != 0 { | ||||
| 		out.WriteString("<dl>") | ||||
| 	} else if flags&blackfriday.LIST_TYPE_ORDERED != 0 { | ||||
| 		out.WriteString("<ol class='ui list'>") | ||||
| 	} else { | ||||
| 		out.WriteString("<ul class='ui list'>") | ||||
| 	} | ||||
| 	if !text() { | ||||
| 		out.Truncate(marker) | ||||
| 		return | ||||
| 	} | ||||
| 	if flags&blackfriday.LIST_TYPE_DEFINITION != 0 { | ||||
| 		out.WriteString("</dl>\n") | ||||
| 	} else if flags&blackfriday.LIST_TYPE_ORDERED != 0 { | ||||
| 		out.WriteString("</ol>\n") | ||||
| 	} else { | ||||
| 		out.WriteString("</ul>\n") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ListItem defines how list items should be processed to produce corresponding HTML elements. | ||||
| func (r *Renderer) ListItem(out *bytes.Buffer, text []byte, flags int) { | ||||
| 	// Detect procedures to draw checkboxes. | ||||
| 	prefix := "" | ||||
| 	if bytes.HasPrefix(text, []byte("<p>")) { | ||||
| 		prefix = "<p>" | ||||
| 	} | ||||
| 	switch { | ||||
| 	case bytes.HasPrefix(text, []byte(prefix+"[ ] ")): | ||||
| 		text = append([]byte(`<span class="ui fitted disabled checkbox"><input type="checkbox" disabled="disabled" /><label /></span>`), text[3+len(prefix):]...) | ||||
| 		if prefix != "" { | ||||
| 			text = bytes.Replace(text, []byte(prefix), []byte{}, 1) | ||||
| 		} | ||||
| 	case bytes.HasPrefix(text, []byte(prefix+"[x] ")): | ||||
| 		text = append([]byte(`<span class="ui checked fitted disabled checkbox"><input type="checkbox" checked="" disabled="disabled" /><label /></span>`), text[3+len(prefix):]...) | ||||
| 		if prefix != "" { | ||||
| 			text = bytes.Replace(text, []byte(prefix), []byte{}, 1) | ||||
| 		} | ||||
| 	} | ||||
| 	r.Renderer.ListItem(out, text, flags) | ||||
| } | ||||
|  | ||||
| // Note: this section is for purpose of increase performance and | ||||
| // reduce memory allocation at runtime since they are constant literals. | ||||
| var ( | ||||
| 	svgSuffix         = []byte(".svg") | ||||
| 	svgSuffixWithMark = []byte(".svg?") | ||||
| ) | ||||
|  | ||||
| // Image defines how images should be processed to produce corresponding HTML elements. | ||||
| func (r *Renderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) { | ||||
| 	prefix := r.URLPrefix | ||||
| 	if r.IsWiki { | ||||
| 		prefix = markup.URLJoin(prefix, "wiki", "src") | ||||
| 	} | ||||
| 	prefix = strings.Replace(prefix, "/src/", "/raw/", 1) | ||||
| 	if len(link) > 0 { | ||||
| 		if markup.IsLink(link) { | ||||
| 			// External link with .svg suffix usually means CI status. | ||||
| 			// TODO: define a keyword to allow non-svg images render as external link. | ||||
| 			if bytes.HasSuffix(link, svgSuffix) || bytes.Contains(link, svgSuffixWithMark) { | ||||
| 				r.Renderer.Image(out, link, title, alt) | ||||
| 				return | ||||
| 			} | ||||
| 		} else { | ||||
| 			lnk := string(link) | ||||
| 			lnk = markup.URLJoin(prefix, lnk) | ||||
| 			lnk = strings.Replace(lnk, " ", "+", -1) | ||||
| 			link = []byte(lnk) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	out.WriteString(`<a href="`) | ||||
| 	out.Write(link) | ||||
| 	out.WriteString(`">`) | ||||
| 	r.Renderer.Image(out, link, title, alt) | ||||
| 	out.WriteString("</a>") | ||||
| } | ||||
|  | ||||
| // RenderRaw renders Markdown to HTML without handling special links. | ||||
| func RenderRaw(body []byte, urlPrefix string, wikiMarkdown bool) []byte { | ||||
| 	htmlFlags := 0 | ||||
| 	htmlFlags |= blackfriday.HTML_SKIP_STYLE | ||||
| 	htmlFlags |= blackfriday.HTML_OMIT_CONTENTS | ||||
| 	renderer := &Renderer{ | ||||
| 		Renderer:  blackfriday.HtmlRenderer(htmlFlags, "", ""), | ||||
| 		URLPrefix: urlPrefix, | ||||
| 		IsWiki:    wikiMarkdown, | ||||
| 	} | ||||
|  | ||||
| 	// set up the parser | ||||
| 	extensions := 0 | ||||
| 	extensions |= blackfriday.EXTENSION_NO_INTRA_EMPHASIS | ||||
| 	extensions |= blackfriday.EXTENSION_TABLES | ||||
| 	extensions |= blackfriday.EXTENSION_FENCED_CODE | ||||
| 	extensions |= blackfriday.EXTENSION_STRIKETHROUGH | ||||
| 	extensions |= blackfriday.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK | ||||
|  | ||||
| 	if setting.Markdown.EnableHardLineBreak { | ||||
| 		extensions |= blackfriday.EXTENSION_HARD_LINE_BREAK | ||||
| 	} | ||||
|  | ||||
| 	body = blackfriday.Markdown(body, renderer, extensions) | ||||
| 	return body | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	// MarkupName describes markup's name | ||||
| 	MarkupName = "markdown" | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	markup.RegisterParser(Parser{}) | ||||
| } | ||||
|  | ||||
| // Parser implements markup.Parser | ||||
| type Parser struct { | ||||
| } | ||||
|  | ||||
| // Name implements markup.Parser | ||||
| func (Parser) Name() string { | ||||
| 	return MarkupName | ||||
| } | ||||
|  | ||||
| // Extensions implements markup.Parser | ||||
| func (Parser) Extensions() []string { | ||||
| 	return setting.Markdown.FileExtensions | ||||
| } | ||||
|  | ||||
| // Render implements markup.Parser | ||||
| func (Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte { | ||||
| 	return RenderRaw(rawBytes, urlPrefix, isWiki) | ||||
| } | ||||
|  | ||||
| // Render renders Markdown to HTML with all specific handling stuff. | ||||
| func Render(rawBytes []byte, urlPrefix string, metas map[string]string) []byte { | ||||
| 	return markup.Render("a.md", rawBytes, urlPrefix, metas) | ||||
| } | ||||
|  | ||||
| // RenderString renders Markdown to HTML with special links and returns string type. | ||||
| func RenderString(raw, urlPrefix string, metas map[string]string) string { | ||||
| 	return markup.RenderString("a.md", raw, urlPrefix, metas) | ||||
| } | ||||
|  | ||||
| // RenderWiki renders markdown wiki page to HTML and return HTML string | ||||
| func RenderWiki(rawBytes []byte, urlPrefix string, metas map[string]string) string { | ||||
| 	return markup.RenderWiki("a.md", rawBytes, urlPrefix, metas) | ||||
| } | ||||
|  | ||||
| // IsMarkdownFile reports whether name looks like a Markdown file | ||||
| // based on its extension. | ||||
| func IsMarkdownFile(name string) bool { | ||||
| 	return markup.IsMarkupFile(name, MarkupName) | ||||
| } | ||||
							
								
								
									
										302
									
								
								modules/markup/markdown/markdown_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										302
									
								
								modules/markup/markdown/markdown_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,302 @@ | ||||
| // Copyright 2017 The Gitea 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 markdown_test | ||||
|  | ||||
| import ( | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/markup" | ||||
| 	. "code.gitea.io/gitea/modules/markup/markdown" | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| const AppURL = "http://localhost:3000/" | ||||
| const Repo = "gogits/gogs" | ||||
| const AppSubURL = AppURL + Repo + "/" | ||||
|  | ||||
| func TestRender_StandardLinks(t *testing.T) { | ||||
| 	setting.AppURL = AppURL | ||||
| 	setting.AppSubURL = AppSubURL | ||||
|  | ||||
| 	test := func(input, expected, expectedWiki string) { | ||||
| 		buffer := RenderString(input, setting.AppSubURL, nil) | ||||
| 		assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(string(buffer))) | ||||
| 		bufferWiki := RenderWiki([]byte(input), setting.AppSubURL, nil) | ||||
| 		assert.Equal(t, strings.TrimSpace(expectedWiki), strings.TrimSpace(bufferWiki)) | ||||
| 	} | ||||
|  | ||||
| 	googleRendered := `<p><a href="https://google.com/" rel="nofollow">https://google.com/</a></p>` | ||||
| 	test("<https://google.com/>", googleRendered, googleRendered) | ||||
|  | ||||
| 	lnk := markup.URLJoin(AppSubURL, "WikiPage") | ||||
| 	lnkWiki := markup.URLJoin(AppSubURL, "wiki", "WikiPage") | ||||
| 	test("[WikiPage](WikiPage)", | ||||
| 		`<p><a href="`+lnk+`" rel="nofollow">WikiPage</a></p>`, | ||||
| 		`<p><a href="`+lnkWiki+`" rel="nofollow">WikiPage</a></p>`) | ||||
| } | ||||
|  | ||||
| func TestRender_ShortLinks(t *testing.T) { | ||||
| 	setting.AppURL = AppURL | ||||
| 	setting.AppSubURL = AppSubURL | ||||
| 	tree := markup.URLJoin(AppSubURL, "src", "master") | ||||
|  | ||||
| 	test := func(input, expected, expectedWiki string) { | ||||
| 		buffer := RenderString(input, tree, nil) | ||||
| 		assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(string(buffer))) | ||||
| 		buffer = RenderWiki([]byte(input), setting.AppSubURL, nil) | ||||
| 		assert.Equal(t, strings.TrimSpace(expectedWiki), strings.TrimSpace(string(buffer))) | ||||
| 	} | ||||
|  | ||||
| 	rawtree := markup.URLJoin(AppSubURL, "raw", "master") | ||||
| 	url := markup.URLJoin(tree, "Link") | ||||
| 	otherUrl := markup.URLJoin(tree, "OtherLink") | ||||
| 	imgurl := markup.URLJoin(rawtree, "Link.jpg") | ||||
| 	urlWiki := markup.URLJoin(AppSubURL, "wiki", "Link") | ||||
| 	otherUrlWiki := markup.URLJoin(AppSubURL, "wiki", "OtherLink") | ||||
| 	imgurlWiki := markup.URLJoin(AppSubURL, "wiki", "raw", "Link.jpg") | ||||
| 	favicon := "http://google.com/favicon.ico" | ||||
|  | ||||
| 	test( | ||||
| 		"[[Link]]", | ||||
| 		`<p><a href="`+url+`" rel="nofollow">Link</a></p>`, | ||||
| 		`<p><a href="`+urlWiki+`" rel="nofollow">Link</a></p>`) | ||||
| 	test( | ||||
| 		"[[Link.jpg]]", | ||||
| 		`<p><a href="`+imgurl+`" rel="nofollow"><img src="`+imgurl+`" alt="Link.jpg" title="Link.jpg"/></a></p>`, | ||||
| 		`<p><a href="`+imgurlWiki+`" rel="nofollow"><img src="`+imgurlWiki+`" alt="Link.jpg" title="Link.jpg"/></a></p>`) | ||||
| 	test( | ||||
| 		"[["+favicon+"]]", | ||||
| 		`<p><a href="`+favicon+`" rel="nofollow"><img src="`+favicon+`" title="favicon.ico"/></a></p>`, | ||||
| 		`<p><a href="`+favicon+`" rel="nofollow"><img src="`+favicon+`" title="favicon.ico"/></a></p>`) | ||||
| 	test( | ||||
| 		"[[Name|Link]]", | ||||
| 		`<p><a href="`+url+`" rel="nofollow">Name</a></p>`, | ||||
| 		`<p><a href="`+urlWiki+`" rel="nofollow">Name</a></p>`) | ||||
| 	test( | ||||
| 		"[[Name|Link.jpg]]", | ||||
| 		`<p><a href="`+imgurl+`" rel="nofollow"><img src="`+imgurl+`" alt="Name" title="Name"/></a></p>`, | ||||
| 		`<p><a href="`+imgurlWiki+`" rel="nofollow"><img src="`+imgurlWiki+`" alt="Name" title="Name"/></a></p>`) | ||||
| 	test( | ||||
| 		"[[Name|Link.jpg|alt=AltName]]", | ||||
| 		`<p><a href="`+imgurl+`" rel="nofollow"><img src="`+imgurl+`" alt="AltName" title="AltName"/></a></p>`, | ||||
| 		`<p><a href="`+imgurlWiki+`" rel="nofollow"><img src="`+imgurlWiki+`" alt="AltName" title="AltName"/></a></p>`) | ||||
| 	test( | ||||
| 		"[[Name|Link.jpg|title=Title]]", | ||||
| 		`<p><a href="`+imgurl+`" rel="nofollow"><img src="`+imgurl+`" alt="Title" title="Title"/></a></p>`, | ||||
| 		`<p><a href="`+imgurlWiki+`" rel="nofollow"><img src="`+imgurlWiki+`" alt="Title" title="Title"/></a></p>`) | ||||
| 	test( | ||||
| 		"[[Name|Link.jpg|alt=AltName|title=Title]]", | ||||
| 		`<p><a href="`+imgurl+`" rel="nofollow"><img src="`+imgurl+`" alt="AltName" title="Title"/></a></p>`, | ||||
| 		`<p><a href="`+imgurlWiki+`" rel="nofollow"><img src="`+imgurlWiki+`" alt="AltName" title="Title"/></a></p>`) | ||||
| 	test( | ||||
| 		"[[Name|Link.jpg|alt=\"AltName\"|title='Title']]", | ||||
| 		`<p><a href="`+imgurl+`" rel="nofollow"><img src="`+imgurl+`" alt="AltName" title="Title"/></a></p>`, | ||||
| 		`<p><a href="`+imgurlWiki+`" rel="nofollow"><img src="`+imgurlWiki+`" alt="AltName" title="Title"/></a></p>`) | ||||
| 	test( | ||||
| 		"[[Link]] [[OtherLink]]", | ||||
| 		`<p><a href="`+url+`" rel="nofollow">Link</a> <a href="`+otherUrl+`" rel="nofollow">OtherLink</a></p>`, | ||||
| 		`<p><a href="`+urlWiki+`" rel="nofollow">Link</a> <a href="`+otherUrlWiki+`" rel="nofollow">OtherLink</a></p>`) | ||||
| } | ||||
|  | ||||
| func TestMisc_IsMarkdownFile(t *testing.T) { | ||||
| 	setting.Markdown.FileExtensions = []string{".md", ".markdown", ".mdown", ".mkd"} | ||||
| 	trueTestCases := []string{ | ||||
| 		"test.md", | ||||
| 		"wow.MARKDOWN", | ||||
| 		"LOL.mDoWn", | ||||
| 	} | ||||
| 	falseTestCases := []string{ | ||||
| 		"test", | ||||
| 		"abcdefg", | ||||
| 		"abcdefghijklmnopqrstuvwxyz", | ||||
| 		"test.md.test", | ||||
| 	} | ||||
|  | ||||
| 	for _, testCase := range trueTestCases { | ||||
| 		assert.True(t, IsMarkdownFile(testCase)) | ||||
| 	} | ||||
| 	for _, testCase := range falseTestCases { | ||||
| 		assert.False(t, IsMarkdownFile(testCase)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestRender_Images(t *testing.T) { | ||||
| 	setting.AppURL = AppURL | ||||
| 	setting.AppSubURL = AppSubURL | ||||
|  | ||||
| 	test := func(input, expected string) { | ||||
| 		buffer := RenderString(input, setting.AppSubURL, nil) | ||||
| 		assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(string(buffer))) | ||||
| 	} | ||||
|  | ||||
| 	url := "../../.images/src/02/train.jpg" | ||||
| 	title := "Train" | ||||
| 	result := markup.URLJoin(AppSubURL, url) | ||||
|  | ||||
| 	test( | ||||
| 		"", | ||||
| 		`<p><a href="`+result+`" rel="nofollow"><img src="`+result+`" alt="`+title+`"></a></p>`) | ||||
|  | ||||
| 	test( | ||||
| 		"[["+title+"|"+url+"]]", | ||||
| 		`<p><a href="`+result+`" rel="nofollow"><img src="`+result+`" alt="`+title+`" title="`+title+`"/></a></p>`) | ||||
| } | ||||
|  | ||||
| func TestRegExp_ShortLinkPattern(t *testing.T) { | ||||
| 	trueTestCases := []string{ | ||||
| 		"[[stuff]]", | ||||
| 		"[[]]", | ||||
| 		"[[stuff|title=Difficult name with spaces*!]]", | ||||
| 	} | ||||
| 	falseTestCases := []string{ | ||||
| 		"test", | ||||
| 		"abcdefg", | ||||
| 		"[[]", | ||||
| 		"[[", | ||||
| 		"[]", | ||||
| 		"]]", | ||||
| 		"abcdefghijklmnopqrstuvwxyz", | ||||
| 	} | ||||
|  | ||||
| 	for _, testCase := range trueTestCases { | ||||
| 		assert.True(t, markup.ShortLinkPattern.MatchString(testCase)) | ||||
| 	} | ||||
| 	for _, testCase := range falseTestCases { | ||||
| 		assert.False(t, markup.ShortLinkPattern.MatchString(testCase)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func testAnswers(baseURLContent, baseURLImages string) []string { | ||||
| 	return []string{ | ||||
| 		`<p>Wiki! Enjoy :)</p> | ||||
|  | ||||
| <ul> | ||||
| <li><a href="` + baseURLContent + `/Links" rel="nofollow">Links, Language bindings, Engine bindings</a></li> | ||||
| <li><a href="` + baseURLContent + `/Tips" rel="nofollow">Tips</a></li> | ||||
| </ul> | ||||
|  | ||||
| <p>Ideas and codes</p> | ||||
|  | ||||
| <ul> | ||||
| <li>Bezier widget (by <a href="` + AppURL + `r-lyeh" rel="nofollow">@r-lyeh</a>) <a href="http://localhost:3000/ocornut/imgui/issues/786" rel="nofollow">#786</a></li> | ||||
| <li>Node graph editors https://github.com/ocornut/imgui/issues/306</li> | ||||
| <li><a href="` + baseURLContent + `/memory_editor_example" rel="nofollow">Memory Editor</a></li> | ||||
| <li><a href="` + baseURLContent + `/plot_var_example" rel="nofollow">Plot var helper</a></li> | ||||
| </ul> | ||||
| `, | ||||
| 		`<h2>What is Wine Staging?</h2> | ||||
|  | ||||
| <p><strong>Wine Staging</strong> on website <a href="http://wine-staging.com" rel="nofollow">wine-staging.com</a>.</p> | ||||
|  | ||||
| <h2>Quick Links</h2> | ||||
|  | ||||
| <p>Here are some links to the most important topics. You can find the full list of pages at the sidebar.</p> | ||||
|  | ||||
| <table> | ||||
| <thead> | ||||
| <tr> | ||||
| <th><a href="` + baseURLImages + `/images/icon-install.png" rel="nofollow"><img src="` + baseURLImages + `/images/icon-install.png" alt="images/icon-install.png" title="icon-install.png"/></a></th> | ||||
| <th><a href="` + baseURLContent + `/Installation" rel="nofollow">Installation</a></th> | ||||
| </tr> | ||||
| </thead> | ||||
|  | ||||
| <tbody> | ||||
| <tr> | ||||
| <td><a href="` + baseURLImages + `/images/icon-usage.png" rel="nofollow"><img src="` + baseURLImages + `/images/icon-usage.png" alt="images/icon-usage.png" title="icon-usage.png"/></a></td> | ||||
| <td><a href="` + baseURLContent + `/Usage" rel="nofollow">Usage</a></td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| `, | ||||
| 		`<p><a href="http://www.excelsiorjet.com/" rel="nofollow">Excelsior JET</a> allows you to create native executables for Windows, Linux and Mac OS X.</p> | ||||
|  | ||||
| <ol> | ||||
| <li><a href="https://github.com/libgdx/libgdx/wiki/Gradle-on-the-Commandline#packaging-for-the-desktop" rel="nofollow">Package your libGDX application</a> | ||||
| <a href="` + baseURLImages + `/images/1.png" rel="nofollow"><img src="` + baseURLImages + `/images/1.png" alt="images/1.png" title="1.png"/></a></li> | ||||
| <li>Perform a test run by hitting the Run! button. | ||||
| <a href="` + baseURLImages + `/images/2.png" rel="nofollow"><img src="` + baseURLImages + `/images/2.png" alt="images/2.png" title="2.png"/></a></li> | ||||
| </ol> | ||||
| `, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Test cases without ambiguous links | ||||
| var sameCases = []string{ | ||||
| 	// dear imgui wiki markdown extract: special wiki syntax | ||||
| 	`Wiki! Enjoy :) | ||||
| - [[Links, Language bindings, Engine bindings|Links]] | ||||
| - [[Tips]] | ||||
|  | ||||
| Ideas and codes | ||||
|  | ||||
| - Bezier widget (by @r-lyeh) ` + AppURL + `ocornut/imgui/issues/786 | ||||
| - Node graph editors https://github.com/ocornut/imgui/issues/306 | ||||
| - [[Memory Editor|memory_editor_example]] | ||||
| - [[Plot var helper|plot_var_example]]`, | ||||
| 	// wine-staging wiki home extract: tables, special wiki syntax, images | ||||
| 	`## What is Wine Staging? | ||||
| **Wine Staging** on website [wine-staging.com](http://wine-staging.com). | ||||
|  | ||||
| ## Quick Links | ||||
| Here are some links to the most important topics. You can find the full list of pages at the sidebar. | ||||
|  | ||||
| | [[images/icon-install.png]]    | [[Installation]]                                         | | ||||
| |--------------------------------|----------------------------------------------------------| | ||||
| | [[images/icon-usage.png]]      | [[Usage]]                                                | | ||||
| `, | ||||
| 	// libgdx wiki page: inline images with special syntax | ||||
| 	`[Excelsior JET](http://www.excelsiorjet.com/) allows you to create native executables for Windows, Linux and Mac OS X. | ||||
|  | ||||
| 1. [Package your libGDX application](https://github.com/libgdx/libgdx/wiki/Gradle-on-the-Commandline#packaging-for-the-desktop) | ||||
| [[images/1.png]] | ||||
| 2. Perform a test run by hitting the Run! button. | ||||
| [[images/2.png]]`, | ||||
| } | ||||
|  | ||||
| func TestTotal_RenderWiki(t *testing.T) { | ||||
| 	answers := testAnswers(markup.URLJoin(AppSubURL, "wiki/"), markup.URLJoin(AppSubURL, "wiki", "raw/")) | ||||
|  | ||||
| 	for i := 0; i < len(sameCases); i++ { | ||||
| 		line := RenderWiki([]byte(sameCases[i]), AppSubURL, nil) | ||||
| 		assert.Equal(t, answers[i], line) | ||||
| 	} | ||||
|  | ||||
| 	testCases := []string{ | ||||
| 		// Guard wiki sidebar: special syntax | ||||
| 		`[[Guardfile-DSL / Configuring-Guard|Guardfile-DSL---Configuring-Guard]]`, | ||||
| 		// rendered | ||||
| 		`<p><a href="` + AppSubURL + `wiki/Guardfile-DSL---Configuring-Guard" rel="nofollow">Guardfile-DSL / Configuring-Guard</a></p> | ||||
| `, | ||||
| 		// special syntax | ||||
| 		`[[Name|Link]]`, | ||||
| 		// rendered | ||||
| 		`<p><a href="` + AppSubURL + `wiki/Link" rel="nofollow">Name</a></p> | ||||
| `, | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < len(testCases); i += 2 { | ||||
| 		line := RenderWiki([]byte(testCases[i]), AppSubURL, nil) | ||||
| 		assert.Equal(t, testCases[i+1], line) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestTotal_RenderString(t *testing.T) { | ||||
| 	answers := testAnswers(markup.URLJoin(AppSubURL, "src", "master/"), markup.URLJoin(AppSubURL, "raw", "master/")) | ||||
|  | ||||
| 	for i := 0; i < len(sameCases); i++ { | ||||
| 		line := RenderString(sameCases[i], markup.URLJoin(AppSubURL, "src", "master/"), nil) | ||||
| 		assert.Equal(t, answers[i], line) | ||||
| 	} | ||||
|  | ||||
| 	testCases := []string{} | ||||
|  | ||||
| 	for i := 0; i < len(testCases); i += 2 { | ||||
| 		line := RenderString(testCases[i], AppSubURL, nil) | ||||
| 		assert.Equal(t, testCases[i+1], line) | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user