@@ -16,6 +16,7 @@ import (
1616 "code.gitea.io/gitea/modules/setting"
1717 giteautil "code.gitea.io/gitea/modules/util"
1818
19+ "github.com/microcosm-cc/bluemonday/css"
1920 "github.com/yuin/goldmark/ast"
2021 east "github.com/yuin/goldmark/extension/ast"
2122 "github.com/yuin/goldmark/parser"
@@ -178,6 +179,11 @@ func (g *ASTTransformer) Transform(node *ast.Document, reader text.Reader, pc pa
178179 v .SetHardLineBreak (setting .Markdown .EnableHardLineBreakInDocuments )
179180 }
180181 }
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+ }
181187 }
182188 return ast .WalkContinue , nil
183189 })
@@ -266,10 +272,43 @@ func (r *HTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
266272 reg .Register (KindDetails , r .renderDetails )
267273 reg .Register (KindSummary , r .renderSummary )
268274 reg .Register (KindIcon , r .renderIcon )
275+ reg .Register (ast .KindCodeSpan , r .renderCodeSpan )
269276 reg .Register (KindTaskCheckBoxListItem , r .renderTaskCheckBoxListItem )
270277 reg .Register (east .KindTaskCheckBox , r .renderTaskCheckBox )
271278}
272279
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+
273312func (r * HTMLRenderer ) renderDocument (w util.BufWriter , source []byte , node ast.Node , entering bool ) (ast.WalkStatus , error ) {
274313 n := node .(* ast.Document )
275314
0 commit comments