// Copyright 2017 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package markdown_test import ( "context" "html/template" "os" "strings" "testing" "code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/test" "code.gitea.io/gitea/modules/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) const ( AppURL = "http://localhost:3000/" FullURL = AppURL + "gogits/gogs/" ) // these values should match the const above var localMetas = map[string]string{ "user": "gogits", "repo": "gogs", "repoPath": "../../../tests/gitea-repositories-meta/user13/repo11.git/", } func TestMain(m *testing.M) { unittest.InitSettings() if err := git.InitSimple(context.Background()); err != nil { log.Fatal("git init failed, err: %v", err) } markup.Init(&markup.ProcessorHelper{ IsUsernameMentionable: func(ctx context.Context, username string) bool { return username == "r-lyeh" }, }) os.Exit(m.Run()) } func TestRender_StandardLinks(t *testing.T) { setting.AppURL = AppURL test := func(input, expected, expectedWiki string) { buffer, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, Links: markup.Links{ Base: FullURL, }, }, input) require.NoError(t, err) assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(string(buffer))) buffer, err = markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, Links: markup.Links{ Base: FullURL, }, IsWiki: true, }, input) require.NoError(t, err) assert.Equal(t, strings.TrimSpace(expectedWiki), strings.TrimSpace(string(buffer))) } googleRendered := `
` test("Wiki! Enjoy :)
See commit 65f1bf27bc
Ideas and codes
Wine Staging on website wine-staging.com.
Here are some links to the most important topics. You can find the full list of pages at the sidebar.
Installation | |
---|---|
Usage |
Excelsior JET allows you to create native executables for Windows, Linux and Mac OS X.
(from https://www.markdownguide.org/extended-syntax/)
Here is a simple footnote,1 and here is a longer one.2
This PR has been generated by Renovate Bot.
`, } } // 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]] See commit 65f1bf27bc Ideas and codes - Bezier widget (by @r-lyeh) ` + AppURL + `ocornut/imgui/issues/786 - Bezier widget (by @r-lyeh) ` + AppURL + `gogits/gogs/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]] ## More tests {#custom-id} (from https://www.markdownguide.org/extended-syntax/) ### Checkboxes - [ ] unchecked - [x] checked - [ ] still unchecked ### Definition list First Term : This is the definition of the first term. Second Term : This is one definition of the second term. : This is another definition of the second term. ### Footnotes Here is a simple footnote,[^1] and here is a longer one.[^bignote] [^1]: This is the first footnote. [^bignote]: Here is one with multiple paragraphs and code. Indent paragraphs to include them in the footnote. ` + "`{ my code }`" + ` Add as many paragraphs as you like. `, ` - [ ] If you want to rebase/retry this PR, click this checkbox. --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). `, } func TestTotal_RenderWiki(t *testing.T) { setting.AppURL = AppURL answers := testAnswers(util.URLJoin(FullURL, "wiki"), util.URLJoin(FullURL, "wiki", "raw")) for i := 0; i < len(sameCases); i++ { line, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, Links: markup.Links{ Base: FullURL, }, Metas: localMetas, IsWiki: true, }, sameCases[i]) require.NoError(t, err) assert.Equal(t, template.HTML(answers[i]), line) } testCases := []string{ // Guard wiki sidebar: special syntax `[[Guardfile-DSL / Configuring-Guard|Guardfile-DSL---Configuring-Guard]]`, // rendered `Guardfile-DSL / Configuring-Guard
`, // special syntax `[[Name|Link]]`, // rendered ` `, } for i := 0; i < len(testCases); i += 2 { line, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, Links: markup.Links{ Base: FullURL, }, IsWiki: true, }, testCases[i]) require.NoError(t, err) assert.Equal(t, template.HTML(testCases[i+1]), line) } } func TestTotal_RenderString(t *testing.T) { setting.AppURL = AppURL answers := testAnswers(util.URLJoin(FullURL, "src", "master"), util.URLJoin(FullURL, "media", "master")) for i := 0; i < len(sameCases); i++ { line, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, Links: markup.Links{ Base: FullURL, BranchPath: "master", }, Metas: localMetas, }, sameCases[i]) require.NoError(t, err) assert.Equal(t, template.HTML(answers[i]), line) } testCases := []string{} for i := 0; i < len(testCases); i += 2 { line, err := markdown.RenderString(&markup.RenderContext{ Ctx: git.DefaultContext, Links: markup.Links{ Base: FullURL, }, }, testCases[i]) require.NoError(t, err) assert.Equal(t, template.HTML(testCases[i+1]), line) } } func TestRender_RenderParagraphs(t *testing.T) { test := func(t *testing.T, str string, cnt int) { res, err := markdown.RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, str) require.NoError(t, err) assert.Equal(t, cnt, strings.Count(res, " ` res, err := markdown.RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase) require.NoError(t, err) assert.Equal(t, expected, res) } func TestRenderEmojiInLinks_Issue12331(t *testing.T) { testcase := `[Link with emoji :moon: in text](https://gitea.io)` expected := ` ` res, err := markdown.RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase) require.NoError(t, err) assert.Equal(t, template.HTML(expected), res) } func TestColorPreview(t *testing.T) { const nl = "\n" positiveTests := []struct { testcase string expected string }{ { // hex "`#FF0000`", `#FF0000
rgb(16, 32, 64)
This is the color white #000
HSL stands for hue, saturation, and lightness. An example: hsl(0, 100%, 50%)
.
HSL stands for hue, saturation, and lightness. An example: HSL(0, 100%, 50%)
.
a
` + nl,
},
{
"$ a $",
`a
a
b
a
b
a
.
.$a$
` + nl, }, { `$a a$b b$`, `$a a$b b$
` + nl, }, { `a a$b b`, `a a$b b
` + nl, }, { `a$b $a a$b b$`, `a$b $a a$b b$
` + nl, }, { "a$x$", `a$x$
` + nl, }, { "$x$a", `$x$a
` + nl, }, { "$$a$$", `a
` + nl,
},
{
`\[a b\]`,
`a b
` + nl,
},
{
`\[a b]`,
`[a b]
` + nl, }, { `$$a`, `$$a
` + nl, }, { "$a$ ($b$) [$c$] {$d$}", `a
(b
) [$c$] {$d$}
a
test
test a
Citation needed1.
Source âŠī¸
Citation needed[^0]
`, }, { `Citation needed[^1], Citation needed twice[^3] [^3]: Source`, `Citation needed[^1], Citation needed twice1
Source âŠī¸
Citation needed[^0]
`, }, { `Citation needed[^0] [^0]: Source 1 [^0]: Source 2`, `Citation needed1
Source 1 âŠī¸
Citation needed1
Source âŠī¸
Trigger [^
`, }, { `Trigger 2 [^0`, `Trigger 2 [^0
`, }, { `Citation needed[^0] [^0]: Source with citation needed[^1] [^1]: Source`, `Citation needed1
`, }, { `Citation needed[^#] [^#]: Source`, `Citation needed1
Source âŠī¸
Citation needed[^0]
[^0]: Source
Citation needed1.
Source âŠī¸
Citation needed[^]
[^]: Source
Citation needed[^0]
[^0] Source
Citation needed[^0]
[^0 Source
Citation needed[^0] [^0]: Source
`, }, { `Citation needed[^Source here 0 # 9-3] [^Source here 0 # 9-3]: Source`, `Citation needed1
Source âŠī¸
Citation needed1
`, }, } for _, test := range testcases { res, err := markdown.RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, test.testcase) require.NoError(t, err, "Unexpected error in testcase: %q", test.testcase) assert.Equal(t, test.expected, string(res), "Unexpected result in testcase %q", test.testcase) } } func TestTaskList(t *testing.T) { testcases := []struct { testcase string expected string }{ { // data-source-position should take into account YAML frontmatter. `--- foo: bar --- - [ ] task 1`, `foo |
---|
bar |
space @mention-user
/just/a/path.bin
https://example.com/file.bin
local link
remote link
local link
remote link
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
đ
mail@domain.com
@mention-user test
#123
space
space @mention-user
/just/a/path.bin
https://example.com/file.bin
local link
remote link
local link
remote link
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
đ
mail@domain.com
@mention-user test
#123
space
space @mention-user
/just/a/path.bin
https://example.com/file.bin
local link
remote link
local link
remote link
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
đ
mail@domain.com
@mention-user test
#123
space
space @mention-user
/just/a/path.bin
https://example.com/file.bin
local link
remote link
local link
remote link
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
đ
mail@domain.com
@mention-user test
#123
space
space @mention-user
/just/a/path.bin
https://example.com/file.bin
local link
remote link
local link
remote link
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
đ
mail@domain.com
@mention-user test
#123
space
space @mention-user
/just/a/path.bin
https://example.com/file.bin
local link
remote link
local link
remote link
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
đ
mail@domain.com
@mention-user test
#123
space
space @mention-user
/just/a/path.bin
https://example.com/file.bin
local link
remote link
local link
remote link
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
đ
mail@domain.com
@mention-user test
#123
space
space @mention-user
/just/a/path.bin
https://example.com/file.bin
local link
remote link
local link
remote link
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
đ
mail@domain.com
@mention-user test
#123
space
space @mention-user
/just/a/path.bin
https://example.com/file.bin
local link
remote link
local link
remote link
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
đ
mail@domain.com
@mention-user test
#123
space
space @mention-user
/just/a/path.bin
https://example.com/file.bin
local link
remote link
local link
remote link
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
đ
mail@domain.com
@mention-user test
#123
space
space @mention-user
/just/a/path.bin
https://example.com/file.bin
local link
remote link
local link
remote link
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
đ
mail@domain.com
@mention-user test
#123
space
space @mention-user
/just/a/path.bin
https://example.com/file.bin
local link
remote link
local link
remote link
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
đ
mail@domain.com
@mention-user test
#123
space
include_toc |
---|
true |
key |
---|
value |
gitea | ||||
---|---|---|---|---|
|
gitea | key | ||
---|---|---|---|
|
value |
\n\n
0
") test("> **Warning**\n> Bad stuff is brewing here", ``) test("> [!WARNING]\n> Bad stuff is brewing here", `Warning
Bad stuff is brewing here
`) }Warning
Bad stuff is brewing here