loading up the forgejo repo on tangled to test page performance
at forgejo 57 lines 1.7 kB view raw
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}