Djot markup language parser implemented in Go language
You can install godjot as a standalone binary:
$> go install github.com/sivukhin/godjot/v2@latest
$> echo '*Hello*, _world_' | godjot
<p><strong>Hello</strong>, <em>world</em></p>
godjot provides API to parse AST from djot string
var djot []byte
ast := djot_parser.BuildDjotAst(djot)
AST is loosely typed and described with following simple struct:
type TreeNode[T ~int] struct {
Type T // one of DjotNode options
Attributes tokenizer.Attributes // string attributes of node
Children []TreeNode[T] // list of child
Text []byte // not nil only for TextNode
}
You can transform AST to HTML with predefined set of rules:
content := djot_html.New().ConvertDjot(&djot_html.HtmlWriter{}, ast...).String()
Or, you can override some default conversion rules:
content := djot_html.New(
djot_html.DefaultConversionRegistry,
map[djot_parser.DjotNode]djot_parser.Conversion[*djot_html.HtmlWriter]{
djot_parser.ImageNode: func(state djot_parser.ConversionState[*djot_html.HtmlWriter], next func(c djot_parser.Children)) {
state.Writer.
OpenTag("figure").
OpenTag("img", state.Node.Attributes.Entries()...).
OpenTag("figcaption").
WriteString(state.Node.Attributes.Get(djot_parser.ImgAltKey)).
CloseTag("figcaption").
CloseTag("figure")
},
}
).ConvertDjot(&djot_html.HtmlWriter{}, ast...).String()
This implementation passes all examples provided in the spec but can diverge from original javascript implementation in some cases.