package extension
import (
"regexp"
"github.com/yuin/goldmark"
gast "github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/extension/ast"
"github.com/yuin/goldmark/parser"
"github.com/yuin/goldmark/renderer"
"github.com/yuin/goldmark/renderer/html"
"github.com/yuin/goldmark/text"
"github.com/yuin/goldmark/util"
)
var taskListRegexp = regexp .MustCompile (`^\[([\sxX])\]\s*` )
type taskCheckBoxParser struct {
}
var defaultTaskCheckBoxParser = &taskCheckBoxParser {}
func NewTaskCheckBoxParser () parser .InlineParser {
return defaultTaskCheckBoxParser
}
func (s *taskCheckBoxParser ) Trigger () []byte {
return []byte {'[' }
}
func (s *taskCheckBoxParser ) Parse (parent gast .Node , block text .Reader , pc parser .Context ) gast .Node {
if parent .Parent () == nil || parent .Parent ().FirstChild () != parent {
return nil
}
if parent .HasChildren () {
return nil
}
if _ , ok := parent .Parent ().(*gast .ListItem ); !ok {
return nil
}
line , _ := block .PeekLine ()
m := taskListRegexp .FindSubmatchIndex (line )
if m == nil {
return nil
}
value := line [m [2 ]:m [3 ]][0 ]
block .Advance (m [1 ])
checked := value == 'x' || value == 'X'
return ast .NewTaskCheckBox (checked )
}
func (s *taskCheckBoxParser ) CloseBlock (parent gast .Node , pc parser .Context ) {
}
type TaskCheckBoxHTMLRenderer struct {
html .Config
}
func NewTaskCheckBoxHTMLRenderer (opts ...html .Option ) renderer .NodeRenderer {
r := &TaskCheckBoxHTMLRenderer {
Config : html .NewConfig (),
}
for _ , opt := range opts {
opt .SetHTMLOption (&r .Config )
}
return r
}
func (r *TaskCheckBoxHTMLRenderer ) RegisterFuncs (reg renderer .NodeRendererFuncRegisterer ) {
reg .Register (ast .KindTaskCheckBox , r .renderTaskCheckBox )
}
func (r *TaskCheckBoxHTMLRenderer ) renderTaskCheckBox (
w util .BufWriter , source []byte , node gast .Node , entering bool ) (gast .WalkStatus , error ) {
if !entering {
return gast .WalkContinue , nil
}
n := node .(*ast .TaskCheckBox )
if n .IsChecked {
_, _ = w .WriteString (`<input checked="" disabled="" type="checkbox"` )
} else {
_, _ = w .WriteString (`<input disabled="" type="checkbox"` )
}
if r .XHTML {
_, _ = w .WriteString (" /> " )
} else {
_, _ = w .WriteString ("> " )
}
return gast .WalkContinue , nil
}
type taskList struct {
}
var TaskList = &taskList {}
func (e *taskList ) Extend (m goldmark .Markdown ) {
m .Parser ().AddOptions (parser .WithInlineParsers (
util .Prioritized (NewTaskCheckBoxParser (), 0 ),
))
m .Renderer ().AddOptions (renderer .WithNodeRenderers (
util .Prioritized (NewTaskCheckBoxHTMLRenderer (), 500 ),
))
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .