mirror of https://github.com/go-gitea/gitea.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.5 KiB
53 lines
1.5 KiB
// Copyright 2022 The Gitea Authors. All rights reserved. |
|
// SPDX-License-Identifier: MIT |
|
|
|
package math |
|
|
|
import ( |
|
"bytes" |
|
|
|
"code.gitea.io/gitea/modules/markup/internal" |
|
|
|
"github.com/yuin/goldmark/ast" |
|
"github.com/yuin/goldmark/renderer" |
|
"github.com/yuin/goldmark/util" |
|
) |
|
|
|
// Inline render output: |
|
// <code class="language-math">...</code> |
|
|
|
// InlineRenderer is an inline renderer |
|
type InlineRenderer struct { |
|
renderInternal *internal.RenderInternal |
|
} |
|
|
|
// NewInlineRenderer returns a new renderer for inline math |
|
func NewInlineRenderer(renderInternal *internal.RenderInternal) renderer.NodeRenderer { |
|
return &InlineRenderer{renderInternal: renderInternal} |
|
} |
|
|
|
func (r *InlineRenderer) renderInline(w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) { |
|
if entering { |
|
_, _ = w.WriteString(string(r.renderInternal.ProtectSafeAttrs(`<code class="language-math">`))) |
|
for c := n.FirstChild(); c != nil; c = c.NextSibling() { |
|
segment := c.(*ast.Text).Segment |
|
value := util.EscapeHTML(segment.Value(source)) |
|
if bytes.HasSuffix(value, []byte("\n")) { |
|
_, _ = w.Write(value[:len(value)-1]) |
|
if c != n.LastChild() { |
|
_, _ = w.Write([]byte(" ")) |
|
} |
|
} else { |
|
_, _ = w.Write(value) |
|
} |
|
} |
|
return ast.WalkSkipChildren, nil |
|
} |
|
_, _ = w.WriteString(`</code>`) |
|
return ast.WalkContinue, nil |
|
} |
|
|
|
// RegisterFuncs registers the renderer for inline math nodes |
|
func (r *InlineRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { |
|
reg.Register(KindInline, r.renderInline) |
|
}
|
|
|