Skip to content

sivukhin/godjot

Repository files navigation

godjot

Go Report Card Go Version

Djot markup language parser implemented in Go language

Installation

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>

Usage

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.