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.
60 lines
1.8 KiB
60 lines
1.8 KiB
// Copyright 2022 The Gitea Authors. All rights reserved. |
|
// SPDX-License-Identifier: MIT |
|
|
|
package math |
|
|
|
import ( |
|
"code.gitea.io/gitea/modules/markup/internal" |
|
giteaUtil "code.gitea.io/gitea/modules/util" |
|
|
|
"github.com/yuin/goldmark" |
|
"github.com/yuin/goldmark/parser" |
|
"github.com/yuin/goldmark/renderer" |
|
"github.com/yuin/goldmark/util" |
|
) |
|
|
|
type Options struct { |
|
Enabled bool |
|
ParseInlineDollar bool // inline $$ xxx $$ text |
|
ParseInlineParentheses bool // inline \( xxx \) text |
|
ParseBlockDollar bool // block $$ multiple-line $$ text |
|
ParseBlockSquareBrackets bool // block \[ multiple-line \] text |
|
} |
|
|
|
// Extension is a math extension |
|
type Extension struct { |
|
renderInternal *internal.RenderInternal |
|
options Options |
|
} |
|
|
|
// NewExtension creates a new math extension with the provided options |
|
func NewExtension(renderInternal *internal.RenderInternal, opts ...Options) *Extension { |
|
opt := giteaUtil.OptionalArg(opts) |
|
r := &Extension{ |
|
renderInternal: renderInternal, |
|
options: opt, |
|
} |
|
return r |
|
} |
|
|
|
// Extend extends goldmark with our parsers and renderers |
|
func (e *Extension) Extend(m goldmark.Markdown) { |
|
if !e.options.Enabled { |
|
return |
|
} |
|
|
|
var inlines []util.PrioritizedValue |
|
if e.options.ParseInlineParentheses { |
|
inlines = append(inlines, util.Prioritized(NewInlineParenthesesParser(), 501)) |
|
} |
|
inlines = append(inlines, util.Prioritized(NewInlineDollarParser(e.options.ParseInlineDollar), 502)) |
|
|
|
m.Parser().AddOptions(parser.WithInlineParsers(inlines...)) |
|
m.Parser().AddOptions(parser.WithBlockParsers( |
|
util.Prioritized(NewBlockParser(e.options.ParseBlockDollar, e.options.ParseBlockSquareBrackets), 701), |
|
)) |
|
m.Renderer().AddOptions(renderer.WithNodeRenderers( |
|
util.Prioritized(NewBlockRenderer(e.renderInternal), 501), |
|
util.Prioritized(NewInlineRenderer(e.renderInternal), 502), |
|
)) |
|
}
|
|
|