@@ -27,69 +27,75 @@ func RenderBlockHTML(block Block, referenceDefinitions []*ReferenceDefinition) (
2727 return renderBlockHTML (block , referenceDefinitions , false )
2828}
2929
30- func renderBlockHTML (block Block , referenceDefinitions []* ReferenceDefinition , isTightList bool ) (result string ) {
30+ func renderBlockHTML (block Block , referenceDefinitions []* ReferenceDefinition , isTightList bool ) string {
31+ var resultSb strings.Builder
32+
3133 switch v := block .(type ) {
3234 case * Document :
3335 for _ , block := range v .Children {
34- result += RenderBlockHTML (block , referenceDefinitions )
36+ resultSb . WriteString ( RenderBlockHTML (block , referenceDefinitions ) )
3537 }
3638 case * Paragraph :
3739 if len (v .Text ) == 0 {
38- return
40+ return ""
3941 }
4042 if ! isTightList {
41- result += "<p>"
43+ resultSb . WriteString ( "<p>" )
4244 }
4345 for _ , inline := range v .ParseInlines (referenceDefinitions ) {
44- result += RenderInlineHTML (inline )
46+ resultSb . WriteString ( RenderInlineHTML (inline ) )
4547 }
4648 if ! isTightList {
47- result += "</p>"
49+ resultSb . WriteString ( "</p>" )
4850 }
4951 case * List :
5052 if v .IsOrdered {
5153 if v .OrderedStart != 1 {
52- result += fmt .Sprintf (`<ol start="%v">` , v .OrderedStart )
54+ resultSb . WriteString ( fmt .Sprintf (`<ol start="%v">` , v .OrderedStart ) )
5355 } else {
54- result += "<ol>"
56+ resultSb . WriteString ( "<ol>" )
5557 }
5658 } else {
57- result += "<ul>"
59+ resultSb . WriteString ( "<ul>" )
5860 }
5961 for _ , block := range v .Children {
60- result += renderBlockHTML (block , referenceDefinitions , ! v .IsLoose )
62+ resultSb . WriteString ( renderBlockHTML (block , referenceDefinitions , ! v .IsLoose ) )
6163 }
6264 if v .IsOrdered {
63- result += "</ol>"
65+ resultSb . WriteString ( "</ol>" )
6466 } else {
65- result += "</ul>"
67+ resultSb . WriteString ( "</ul>" )
6668 }
6769 case * ListItem :
68- result += "<li>"
70+ resultSb . WriteString ( "<li>" )
6971 for _ , block := range v .Children {
70- result += renderBlockHTML (block , referenceDefinitions , isTightList )
72+ resultSb . WriteString ( renderBlockHTML (block , referenceDefinitions , isTightList ) )
7173 }
72- result += "</li>"
74+ resultSb . WriteString ( "</li>" )
7375 case * BlockQuote :
74- result += "<blockquote>"
76+ resultSb . WriteString ( "<blockquote>" )
7577 for _ , block := range v .Children {
76- result += RenderBlockHTML (block , referenceDefinitions )
78+ resultSb . WriteString ( RenderBlockHTML (block , referenceDefinitions ) )
7779 }
78- result += "</blockquote>"
80+ resultSb . WriteString ( "</blockquote>" )
7981 case * FencedCode :
8082 if info := v .Info (); info != "" {
8183 language := strings .Fields (info )[0 ]
82- result += `<pre><code class="language-` + htmlEscaper .Replace (language ) + `">`
84+ resultSb . WriteString ( `<pre><code class="language-` + htmlEscaper .Replace (language ) + `">` )
8385 } else {
84- result += "<pre><code>"
86+ resultSb . WriteString ( "<pre><code>" )
8587 }
86- result += htmlEscaper .Replace (v .Code ()) + "</code></pre>"
88+ resultSb .WriteString (htmlEscaper .Replace (v .Code ()))
89+ resultSb .WriteString ("</code></pre>" )
8790 case * IndentedCode :
88- result += "<pre><code>" + htmlEscaper .Replace (v .Code ()) + "</code></pre>"
91+ resultSb .WriteString ("<pre><code>" )
92+ resultSb .WriteString (htmlEscaper .Replace (v .Code ()))
93+ resultSb .WriteString ("</code></pre>" )
8994 default :
9095 panic (fmt .Sprintf ("missing case for type %T" , v ))
9196 }
92- return
97+
98+ return resultSb .String ()
9399}
94100
95101func escapeURL (url string ) (result string ) {
@@ -137,31 +143,37 @@ func RenderInlineHTML(inline Inline) (result string) {
137143 }
138144 result += ` />`
139145 case * InlineLink :
140- result += `<a href="` + htmlEscaper .Replace (escapeURL (v .Destination ())) + `"`
146+ var resultSb strings.Builder
147+ resultSb .WriteString (`<a href="` + htmlEscaper .Replace (escapeURL (v .Destination ())) + `"` )
141148 if title := v .Title (); title != "" {
142- result += ` title="` + htmlEscaper .Replace (title ) + `"`
149+ resultSb . WriteString ( ` title="` + htmlEscaper .Replace (title ) + `"` )
143150 }
144- result += `>`
151+ resultSb . WriteString ( `>` )
145152 for _ , inline := range v .Children {
146- result += RenderInlineHTML (inline )
153+ resultSb . WriteString ( RenderInlineHTML (inline ) )
147154 }
148- result += "</a>"
155+ resultSb .WriteString ("</a>" )
156+ return resultSb .String ()
149157 case * ReferenceLink :
150- result += `<a href="` + htmlEscaper .Replace (escapeURL (v .Destination ())) + `"`
158+ var resultSb strings.Builder
159+ resultSb .WriteString (`<a href="` + htmlEscaper .Replace (escapeURL (v .Destination ())) + `"` )
151160 if title := v .Title (); title != "" {
152- result += ` title="` + htmlEscaper .Replace (title ) + `"`
161+ resultSb . WriteString ( ` title="` + htmlEscaper .Replace (title ) + `"` )
153162 }
154- result += `>`
163+ resultSb . WriteString ( `>` )
155164 for _ , inline := range v .Children {
156- result += RenderInlineHTML (inline )
165+ resultSb . WriteString ( RenderInlineHTML (inline ) )
157166 }
158- result += "</a>"
167+ resultSb .WriteString ("</a>" )
168+ return resultSb .String ()
159169 case * Autolink :
160- result += `<a href="` + htmlEscaper .Replace (escapeURL (v .Destination ())) + `">`
170+ var resultSb strings.Builder
171+ resultSb .WriteString (`<a href="` + htmlEscaper .Replace (escapeURL (v .Destination ())) + `">` )
161172 for _ , inline := range v .Children {
162- result += RenderInlineHTML (inline )
173+ resultSb . WriteString ( RenderInlineHTML (inline ) )
163174 }
164- result += "</a>"
175+ resultSb .WriteString ("</a>" )
176+ return resultSb .String ()
165177 case * Emoji :
166178 escapedName := htmlEscaper .Replace (v .Name )
167179 result += fmt .Sprintf (`<span data-emoji-name="%s" data-literal=":%s:" />` , escapedName , escapedName )
@@ -172,25 +184,30 @@ func RenderInlineHTML(inline Inline) (result string) {
172184 return
173185}
174186
175- func renderImageAltText (children []Inline ) (result string ) {
187+ func renderImageAltText (children []Inline ) string {
188+ var resultSb strings.Builder
176189 for _ , inline := range children {
177- result += renderImageChildAltText (inline )
190+ resultSb . WriteString ( renderImageChildAltText (inline ) )
178191 }
179- return
192+ return resultSb . String ()
180193}
181194
182- func renderImageChildAltText (inline Inline ) ( result string ) {
195+ func renderImageChildAltText (inline Inline ) string {
183196 switch v := inline .(type ) {
184197 case * Text :
185198 return v .Text
186199 case * InlineImage :
200+ var resultSb strings.Builder
187201 for _ , inline := range v .Children {
188- result += renderImageChildAltText (inline )
202+ resultSb . WriteString ( renderImageChildAltText (inline ) )
189203 }
204+ return resultSb .String ()
190205 case * InlineLink :
206+ var resultSb strings.Builder
191207 for _ , inline := range v .Children {
192- result += renderImageChildAltText (inline )
208+ resultSb . WriteString ( renderImageChildAltText (inline ) )
193209 }
210+ return resultSb .String ()
194211 }
195- return
212+ return ""
196213}
0 commit comments