gitea源码

inline_renderer.go 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package math
  4. import (
  5. "bytes"
  6. "code.gitea.io/gitea/modules/markup/internal"
  7. "github.com/yuin/goldmark/ast"
  8. "github.com/yuin/goldmark/renderer"
  9. "github.com/yuin/goldmark/util"
  10. )
  11. // Inline render output:
  12. // <code class="language-math">...</code>
  13. // InlineRenderer is an inline renderer
  14. type InlineRenderer struct {
  15. renderInternal *internal.RenderInternal
  16. }
  17. // NewInlineRenderer returns a new renderer for inline math
  18. func NewInlineRenderer(renderInternal *internal.RenderInternal) renderer.NodeRenderer {
  19. return &InlineRenderer{renderInternal: renderInternal}
  20. }
  21. func (r *InlineRenderer) renderInline(w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) {
  22. if entering {
  23. _, _ = w.WriteString(string(r.renderInternal.ProtectSafeAttrs(`<code class="language-math">`)))
  24. for c := n.FirstChild(); c != nil; c = c.NextSibling() {
  25. segment := c.(*ast.Text).Segment
  26. value := util.EscapeHTML(segment.Value(source))
  27. if bytes.HasSuffix(value, []byte("\n")) {
  28. _, _ = w.Write(value[:len(value)-1])
  29. if c != n.LastChild() {
  30. _, _ = w.Write([]byte(" "))
  31. }
  32. } else {
  33. _, _ = w.Write(value)
  34. }
  35. }
  36. return ast.WalkSkipChildren, nil
  37. }
  38. _, _ = w.WriteString(`</code>`)
  39. return ast.WalkContinue, nil
  40. }
  41. // RegisterFuncs registers the renderer for inline math nodes
  42. func (r *InlineRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
  43. reg.Register(KindInline, r.renderInline)
  44. }