1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
package converter
import "sync"
type Converter struct {
m sync.RWMutex
err error
registeredPlugins []string
preRenderHandlers prioritizedSlice[HandlePreRenderFunc]
renderHandlers prioritizedSlice[HandleRenderFunc]
postRenderHandlers prioritizedSlice[HandlePostRenderFunc]
textTransformHandlers prioritizedSlice[HandleTextTransformFunc]
markdownChars map[rune]interface{}
unEscapeHandlers prioritizedSlice[HandleUnEscapeFunc]
tagTypes map[string]prioritizedSlice[tagType]
escapeMode escapeMode
Register register
}
type converterOption = func(c *Converter) error
func NewConverter(opts ...converterOption) *Converter {
conv := &Converter{
markdownChars: make(map[rune]interface{}),
tagTypes: make(map[string]prioritizedSlice[tagType]),
}
conv.Register = register{conv}
for _, opt := range opts {
err := opt(conv)
if err != nil {
conv.setError(err)
break
}
}
return conv
}
type escapeMode string
const (
EscapeModeDisabled escapeMode = "disabled"
EscapeModeSmart escapeMode = "smart"
)
// WithEscapeMode changes the strictness of the "escaping".
//
// Some characters have a special meaning in markdown.
// For example, the character "*" can be used for lists, emphasis and dividers.
// By placing a backlash before that character (e.g. "\*") you can "escape" it.
// Then the character will render as a raw "*" without the "markdown meaning" applied.
//
// Learn more in the documentation
//
// "disabled" or "smart"
//
// default: "smart"
func WithEscapeMode(mode escapeMode) converterOption {
return func(c *Converter) error {
c.escapeMode = mode
return nil
}
}
|