mirror of
https://github.com/go-gitea/gitea.git
synced 2024-12-14 16:49:19 +08:00
8a20fba8eb
Remove unmaintainable sanitizer rules. No need to add special "class" regexp rules anymore, use RenderInternal.SafeAttr instead, more details (and examples) are in the tests
84 lines
1.9 KiB
Go
84 lines
1.9 KiB
Go
// Copyright 2022 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package math
|
|
|
|
import (
|
|
"code.gitea.io/gitea/modules/markup/internal"
|
|
|
|
"github.com/yuin/goldmark"
|
|
"github.com/yuin/goldmark/parser"
|
|
"github.com/yuin/goldmark/renderer"
|
|
"github.com/yuin/goldmark/util"
|
|
)
|
|
|
|
// Extension is a math extension
|
|
type Extension struct {
|
|
renderInternal *internal.RenderInternal
|
|
enabled bool
|
|
parseDollarInline bool
|
|
parseDollarBlock bool
|
|
}
|
|
|
|
// Option is the interface Options should implement
|
|
type Option interface {
|
|
SetOption(e *Extension)
|
|
}
|
|
|
|
type extensionFunc func(e *Extension)
|
|
|
|
func (fn extensionFunc) SetOption(e *Extension) {
|
|
fn(e)
|
|
}
|
|
|
|
// Enabled enables or disables this extension
|
|
func Enabled(enable ...bool) Option {
|
|
value := true
|
|
if len(enable) > 0 {
|
|
value = enable[0]
|
|
}
|
|
return extensionFunc(func(e *Extension) {
|
|
e.enabled = value
|
|
})
|
|
}
|
|
|
|
// NewExtension creates a new math extension with the provided options
|
|
func NewExtension(renderInternal *internal.RenderInternal, opts ...Option) *Extension {
|
|
r := &Extension{
|
|
renderInternal: renderInternal,
|
|
enabled: true,
|
|
parseDollarBlock: true,
|
|
parseDollarInline: true,
|
|
}
|
|
|
|
for _, o := range opts {
|
|
o.SetOption(r)
|
|
}
|
|
return r
|
|
}
|
|
|
|
// Extend extends goldmark with our parsers and renderers
|
|
func (e *Extension) Extend(m goldmark.Markdown) {
|
|
if !e.enabled {
|
|
return
|
|
}
|
|
|
|
m.Parser().AddOptions(parser.WithBlockParsers(
|
|
util.Prioritized(NewBlockParser(e.parseDollarBlock), 701),
|
|
))
|
|
|
|
inlines := []util.PrioritizedValue{
|
|
util.Prioritized(NewInlineBracketParser(), 501),
|
|
}
|
|
if e.parseDollarInline {
|
|
inlines = append(inlines, util.Prioritized(NewInlineDollarParser(), 503),
|
|
util.Prioritized(NewInlineDualDollarParser(), 502))
|
|
}
|
|
m.Parser().AddOptions(parser.WithInlineParsers(inlines...))
|
|
|
|
m.Renderer().AddOptions(renderer.WithNodeRenderers(
|
|
util.Prioritized(NewBlockRenderer(e.renderInternal), 501),
|
|
util.Prioritized(NewInlineRenderer(e.renderInternal), 502),
|
|
))
|
|
}
|