loading up the forgejo repo on tangled to test page performance
1// Copyright 2024 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package markdown
5
6import (
7 "bytes"
8 "fmt"
9 "strings"
10
11 "forgejo.org/modules/markup"
12 mdutil "forgejo.org/modules/markup/markdown/util"
13
14 "github.com/yuin/goldmark/ast"
15 "github.com/yuin/goldmark/renderer/html"
16 "github.com/yuin/goldmark/text"
17 "github.com/yuin/goldmark/util"
18)
19
20// renderCodeSpan renders CodeSpan elements (like goldmark upstream does) but also renders ColorPreview elements.
21// See #21474 for reference
22func (r *HTMLRenderer) renderCodeSpan(w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) {
23 if entering {
24 if n.Attributes() != nil {
25 _, _ = w.WriteString("<code")
26 html.RenderAttributes(w, n, html.CodeAttributeFilter)
27 _ = w.WriteByte('>')
28 } else {
29 _, _ = w.WriteString("<code>")
30 }
31 for c := n.FirstChild(); c != nil; c = c.NextSibling() {
32 switch v := c.(type) {
33 case *ast.Text:
34 segment := v.Segment
35 value := segment.Value(source)
36 if bytes.HasSuffix(value, []byte("\n")) {
37 r.Writer.RawWrite(w, value[:len(value)-1])
38 r.Writer.RawWrite(w, []byte(" "))
39 } else {
40 r.Writer.RawWrite(w, value)
41 }
42 case *ColorPreview:
43 _, _ = fmt.Fprintf(w, `<span class="color-preview" style="background-color: %v"></span>`, string(v.Color))
44 }
45 }
46 return ast.WalkSkipChildren, nil
47 }
48 _, _ = w.WriteString("</code>")
49 return ast.WalkContinue, nil
50}
51
52func (g *ASTTransformer) transformCodeSpan(_ *markup.RenderContext, v *ast.CodeSpan, reader text.Reader) {
53 colorContent := mdutil.Text(v, reader.Source())
54 if matchColor(strings.ToLower(string(colorContent))) {
55 v.AppendChild(v, NewColorPreview(colorContent))
56 }
57}