mirror of
https://github.com/go-gitea/gitea.git
synced 2026-10-13 23:48:51 +00:00
Previously, recognition of escaped alert markers such as `\[!NOTE\]` accidentally depended on enabling the optional `inline-parentheses` math setting, resulting in such escaped alerts not rendering properly. Goldmark splits the escaped marker differently based on the setting being enabled or disabled, and only one form was handled. This commit handles both forms. For example, in a README or issue: ``` > \[!NOTE\] > text ``` Before this commit, we'd get an ordinary blockquote displaying literal `[!NOTE]` followed by `text`. With this commit, we get the styled admonition. Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
70 lines
2.8 KiB
Go
70 lines
2.8 KiB
Go
// Copyright 2024 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package markdown_test
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"gitea.dev/modules/markup"
|
|
"gitea.dev/modules/markup/markdown"
|
|
"gitea.dev/modules/setting"
|
|
"gitea.dev/modules/svg"
|
|
"gitea.dev/modules/test"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"golang.org/x/text/cases"
|
|
"golang.org/x/text/language"
|
|
)
|
|
|
|
func TestAttention(t *testing.T) {
|
|
defer svg.MockIcon("octicon-info")()
|
|
defer svg.MockIcon("octicon-light-bulb")()
|
|
defer svg.MockIcon("octicon-report")()
|
|
defer svg.MockIcon("octicon-alert")()
|
|
defer svg.MockIcon("octicon-stop")()
|
|
defer test.MockVariableValue(&setting.Markdown.MathCodeBlockOptions, setting.MarkdownMathCodeBlockOptions{})()
|
|
|
|
test := func(input, expected string) {
|
|
result, err := markdown.RenderString(markup.NewTestRenderContext(), input)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(string(result)))
|
|
}
|
|
renderAttention := func(attention, icon string) string {
|
|
tmpl := `<blockquote class="attention-header attention-{attention}"><p><svg class="attention-icon attention-{attention} svg {icon}" width="16" height="16"></svg><strong class="attention-{attention}">{Attention}</strong></p>`
|
|
tmpl = strings.ReplaceAll(tmpl, "{attention}", attention)
|
|
tmpl = strings.ReplaceAll(tmpl, "{icon}", icon)
|
|
tmpl = strings.ReplaceAll(tmpl, "{Attention}", cases.Title(language.English).String(attention))
|
|
return tmpl
|
|
}
|
|
|
|
test(`
|
|
> [!NOTE]
|
|
> text
|
|
`, renderAttention("note", "octicon-info")+"\n<p>text</p>\n</blockquote>")
|
|
|
|
test(`> [!note]`, renderAttention("note", "octicon-info")+"\n</blockquote>")
|
|
test(`> [!tip]`, renderAttention("tip", "octicon-light-bulb")+"\n</blockquote>")
|
|
test(`> [!important]`, renderAttention("important", "octicon-report")+"\n</blockquote>")
|
|
test(`> [!warning]`, renderAttention("warning", "octicon-alert")+"\n</blockquote>")
|
|
test(`> [!caution]`, renderAttention("caution", "octicon-stop")+"\n</blockquote>")
|
|
|
|
for _, parseInlineParentheses := range []bool{false, true} {
|
|
setting.Markdown.MathCodeBlockOptions.ParseInlineParentheses = parseInlineParentheses
|
|
test("> \\[!NOTE\\]\n> text", renderAttention("note", "octicon-info")+"\n<p>text</p>\n</blockquote>")
|
|
test(`> \[!UNKNOWN\]`, "<blockquote>\n<p>[!UNKNOWN]</p>\n</blockquote>")
|
|
test(`> \[NOTE\]`, "<blockquote>\n<p>[NOTE]</p>\n</blockquote>")
|
|
test(`> \[!NOTE`, "<blockquote>\n<p>[!NOTE</p>\n</blockquote>")
|
|
test(`> [!NOTE\]`, "<blockquote>\n<p>[!NOTE]</p>\n</blockquote>")
|
|
test("> \\[!\n> NOTE\\]", "<blockquote>\n<p>[!\nNOTE]</p>\n</blockquote>")
|
|
test("> \\[\n> !NOTE\\]", "<blockquote>\n<p>[\n!NOTE]</p>\n</blockquote>")
|
|
}
|
|
|
|
// legacy GitHub style
|
|
test(`> **warning**`, renderAttention("warning", "octicon-alert")+"\n</blockquote>")
|
|
|
|
// edge case (it used to cause panic)
|
|
test(">\ntext", "<blockquote>\n</blockquote>\n<p>text</p>")
|
|
}
|