package extension

import (
	

	
	gast 
	
	
	
	
	
	
)

var taskListRegexp = regexp.MustCompile(`^\[([\sxX])\]\s*`)

type taskCheckBoxParser struct {
}

var defaultTaskCheckBoxParser = &taskCheckBoxParser{}

// NewTaskCheckBoxParser returns a new  InlineParser that can parse
// checkboxes in list items.
// This parser must take precedence over the parser.LinkParser.
func () parser.InlineParser {
	return defaultTaskCheckBoxParser
}

func ( *taskCheckBoxParser) () []byte {
	return []byte{'['}
}

func ( *taskCheckBoxParser) ( gast.Node,  text.Reader,  parser.Context) gast.Node {
	// Given AST structure must be like
	// - List
	//   - ListItem         : parent.Parent
	//     - TextBlock      : parent
	//       (current line)
	if .Parent() == nil || .Parent().FirstChild() !=  {
		return nil
	}

	if .HasChildren() {
		return nil
	}
	if ,  := .Parent().(*gast.ListItem); ! {
		return nil
	}
	,  := .PeekLine()
	 := taskListRegexp.FindSubmatchIndex()
	if  == nil {
		return nil
	}
	 := [[2]:[3]][0]
	.Advance([1])
	 :=  == 'x' ||  == 'X'
	return ast.NewTaskCheckBox()
}

func ( *taskCheckBoxParser) ( gast.Node,  parser.Context) {
	// nothing to do
}

// TaskCheckBoxHTMLRenderer is a renderer.NodeRenderer implementation that
// renders checkboxes in list items.
type TaskCheckBoxHTMLRenderer struct {
	html.Config
}

// NewTaskCheckBoxHTMLRenderer returns a new TaskCheckBoxHTMLRenderer.
func ( ...html.Option) renderer.NodeRenderer {
	 := &TaskCheckBoxHTMLRenderer{
		Config: html.NewConfig(),
	}
	for ,  := range  {
		.SetHTMLOption(&.Config)
	}
	return 
}

// RegisterFuncs implements renderer.NodeRenderer.RegisterFuncs.
func ( *TaskCheckBoxHTMLRenderer) ( renderer.NodeRendererFuncRegisterer) {
	.Register(ast.KindTaskCheckBox, .renderTaskCheckBox)
}

func ( *TaskCheckBoxHTMLRenderer) (
	 util.BufWriter,  []byte,  gast.Node,  bool) (gast.WalkStatus, error) {
	if ! {
		return gast.WalkContinue, nil
	}
	 := .(*ast.TaskCheckBox)

	if .IsChecked {
		_, _ = .WriteString(`<input checked="" disabled="" type="checkbox"`)
	} else {
		_, _ = .WriteString(`<input disabled="" type="checkbox"`)
	}
	if .XHTML {
		_, _ = .WriteString(" /> ")
	} else {
		_, _ = .WriteString("> ")
	}
	return gast.WalkContinue, nil
}

type taskList struct {
}

// TaskList is an extension that allow you to use GFM task lists.
var TaskList = &taskList{}

func ( *taskList) ( goldmark.Markdown) {
	.Parser().AddOptions(parser.WithInlineParsers(
		util.Prioritized(NewTaskCheckBoxParser(), 0),
	))
	.Renderer().AddOptions(renderer.WithNodeRenderers(
		util.Prioritized(NewTaskCheckBoxHTMLRenderer(), 500),
	))
}