Skip to content

Commit 086a469

Browse files
lafrikszeripath
authored andcommitted
Rewrite markdown rendering to blackfriday v2 and rewrite orgmode rendering to go-org (#8560)
* Rewrite markdown rendering to blackfriday v2.0 * Fix style * Fix go mod with golang 1.13 * Fix blackfriday v2 import * Inital orgmode renderer migration to go-org * Vendor go-org dependency * Ignore errors :/ * Update go-org to latest version * Update test * Fix go-org test * Remove unneeded code * Fix comments * Fix markdown test * Fix blackfriday regression rendering HTML block
1 parent 690a8ec commit 086a469

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+5767
-3730
lines changed

go.mod

+5-4
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ require (
2222
github.com/blevesearch/go-porterstemmer v0.0.0-20141230013033-23a2c8e5cf1f // indirect
2323
github.com/blevesearch/segment v0.0.0-20160105220820-db70c57796cc // indirect
2424
github.com/boombuler/barcode v0.0.0-20161226211916-fe0f26ff6d26 // indirect
25-
github.com/chaseadamsio/goorgeous v0.0.0-20170901132237-098da33fde5f
2625
github.com/couchbase/vellum v0.0.0-20190111184608-e91b68ff3efe // indirect
2726
github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d // indirect
2827
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect
@@ -73,19 +72,21 @@ require (
7372
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae // indirect
7473
github.com/msteinert/pam v0.0.0-20151204160544-02ccfbfaf0cc
7574
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5
75+
github.com/niklasfasching/go-org v0.1.7
7676
github.com/oliamb/cutter v0.2.2
7777
github.com/philhofer/fwd v1.0.0 // indirect
7878
github.com/pkg/errors v0.8.1
7979
github.com/pquerna/otp v0.0.0-20160912161815-54653902c20e
8080
github.com/prometheus/client_golang v1.1.0
8181
github.com/prometheus/procfs v0.0.4 // indirect
8282
github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 // indirect
83-
github.com/russross/blackfriday v0.0.0-20180428102519-11635eb403ff
83+
github.com/russross/blackfriday v2.0.0+incompatible // indirect
84+
github.com/russross/blackfriday/v2 v2.0.1
8485
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
8586
github.com/satori/go.uuid v1.2.0
8687
github.com/sergi/go-diff v1.0.0
8788
github.com/shurcooL/httpfs v0.0.0-20190527155220-6a4d4a70508b // indirect
88-
github.com/shurcooL/sanitized_anchor_name v0.0.0-20160918041101-1dba4b3954bc // indirect
89+
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
8990
github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd
9091
github.com/steveyen/gtreap v0.0.0-20150807155958-0abe01ef9be2 // indirect
9192
github.com/stretchr/testify v1.4.0
@@ -100,7 +101,7 @@ require (
100101
github.com/willf/bitset v0.0.0-20180426185212-8ce1146b8621 // indirect
101102
github.com/yohcop/openid-go v0.0.0-20160914080427-2c050d2dae53
102103
golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad
103-
golang.org/x/net v0.0.0-20190909003024-a7b16738d86b
104+
golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271
104105
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
105106
golang.org/x/sys v0.0.0-20190910064555-bbd175535a8b
106107
golang.org/x/text v0.3.2

go.sum

+12-4
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,6 @@ github.com/boombuler/barcode v0.0.0-20161226211916-fe0f26ff6d26/go.mod h1:paBWMc
8686
github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668 h1:U/lr3Dgy4WK+hNk4tyD+nuGjpVLPEHuJSFXMw11/HPA=
8787
github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
8888
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
89-
github.com/chaseadamsio/goorgeous v0.0.0-20170901132237-098da33fde5f h1:REH9VH5ubNR0skLaOxK7TRJeRbE2dDfvaouQo8FsRcA=
90-
github.com/chaseadamsio/goorgeous v0.0.0-20170901132237-098da33fde5f/go.mod h1:6QaC0vFoKWYDth94dHFNgRT2YkT5FHdQp/Yx15aAAi0=
9189
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
9290
github.com/corbym/gocrest v1.0.3 h1:gwEdq6RkTmq+09CTuM29DfKOCtZ7G7bcyxs3IZ6EVdU=
9391
github.com/corbym/gocrest v1.0.3/go.mod h1:maVFL5lbdS2PgfOQgGRWDYTeunSWQeiEgoNdTABShCs=
@@ -425,6 +423,10 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW
425423
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
426424
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY=
427425
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
426+
github.com/niklasfasching/go-org v0.1.6 h1:F521WcqRNl8OJumlgAnekZgERaTA2HpfOYYfVEKOeI8=
427+
github.com/niklasfasching/go-org v0.1.6/go.mod h1:AsLD6X7djzRIz4/RFZu8vwRL0VGjUvGZCCH1Nz0VdrU=
428+
github.com/niklasfasching/go-org v0.1.7 h1:t3V+3XnS/7BhKv/7SlMUa8FvAiq577/a1T3D7mLIRXE=
429+
github.com/niklasfasching/go-org v0.1.7/go.mod h1:AsLD6X7djzRIz4/RFZu8vwRL0VGjUvGZCCH1Nz0VdrU=
428430
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
429431
github.com/oliamb/cutter v0.2.2 h1:Lfwkya0HHNU1YLnGv2hTkzHfasrSMkgv4Dn+5rmlk3k=
430432
github.com/oliamb/cutter v0.2.2/go.mod h1:4BenG2/4GuRBDbVm/OPahDVqbrOemzpPiG5mi1iryBU=
@@ -487,8 +489,10 @@ github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001/go.mod h1:qq
487489
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
488490
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
489491
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
490-
github.com/russross/blackfriday v0.0.0-20180428102519-11635eb403ff h1:g9ZlAHmkc/h5So+OjNCkZWh+FjuKEOOOoyRkqlGA8+c=
491-
github.com/russross/blackfriday v0.0.0-20180428102519-11635eb403ff/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
492+
github.com/russross/blackfriday v2.0.0+incompatible h1:cBXrhZNUf9C+La9/YpS+UHpUT8YD6Td9ZMSU9APFcsk=
493+
github.com/russross/blackfriday v2.0.0+incompatible/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
494+
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
495+
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
492496
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI=
493497
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
494498
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
@@ -499,6 +503,8 @@ github.com/shurcooL/httpfs v0.0.0-20190527155220-6a4d4a70508b h1:4kg1wyftSKxLtnP
499503
github.com/shurcooL/httpfs v0.0.0-20190527155220-6a4d4a70508b/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
500504
github.com/shurcooL/sanitized_anchor_name v0.0.0-20160918041101-1dba4b3954bc h1:3wIrJvFb3Pf6B/2mDBnN1G5IfUVev4X5apadQlWOczE=
501505
github.com/shurcooL/sanitized_anchor_name v0.0.0-20160918041101-1dba4b3954bc/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
506+
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
507+
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
502508
github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd h1:ug7PpSOB5RBPK1Kg6qskGBoP3Vnj/aNYFTznWvlkGo0=
503509
github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
504510
github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
@@ -650,6 +656,8 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k
650656
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
651657
golang.org/x/net v0.0.0-20190909003024-a7b16738d86b h1:XfVGCX+0T4WOStkaOsJRllbsiImhB2jgVBGc9L0lPGc=
652658
golang.org/x/net v0.0.0-20190909003024-a7b16738d86b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
659+
golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 h1:N66aaryRB3Ax92gH0v3hp1QYZ3zWWCCUR/j8Ifh45Ss=
660+
golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
653661
golang.org/x/oauth2 v0.0.0-20180620175406-ef147856a6dd/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
654662
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
655663
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=

modules/markup/html_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,6 @@ func TestRender_ShortLinks(t *testing.T) {
323323
`<p><a href="`+notencodedImgurlWiki+`" rel="nofollow"><img src="`+notencodedImgurlWiki+`"/></a></p>`)
324324
test(
325325
"<p><a href=\"https://example.org\">[[foobar]]</a></p>",
326-
`<p><a href="https://example.org" rel="nofollow">[[foobar]]</a></p>`,
327-
`<p><a href="https://example.org" rel="nofollow">[[foobar]]</a></p>`)
326+
`<p></p><p><a href="https://example.org" rel="nofollow">[[foobar]]</a></p><p></p>`,
327+
`<p></p><p><a href="https://example.org" rel="nofollow">[[foobar]]</a></p><p></p>`)
328328
}

modules/markup/markdown/markdown.go

+107-102
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ package markdown
77

88
import (
99
"bytes"
10+
"io"
1011
"strings"
1112

1213
"code.gitea.io/gitea/modules/markup"
1314
"code.gitea.io/gitea/modules/setting"
1415
"code.gitea.io/gitea/modules/util"
1516

16-
"github.com/russross/blackfriday"
17+
"github.com/russross/blackfriday/v2"
1718
)
1819

1920
// Renderer is a extended version of underlying render object.
@@ -25,134 +26,138 @@ type Renderer struct {
2526

2627
var byteMailto = []byte("mailto:")
2728

28-
// Link defines how formal links should be processed to produce corresponding HTML elements.
29-
func (r *Renderer) Link(out *bytes.Buffer, link []byte, title []byte, content []byte) {
30-
// special case: this is not a link, a hash link or a mailto:, so it's a
31-
// relative URL
32-
if len(link) > 0 && !markup.IsLink(link) &&
33-
link[0] != '#' && !bytes.HasPrefix(link, byteMailto) {
34-
lnk := string(link)
35-
if r.IsWiki {
36-
lnk = util.URLJoin("wiki", lnk)
37-
}
38-
mLink := util.URLJoin(r.URLPrefix, lnk)
39-
link = []byte(mLink)
40-
}
41-
42-
if len(content) > 10 && string(content[0:9]) == "<a href=\"" && bytes.Contains(content[9:], []byte("<img")) {
43-
// Image with link case: markdown `[![]()]()`
44-
// If the content is an image, then we change the original href around it
45-
// which points to itself to a new address "link"
46-
rightQuote := bytes.Index(content[9:], []byte("\""))
47-
content = bytes.Replace(content, content[9:9+rightQuote], link, 1)
48-
out.Write(content)
49-
} else {
50-
r.Renderer.Link(out, link, title, content)
51-
}
29+
var htmlEscaper = [256][]byte{
30+
'&': []byte("&amp;"),
31+
'<': []byte("&lt;"),
32+
'>': []byte("&gt;"),
33+
'"': []byte("&quot;"),
5234
}
5335

54-
// List renders markdown bullet or digit lists to HTML
55-
func (r *Renderer) List(out *bytes.Buffer, text func() bool, flags int) {
56-
marker := out.Len()
57-
if out.Len() > 0 {
58-
out.WriteByte('\n')
59-
}
60-
61-
if flags&blackfriday.LIST_TYPE_DEFINITION != 0 {
62-
out.WriteString("<dl>")
63-
} else if flags&blackfriday.LIST_TYPE_ORDERED != 0 {
64-
out.WriteString("<ol class='ui list'>")
65-
} else {
66-
out.WriteString("<ul class='ui list'>")
67-
}
68-
if !text() {
69-
out.Truncate(marker)
70-
return
36+
func escapeHTML(w io.Writer, s []byte) {
37+
var start, end int
38+
for end < len(s) {
39+
escSeq := htmlEscaper[s[end]]
40+
if escSeq != nil {
41+
_, _ = w.Write(s[start:end])
42+
_, _ = w.Write(escSeq)
43+
start = end + 1
44+
}
45+
end++
7146
}
72-
if flags&blackfriday.LIST_TYPE_DEFINITION != 0 {
73-
out.WriteString("</dl>\n")
74-
} else if flags&blackfriday.LIST_TYPE_ORDERED != 0 {
75-
out.WriteString("</ol>\n")
76-
} else {
77-
out.WriteString("</ul>\n")
47+
if start < len(s) && end <= len(s) {
48+
_, _ = w.Write(s[start:end])
7849
}
7950
}
8051

81-
// ListItem defines how list items should be processed to produce corresponding HTML elements.
82-
func (r *Renderer) ListItem(out *bytes.Buffer, text []byte, flags int) {
83-
// Detect procedures to draw checkboxes.
84-
prefix := ""
85-
if bytes.HasPrefix(text, []byte("<p>")) {
86-
prefix = "<p>"
87-
}
88-
switch {
89-
case bytes.HasPrefix(text, []byte(prefix+"[ ] ")):
90-
text = append([]byte(`<span class="ui fitted disabled checkbox"><input type="checkbox" disabled="disabled" /><label /></span>`), text[3+len(prefix):]...)
91-
if prefix != "" {
92-
text = bytes.Replace(text, []byte(prefix), []byte{}, 1)
52+
// RenderNode is a default renderer of a single node of a syntax tree. For
53+
// block nodes it will be called twice: first time with entering=true, second
54+
// time with entering=false, so that it could know when it's working on an open
55+
// tag and when on close. It writes the result to w.
56+
//
57+
// The return value is a way to tell the calling walker to adjust its walk
58+
// pattern: e.g. it can terminate the traversal by returning Terminate. Or it
59+
// can ask the walker to skip a subtree of this node by returning SkipChildren.
60+
// The typical behavior is to return GoToNext, which asks for the usual
61+
// traversal to the next node.
62+
func (r *Renderer) RenderNode(w io.Writer, node *blackfriday.Node, entering bool) blackfriday.WalkStatus {
63+
switch node.Type {
64+
case blackfriday.Image:
65+
prefix := r.URLPrefix
66+
if r.IsWiki {
67+
prefix = util.URLJoin(prefix, "wiki", "raw")
9368
}
94-
case bytes.HasPrefix(text, []byte(prefix+"[x] ")):
95-
text = append([]byte(`<span class="ui checked fitted disabled checkbox"><input type="checkbox" checked="" disabled="disabled" /><label /></span>`), text[3+len(prefix):]...)
96-
if prefix != "" {
97-
text = bytes.Replace(text, []byte(prefix), []byte{}, 1)
69+
prefix = strings.Replace(prefix, "/src/", "/media/", 1)
70+
link := node.LinkData.Destination
71+
if len(link) > 0 && !markup.IsLink(link) {
72+
lnk := string(link)
73+
lnk = util.URLJoin(prefix, lnk)
74+
lnk = strings.Replace(lnk, " ", "+", -1)
75+
link = []byte(lnk)
76+
}
77+
node.LinkData.Destination = link
78+
// Render link around image only if parent is not link already
79+
if node.Parent != nil && node.Parent.Type != blackfriday.Link {
80+
if entering {
81+
_, _ = w.Write([]byte(`<a href="`))
82+
escapeHTML(w, link)
83+
_, _ = w.Write([]byte(`">`))
84+
return r.Renderer.RenderNode(w, node, entering)
85+
}
86+
s := r.Renderer.RenderNode(w, node, entering)
87+
_, _ = w.Write([]byte(`</a>`))
88+
return s
89+
}
90+
return r.Renderer.RenderNode(w, node, entering)
91+
case blackfriday.Link:
92+
// special case: this is not a link, a hash link or a mailto:, so it's a
93+
// relative URL
94+
link := node.LinkData.Destination
95+
if len(link) > 0 && !markup.IsLink(link) &&
96+
link[0] != '#' && !bytes.HasPrefix(link, byteMailto) &&
97+
node.LinkData.Footnote == nil {
98+
lnk := string(link)
99+
if r.IsWiki {
100+
lnk = util.URLJoin("wiki", lnk)
101+
}
102+
link = []byte(util.URLJoin(r.URLPrefix, lnk))
103+
}
104+
node.LinkData.Destination = link
105+
return r.Renderer.RenderNode(w, node, entering)
106+
case blackfriday.Text:
107+
isListItem := false
108+
for n := node.Parent; n != nil; n = n.Parent {
109+
if n.Type == blackfriday.Item {
110+
isListItem = true
111+
break
112+
}
113+
}
114+
if isListItem {
115+
text := node.Literal
116+
switch {
117+
case bytes.HasPrefix(text, []byte("[ ] ")):
118+
_, _ = w.Write([]byte(`<span class="ui fitted disabled checkbox"><input type="checkbox" disabled="disabled" /><label /></span>`))
119+
text = text[3:]
120+
case bytes.HasPrefix(text, []byte("[x] ")):
121+
_, _ = w.Write([]byte(`<span class="ui checked fitted disabled checkbox"><input type="checkbox" checked="" disabled="disabled" /><label /></span>`))
122+
text = text[3:]
123+
}
124+
node.Literal = text
98125
}
99126
}
100-
r.Renderer.ListItem(out, text, flags)
101-
}
102-
103-
// Image defines how images should be processed to produce corresponding HTML elements.
104-
func (r *Renderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) {
105-
prefix := r.URLPrefix
106-
if r.IsWiki {
107-
prefix = util.URLJoin(prefix, "wiki", "raw")
108-
}
109-
prefix = strings.Replace(prefix, "/src/", "/media/", 1)
110-
if len(link) > 0 && !markup.IsLink(link) {
111-
lnk := string(link)
112-
lnk = util.URLJoin(prefix, lnk)
113-
lnk = strings.Replace(lnk, " ", "+", -1)
114-
link = []byte(lnk)
115-
}
116-
117-
// Put a link around it pointing to itself by default
118-
out.WriteString(`<a href="`)
119-
out.Write(link)
120-
out.WriteString(`">`)
121-
r.Renderer.Image(out, link, title, alt)
122-
out.WriteString("</a>")
127+
return r.Renderer.RenderNode(w, node, entering)
123128
}
124129

125130
const (
126131
blackfridayExtensions = 0 |
127-
blackfriday.EXTENSION_NO_INTRA_EMPHASIS |
128-
blackfriday.EXTENSION_TABLES |
129-
blackfriday.EXTENSION_FENCED_CODE |
130-
blackfriday.EXTENSION_STRIKETHROUGH |
131-
blackfriday.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK |
132-
blackfriday.EXTENSION_DEFINITION_LISTS |
133-
blackfriday.EXTENSION_FOOTNOTES |
134-
blackfriday.EXTENSION_HEADER_IDS |
135-
blackfriday.EXTENSION_AUTO_HEADER_IDS
132+
blackfriday.NoIntraEmphasis |
133+
blackfriday.Tables |
134+
blackfriday.FencedCode |
135+
blackfriday.Strikethrough |
136+
blackfriday.NoEmptyLineBeforeBlock |
137+
blackfriday.DefinitionLists |
138+
blackfriday.Footnotes |
139+
blackfriday.HeadingIDs |
140+
blackfriday.AutoHeadingIDs
136141
blackfridayHTMLFlags = 0 |
137-
blackfriday.HTML_SKIP_STYLE |
138-
blackfriday.HTML_OMIT_CONTENTS |
139-
blackfriday.HTML_USE_SMARTYPANTS
142+
blackfriday.Smartypants
140143
)
141144

142145
// RenderRaw renders Markdown to HTML without handling special links.
143146
func RenderRaw(body []byte, urlPrefix string, wikiMarkdown bool) []byte {
144147
renderer := &Renderer{
145-
Renderer: blackfriday.HtmlRenderer(blackfridayHTMLFlags, "", ""),
148+
Renderer: blackfriday.NewHTMLRenderer(blackfriday.HTMLRendererParameters{
149+
Flags: blackfridayHTMLFlags,
150+
}),
146151
URLPrefix: urlPrefix,
147152
IsWiki: wikiMarkdown,
148153
}
149154

150155
exts := blackfridayExtensions
151156
if setting.Markdown.EnableHardLineBreak {
152-
exts |= blackfriday.EXTENSION_HARD_LINE_BREAK
157+
exts |= blackfriday.HardLineBreak
153158
}
154159

155-
body = blackfriday.Markdown(body, renderer, exts)
160+
body = blackfriday.Run(body, blackfriday.WithRenderer(renderer), blackfriday.WithExtensions(exts))
156161
return markup.SanitizeBytes(body)
157162
}
158163

modules/markup/markdown/markdown_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -166,23 +166,23 @@ func testAnswers(baseURLContent, baseURLImages string) []string {
166166
<h3 id="footnotes">Footnotes</h3>
167167
168168
<p>Here is a simple footnote,<sup id="fnref:1"><a href="#fn:1" rel="nofollow">1</a></sup> and here is a longer one.<sup id="fnref:bignote"><a href="#fn:bignote" rel="nofollow">2</a></sup></p>
169+
169170
<div>
170171
171172
<hr/>
172173
173174
<ol>
174-
<li id="fn:1">This is the first footnote.
175-
</li>
175+
<li id="fn:1">This is the first footnote.</li>
176176
177177
<li id="fn:bignote"><p>Here is one with multiple paragraphs and code.</p>
178178
179179
<p>Indent paragraphs to include them in the footnote.</p>
180180
181181
<p><code>{ my code }</code></p>
182182
183-
<p>Add as many paragraphs as you like.</p>
184-
</li>
183+
<p>Add as many paragraphs as you like.</p></li>
185184
</ol>
185+
186186
</div>
187187
`,
188188
}

0 commit comments

Comments
 (0)