86 lines · 1.9 KB · Go
RawDownload
// Copyright 2022 The Gitea Authors. All rights reserved.// SPDX-License-Identifier: MIT package math import (	"github.com/yuin/goldmark"	"github.com/yuin/goldmark/parser"	"github.com/yuin/goldmark/renderer"	"github.com/yuin/goldmark/util") // Extension is a math extensiontype Extension struct {	enabled           bool	parseDollarInline bool	parseDollarBlock  bool} // Option is the interface Options should implementtype Option interface {	SetOption(e *Extension)} type extensionFunc func(e *Extension) func (fn extensionFunc) SetOption(e *Extension) {	fn(e)} // Enabled enables or disables this extensionfunc Enabled(enable ...bool) Option {	value := true	if len(enable) > 0 {		value = enable[0]	}	return extensionFunc(func(e *Extension) {		e.enabled = value	})} // Math represents a math extension with default rendered delimitersvar Math = &Extension{	enabled:           true,	parseDollarBlock:  true,	parseDollarInline: true,} // NewExtension creates a new math extension with the provided optionsfunc NewExtension(opts ...Option) *Extension {	r := &Extension{		enabled:           true,		parseDollarBlock:  true,		parseDollarInline: true,	} 	for _, o := range opts {		o.SetOption(r)	}	return r} // Extend extends goldmark with our parsers and renderersfunc (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(), 501),		util.Prioritized(NewInlineRenderer(), 502),	))}