| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- // Copyright 2024 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package markdown
-
- import (
- "strings"
- "testing"
-
- "code.gitea.io/gitea/modules/markup"
- "code.gitea.io/gitea/modules/setting"
- "code.gitea.io/gitea/modules/test"
-
- "github.com/stretchr/testify/assert"
- )
-
- const nl = "\n"
-
- func TestMathRender(t *testing.T) {
- setting.Markdown.MathCodeBlockOptions = setting.MarkdownMathCodeBlockOptions{ParseInlineDollar: true, ParseInlineParentheses: true}
- testcases := []struct {
- testcase string
- expected string
- }{
- {
- "$a$",
- `<p><code class="language-math">a</code></p>` + nl,
- },
- {
- "$ a $",
- `<p><code class="language-math">a</code></p>` + nl,
- },
- {
- "$a$ $b$",
- `<p><code class="language-math">a</code> <code class="language-math">b</code></p>` + nl,
- },
- {
- `\(a\) \(b\)`,
- `<p><code class="language-math">a</code> <code class="language-math">b</code></p>` + nl,
- },
- {
- `$a$.`,
- `<p><code class="language-math">a</code>.</p>` + nl,
- },
- {
- `.$a$`,
- `<p>.$a$</p>` + nl,
- },
- {
- `$a a$b b$`,
- `<p>$a a$b b$</p>` + nl,
- },
- {
- `a a$b b`,
- `<p>a a$b b</p>` + nl,
- },
- {
- `a$b $a a$b b$`,
- `<p>a$b $a a$b b$</p>` + nl,
- },
- {
- "a$x$",
- `<p>a$x$</p>` + nl,
- },
- {
- "$x$a",
- `<p>$x$a</p>` + nl,
- },
- {
- "$a$ ($b$) [$c$] {$d$}",
- `<p><code class="language-math">a</code> (<code class="language-math">b</code>) [$c$] {$d$}</p>` + nl,
- },
- {
- "$$a$$",
- `<p><code class="language-math">a</code></p>` + nl,
- },
- {
- "$$a$$ test",
- `<p><code class="language-math">a</code> test</p>` + nl,
- },
- {
- "test $$a$$",
- `<p>test <code class="language-math">a</code></p>` + nl,
- },
- {
- `foo $x=\$$ bar`,
- `<p>foo <code class="language-math">x=\$</code> bar</p>` + nl,
- },
- {
- `$\text{$b$}$`,
- `<p><code class="language-math">\text{$b$}</code></p>` + nl,
- },
- {
- "a$`b`$c",
- `<p>a<code class="language-math">b</code>c</p>` + nl,
- },
- {
- "a $`b`$ c",
- `<p>a <code class="language-math">b</code> c</p>` + nl,
- },
- {
- "a$``b``$c x$```y```$z",
- `<p>a<code class="language-math">b</code>c x<code class="language-math">y</code>z</p>` + nl,
- },
- }
-
- for _, test := range testcases {
- t.Run(test.testcase, func(t *testing.T) {
- res, err := RenderString(markup.NewTestRenderContext(), test.testcase)
- assert.NoError(t, err)
- assert.Equal(t, test.expected, string(res))
- })
- }
- }
-
- func TestMathRenderBlockIndent(t *testing.T) {
- setting.Markdown.MathCodeBlockOptions = setting.MarkdownMathCodeBlockOptions{ParseBlockDollar: true, ParseBlockSquareBrackets: true}
- testcases := []struct {
- name string
- testcase string
- expected string
- }{
- {
- "indent-0",
- `
- \[
- \alpha
- \]
- `,
- `<pre class="code-block is-loading"><code class="language-math display">
- \alpha
- </code></pre>
- `,
- },
- {
- "indent-1",
- `
- \[
- \alpha
- \]
- `,
- `<pre class="code-block is-loading"><code class="language-math display">
- \alpha
- </code></pre>
- `,
- },
- {
- "indent-2-mismatch",
- `
- \[
- a
- b
- c
- d
- \]
- `,
- `<pre class="code-block is-loading"><code class="language-math display">
- a
- b
- c
- d
- </code></pre>
- `,
- },
- {
- "indent-2",
- `
- \[
- a
- b
- c
- \]
- `,
- `<pre class="code-block is-loading"><code class="language-math display">
- a
- b
- c
- </code></pre>
- `,
- },
- {
- "indent-0-oneline",
- `$$ x $$
- foo`,
- `<code class="language-math display"> x </code>
- <p>foo</p>
- `,
- },
- {
- "indent-3-oneline",
- ` $$ x $$<SPACE>
- foo`,
- `<code class="language-math display"> x </code>
- <p>foo</p>
- `,
- },
- {
- "quote-block",
- `
- > \[
- > a
- > \]
- > \[
- > b
- > \]
- `,
- `<blockquote>
- <pre class="code-block is-loading"><code class="language-math display">
- a
- </code></pre>
- <pre class="code-block is-loading"><code class="language-math display">
- b
- </code></pre>
- </blockquote>
- `,
- },
- {
- "list-block",
- `
- 1. a
- \[
- x
- \]
- 2. b`,
- `<ol>
- <li>a
- <pre class="code-block is-loading"><code class="language-math display">
- x
- </code></pre>
- </li>
- <li>b</li>
- </ol>
- `,
- },
- {
- "inline-non-math",
- `\[x]`,
- `<p>[x]</p>` + nl,
- },
- }
-
- for _, test := range testcases {
- t.Run(test.name, func(t *testing.T) {
- res, err := RenderString(markup.NewTestRenderContext(), strings.ReplaceAll(test.testcase, "<SPACE>", " "))
- assert.NoError(t, err)
- assert.Equal(t, test.expected, string(res), "unexpected result for test case:\n%s", test.testcase)
- })
- }
- }
-
- func TestMathRenderOptions(t *testing.T) {
- setting.Markdown.MathCodeBlockOptions = setting.MarkdownMathCodeBlockOptions{}
- defer test.MockVariableValue(&setting.Markdown.MathCodeBlockOptions)
- test := func(t *testing.T, expected, input string) {
- res, err := RenderString(markup.NewTestRenderContext(), input)
- assert.NoError(t, err)
- assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(string(res)), "input: %s", input)
- }
-
- // default (non-conflict) inline syntax
- test(t, `<p><code class="language-math">a</code></p>`, "$`a`$")
-
- // ParseInlineDollar
- test(t, `<p>$a$</p>`, `$a$`)
- setting.Markdown.MathCodeBlockOptions.ParseInlineDollar = true
- test(t, `<p><code class="language-math">a</code></p>`, `$a$`)
-
- // ParseInlineParentheses
- test(t, `<p>(a)</p>`, `\(a\)`)
- setting.Markdown.MathCodeBlockOptions.ParseInlineParentheses = true
- test(t, `<p><code class="language-math">a</code></p>`, `\(a\)`)
-
- // ParseBlockDollar
- test(t, `<p>$$
- a
- $$</p>
- `, `
- $$
- a
- $$
- `)
- setting.Markdown.MathCodeBlockOptions.ParseBlockDollar = true
- test(t, `<pre class="code-block is-loading"><code class="language-math display">
- a
- </code></pre>
- `, `
- $$
- a
- $$
- `)
-
- // ParseBlockSquareBrackets
- test(t, `<p>[
- a
- ]</p>
- `, `
- \[
- a
- \]
- `)
- setting.Markdown.MathCodeBlockOptions.ParseBlockSquareBrackets = true
- test(t, `<pre class="code-block is-loading"><code class="language-math display">
- a
- </code></pre>
- `, `
- \[
- a
- \]
- `)
- }
|