@@ -16,6 +16,7 @@ import (
16
16
"code.gitea.io/gitea/modules/setting"
17
17
giteautil "code.gitea.io/gitea/modules/util"
18
18
19
+ "github.com/microcosm-cc/bluemonday/css"
19
20
"github.com/yuin/goldmark/ast"
20
21
east "github.com/yuin/goldmark/extension/ast"
21
22
"github.com/yuin/goldmark/parser"
@@ -178,6 +179,11 @@ func (g *ASTTransformer) Transform(node *ast.Document, reader text.Reader, pc pa
178
179
v .SetHardLineBreak (setting .Markdown .EnableHardLineBreakInDocuments )
179
180
}
180
181
}
182
+ case * ast.CodeSpan :
183
+ colorContent := n .Text (reader .Source ())
184
+ if css .ColorHandler (strings .ToLower (string (colorContent ))) {
185
+ v .AppendChild (v , NewColorPreview (colorContent ))
186
+ }
181
187
}
182
188
return ast .WalkContinue , nil
183
189
})
@@ -266,10 +272,43 @@ func (r *HTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
266
272
reg .Register (KindDetails , r .renderDetails )
267
273
reg .Register (KindSummary , r .renderSummary )
268
274
reg .Register (KindIcon , r .renderIcon )
275
+ reg .Register (ast .KindCodeSpan , r .renderCodeSpan )
269
276
reg .Register (KindTaskCheckBoxListItem , r .renderTaskCheckBoxListItem )
270
277
reg .Register (east .KindTaskCheckBox , r .renderTaskCheckBox )
271
278
}
272
279
280
+ // renderCodeSpan renders CodeSpan elements (like goldmark upstream does) but also renders ColorPreview elements.
281
+ // See #21474 for reference
282
+ func (r * HTMLRenderer ) renderCodeSpan (w util.BufWriter , source []byte , n ast.Node , entering bool ) (ast.WalkStatus , error ) {
283
+ if entering {
284
+ if n .Attributes () != nil {
285
+ _ , _ = w .WriteString ("<code" )
286
+ html .RenderAttributes (w , n , html .CodeAttributeFilter )
287
+ _ = w .WriteByte ('>' )
288
+ } else {
289
+ _ , _ = w .WriteString ("<code>" )
290
+ }
291
+ for c := n .FirstChild (); c != nil ; c = c .NextSibling () {
292
+ switch v := c .(type ) {
293
+ case * ast.Text :
294
+ segment := v .Segment
295
+ value := segment .Value (source )
296
+ if bytes .HasSuffix (value , []byte ("\n " )) {
297
+ r .Writer .RawWrite (w , value [:len (value )- 1 ])
298
+ r .Writer .RawWrite (w , []byte (" " ))
299
+ } else {
300
+ r .Writer .RawWrite (w , value )
301
+ }
302
+ case * ColorPreview :
303
+ _ , _ = w .WriteString (fmt .Sprintf (`<span class="color-preview" style="background-color: %v"></span>` , string (v .Color )))
304
+ }
305
+ }
306
+ return ast .WalkSkipChildren , nil
307
+ }
308
+ _ , _ = w .WriteString ("</code>" )
309
+ return ast .WalkContinue , nil
310
+ }
311
+
273
312
func (r * HTMLRenderer ) renderDocument (w util.BufWriter , source []byte , node ast.Node , entering bool ) (ast.WalkStatus , error ) {
274
313
n := node .(* ast.Document )
275
314
0 commit comments