mirror of
https://github.com/go-gitea/gitea.git
synced 2026-09-09 06:23:24 +09:00
Backport #38642 Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: TheFox0x7 <thefox0x7@gmail.com> Co-authored-by: bircni <bircni@icloud.com>
This commit is contained in:
co-authored by
wxiaoguang
TheFox0x7
bircni
parent
f47e3d930d
commit
ccd38f9a70
@@ -70,7 +70,15 @@ func Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error
|
|||||||
w := &orgWriter{rctx: ctx, HTMLWriter: htmlWriter}
|
w := &orgWriter{rctx: ctx, HTMLWriter: htmlWriter}
|
||||||
htmlWriter.ExtendingWriter = w
|
htmlWriter.ExtendingWriter = w
|
||||||
|
|
||||||
res, err := org.New().Silent().Parse(input, "").Write(w)
|
cfg := org.New()
|
||||||
|
cfg.ReadFile = func(path string) ([]byte, error) {
|
||||||
|
// actually the orgmode render doesn't support rendering the content from the content again,
|
||||||
|
// so just leave the plain text to end users
|
||||||
|
content := fmt.Sprintf("#+INCLUDE: [[%s]]", path)
|
||||||
|
return []byte(content), nil
|
||||||
|
}
|
||||||
|
doc := cfg.Silent().Parse(input, "")
|
||||||
|
res, err := doc.Write(w)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("orgmode.Render failed: %w", err)
|
return fmt.Errorf("orgmode.Render failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,86 +21,74 @@ func TestMain(m *testing.M) {
|
|||||||
os.Exit(m.Run())
|
os.Exit(m.Run())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRender_StandardLinks(t *testing.T) {
|
func testRender(t *testing.T, input, expected string) {
|
||||||
test := func(input, expected string) {
|
buffer, err := orgmode.RenderString(markup.NewTestRenderContext(), input)
|
||||||
buffer, err := orgmode.RenderString(markup.NewTestRenderContext(), input)
|
assert.NoError(t, err)
|
||||||
assert.NoError(t, err)
|
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
|
||||||
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
|
}
|
||||||
}
|
|
||||||
|
|
||||||
test("[[https://google.com/]]",
|
func TestRender_StandardLinks(t *testing.T) {
|
||||||
|
testRender(t, "[[https://google.com/]]",
|
||||||
`<p><a href="https://google.com/">https://google.com/</a></p>`)
|
`<p><a href="https://google.com/">https://google.com/</a></p>`)
|
||||||
test("[[ImageLink.svg][The Image Desc]]",
|
testRender(t, "[[ImageLink.svg][The Image Desc]]",
|
||||||
`<p><a href="ImageLink.svg">The Image Desc</a></p>`)
|
`<p><a href="ImageLink.svg">The Image Desc</a></p>`)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRender_InternalLinks(t *testing.T) {
|
func TestRender_InternalLinks(t *testing.T) {
|
||||||
test := func(input, expected string) {
|
testRender(t, "[[file:test.org][Test]]",
|
||||||
buffer, err := orgmode.RenderString(markup.NewTestRenderContext(), input)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
|
|
||||||
}
|
|
||||||
|
|
||||||
test("[[file:test.org][Test]]",
|
|
||||||
`<p><a href="test.org">Test</a></p>`)
|
`<p><a href="test.org">Test</a></p>`)
|
||||||
test("[[./test.org][Test]]",
|
testRender(t, "[[./test.org][Test]]",
|
||||||
`<p><a href="./test.org">Test</a></p>`)
|
`<p><a href="./test.org">Test</a></p>`)
|
||||||
test("[[test.org][Test]]",
|
testRender(t, "[[test.org][Test]]",
|
||||||
`<p><a href="test.org">Test</a></p>`)
|
`<p><a href="test.org">Test</a></p>`)
|
||||||
test("[[path/to/test.org][Test]]",
|
testRender(t, "[[path/to/test.org][Test]]",
|
||||||
`<p><a href="path/to/test.org">Test</a></p>`)
|
`<p><a href="path/to/test.org">Test</a></p>`)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRender_Media(t *testing.T) {
|
func TestRender_Media(t *testing.T) {
|
||||||
test := func(input, expected string) {
|
testRender(t, "[[file:../../.images/src/02/train.jpg]]",
|
||||||
buffer, err := orgmode.RenderString(markup.NewTestRenderContext(), input)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
|
|
||||||
}
|
|
||||||
|
|
||||||
test("[[file:../../.images/src/02/train.jpg]]",
|
|
||||||
`<p><img src="../../.images/src/02/train.jpg" alt="../../.images/src/02/train.jpg"></p>`)
|
`<p><img src="../../.images/src/02/train.jpg" alt="../../.images/src/02/train.jpg"></p>`)
|
||||||
test("[[file:train.jpg]]",
|
testRender(t, "[[file:train.jpg]]",
|
||||||
`<p><img src="train.jpg" alt="train.jpg"></p>`)
|
`<p><img src="train.jpg" alt="train.jpg"></p>`)
|
||||||
|
|
||||||
// With description.
|
// With description.
|
||||||
test("[[https://example.com][https://example.com/example.svg]]",
|
testRender(t, "[[https://example.com][https://example.com/example.svg]]",
|
||||||
`<p><a href="https://example.com"><img src="https://example.com/example.svg" alt="https://example.com/example.svg"></a></p>`)
|
`<p><a href="https://example.com"><img src="https://example.com/example.svg" alt="https://example.com/example.svg"></a></p>`)
|
||||||
test("[[https://example.com][pre https://example.com/example.svg post]]",
|
testRender(t, "[[https://example.com][pre https://example.com/example.svg post]]",
|
||||||
`<p><a href="https://example.com">pre <img src="https://example.com/example.svg" alt="https://example.com/example.svg"> post</a></p>`)
|
`<p><a href="https://example.com">pre <img src="https://example.com/example.svg" alt="https://example.com/example.svg"> post</a></p>`)
|
||||||
test("[[https://example.com][https://example.com/example.mp4]]",
|
testRender(t, "[[https://example.com][https://example.com/example.mp4]]",
|
||||||
`<p><a href="https://example.com"><video src="https://example.com/example.mp4">https://example.com/example.mp4</video></a></p>`)
|
`<p><a href="https://example.com"><video src="https://example.com/example.mp4">https://example.com/example.mp4</video></a></p>`)
|
||||||
test("[[https://example.com][pre https://example.com/example.mp4 post]]",
|
testRender(t, "[[https://example.com][pre https://example.com/example.mp4 post]]",
|
||||||
`<p><a href="https://example.com">pre <video src="https://example.com/example.mp4">https://example.com/example.mp4</video> post</a></p>`)
|
`<p><a href="https://example.com">pre <video src="https://example.com/example.mp4">https://example.com/example.mp4</video> post</a></p>`)
|
||||||
|
|
||||||
// Without description.
|
// Without description.
|
||||||
test("[[https://example.com/example.svg]]",
|
testRender(t, "[[https://example.com/example.svg]]",
|
||||||
`<p><img src="https://example.com/example.svg" alt="https://example.com/example.svg"></p>`)
|
`<p><img src="https://example.com/example.svg" alt="https://example.com/example.svg"></p>`)
|
||||||
test("[[https://example.com/example.mp4]]",
|
testRender(t, "[[https://example.com/example.mp4]]",
|
||||||
`<p><video src="https://example.com/example.mp4">https://example.com/example.mp4</video></p>`)
|
`<p><video src="https://example.com/example.mp4">https://example.com/example.mp4</video></p>`)
|
||||||
|
|
||||||
// test [[LINK][DESCRIPTION]] syntax with "file:" prefix
|
// test [[LINK][DESCRIPTION]] syntax with "file:" prefix
|
||||||
test(`[[https://example.com/][file:https://example.com/foo%20bar.svg]]`,
|
testRender(t, `[[https://example.com/][file:https://example.com/foo%20bar.svg]]`,
|
||||||
`<p><a href="https://example.com/"><img src="https://example.com/foo%20bar.svg" alt="https://example.com/foo%20bar.svg"></a></p>`)
|
`<p><a href="https://example.com/"><img src="https://example.com/foo%20bar.svg" alt="https://example.com/foo%20bar.svg"></a></p>`)
|
||||||
test(`[[file:https://example.com/foo%20bar.svg][Goto Image]]`,
|
testRender(t, `[[file:https://example.com/foo%20bar.svg][Goto Image]]`,
|
||||||
`<p><a href="https://example.com/foo%20bar.svg">Goto Image</a></p>`)
|
`<p><a href="https://example.com/foo%20bar.svg">Goto Image</a></p>`)
|
||||||
test(`[[file:https://example.com/link][https://example.com/image.jpg]]`,
|
testRender(t, `[[file:https://example.com/link][https://example.com/image.jpg]]`,
|
||||||
`<p><a href="https://example.com/link"><img src="https://example.com/image.jpg" alt="https://example.com/image.jpg"></a></p>`)
|
`<p><a href="https://example.com/link"><img src="https://example.com/image.jpg" alt="https://example.com/image.jpg"></a></p>`)
|
||||||
test(`[[file:https://example.com/link][file:https://example.com/image.jpg]]`,
|
testRender(t, `[[file:https://example.com/link][file:https://example.com/image.jpg]]`,
|
||||||
`<p><a href="https://example.com/link"><img src="https://example.com/image.jpg" alt="https://example.com/image.jpg"></a></p>`)
|
`<p><a href="https://example.com/link"><img src="https://example.com/image.jpg" alt="https://example.com/image.jpg"></a></p>`)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRender_Source(t *testing.T) {
|
func TestRender_Source(t *testing.T) {
|
||||||
test := func(input, expected string) {
|
testRender(t, `#+begin_src c
|
||||||
buffer, err := orgmode.RenderString(markup.NewTestRenderContext(), input)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
|
|
||||||
}
|
|
||||||
|
|
||||||
test(`#+begin_src c
|
|
||||||
int a;
|
int a;
|
||||||
#+end_src
|
#+end_src
|
||||||
`, `<div class="src src-c">
|
`, `<div class="src src-c">
|
||||||
<pre><code class="chroma language-c"><span class="kt">int</span> <span class="n">a</span><span class="p">;</span></code></pre>
|
<pre><code class="chroma language-c"><span class="kt">int</span> <span class="n">a</span><span class="p">;</span></code></pre>
|
||||||
</div>`)
|
</div>`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRender_IncludeLink(t *testing.T) {
|
||||||
|
testRender(t, `#+INCLUDE: "./other.org" src text`, `<div class="src src-text">
|
||||||
|
<pre><code class="chroma language-plaintext">#+INCLUDE: [[other.org]]</code></pre>
|
||||||
|
</div>`)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user