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.
61 lines
2.1 KiB
61 lines
2.1 KiB
// Copyright 2022 The Gitea Authors. All rights reserved. |
|
// SPDX-License-Identifier: MIT |
|
|
|
package math |
|
|
|
import ( |
|
"html/template" |
|
|
|
"code.gitea.io/gitea/modules/markup/internal" |
|
giteaUtil "code.gitea.io/gitea/modules/util" |
|
|
|
gast "github.com/yuin/goldmark/ast" |
|
"github.com/yuin/goldmark/renderer" |
|
"github.com/yuin/goldmark/util" |
|
) |
|
|
|
// Block render output: |
|
// <pre class="code-block is-loading"><code class="language-math display">...</code></pre> |
|
// |
|
// Keep in mind that there is another "code block" render in "func (r *GlodmarkRender) highlightingRenderer" |
|
// "highlightingRenderer" outputs the math block with extra "chroma" class: |
|
// <pre class="code-block is-loading"><code class="chroma language-math display">...</code></pre> |
|
// |
|
// Special classes: |
|
// * "is-loading": show a loading indicator |
|
// * "display": used by JS to decide to render as a block, otherwise render as inline |
|
|
|
// BlockRenderer represents a renderer for math Blocks |
|
type BlockRenderer struct { |
|
renderInternal *internal.RenderInternal |
|
} |
|
|
|
// NewBlockRenderer creates a new renderer for math Blocks |
|
func NewBlockRenderer(renderInternal *internal.RenderInternal) renderer.NodeRenderer { |
|
return &BlockRenderer{renderInternal: renderInternal} |
|
} |
|
|
|
// RegisterFuncs registers the renderer for math Blocks |
|
func (r *BlockRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { |
|
reg.Register(KindBlock, r.renderBlock) |
|
} |
|
|
|
func (r *BlockRenderer) writeLines(w util.BufWriter, source []byte, n gast.Node) { |
|
l := n.Lines().Len() |
|
for i := range l { |
|
line := n.Lines().At(i) |
|
_, _ = w.Write(util.EscapeHTML(line.Value(source))) |
|
} |
|
} |
|
|
|
func (r *BlockRenderer) renderBlock(w util.BufWriter, source []byte, node gast.Node, entering bool) (gast.WalkStatus, error) { |
|
n := node.(*Block) |
|
if entering { |
|
codeHTML := giteaUtil.Iif[template.HTML](n.Inline, "", `<pre class="code-block is-loading">`) + `<code class="language-math display">` |
|
_, _ = w.WriteString(string(r.renderInternal.ProtectSafeAttrs(codeHTML))) |
|
r.writeLines(w, source, n) |
|
} else { |
|
_, _ = w.WriteString(`</code>` + giteaUtil.Iif(n.Inline, "", `</pre>`) + "\n") |
|
} |
|
return gast.WalkContinue, nil |
|
}
|
|
|