djot_html

package
v2.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 21, 2025 License: MIT Imports: 8 Imported by: 2

Documentation

Index

Constants

This section is empty.

Variables

View Source
var DefaultConversionRegistry = map[DjotNode]Conversion[*HtmlWriter]{
	ThematicBreakNode: func(s ConversionState[*HtmlWriter], n func(c Children)) { s.Writer.OpenTag("hr").WriteString("\n") },
	LineBreakNode:     func(s ConversionState[*HtmlWriter], n func(c Children)) { s.Writer.OpenTag("br").WriteString("\n") },
	TextNode: func(s ConversionState[*HtmlWriter], n func(c Children)) {
		if s.Parent != nil && (s.Parent.Attributes.Get(RawInlineFormatKey) == s.Format || s.Parent.Attributes.Get(RawBlockFormatKey) == s.Format) {
			s.Writer.WriteString(string(s.Node.Text))
		} else {
			s.Writer.WriteString(htmlReplacer.Replace(string(s.Node.Text)))
		}
	},
	SymbolsNode: func(s ConversionState[*HtmlWriter], n func(c Children)) {
		symbol, ok := defaultSymbolRegistry[string(s.Node.FullText())]
		if ok {
			s.Writer.WriteString(symbol)
		} else {
			s.Writer.WriteString(fmt.Sprintf(":%v:", string(s.Node.FullText())))
		}
	},
	InsertNode:      func(s ConversionState[*HtmlWriter], n func(c Children)) { InlineNodeConverter(s, "ins", n) },
	DeleteNode:      func(s ConversionState[*HtmlWriter], n func(c Children)) { InlineNodeConverter(s, "del", n) },
	SuperscriptNode: func(s ConversionState[*HtmlWriter], n func(c Children)) { InlineNodeConverter(s, "sup", n) },
	SubscriptNode:   func(s ConversionState[*HtmlWriter], n func(c Children)) { InlineNodeConverter(s, "sub", n) },
	HighlightedNode: func(s ConversionState[*HtmlWriter], n func(c Children)) { InlineNodeConverter(s, "mark", n) },
	EmphasisNode:    func(s ConversionState[*HtmlWriter], n func(c Children)) { InlineNodeConverter(s, "em", n) },
	StrongNode:      func(s ConversionState[*HtmlWriter], n func(c Children)) { InlineNodeConverter(s, "strong", n) },
	ParagraphNode: func(s ConversionState[*HtmlWriter], n func(c Children)) {
		InlineNodeConverter(s, "p", n).WriteString("\n")
	},
	ImageNode:        func(s ConversionState[*HtmlWriter], n func(c Children)) { StandaloneNodeConverter(s, "img") },
	LinkNode:         func(s ConversionState[*HtmlWriter], n func(c Children)) { InlineNodeConverter(s, "a", n) },
	SpanNode:         func(s ConversionState[*HtmlWriter], n func(c Children)) { InlineNodeConverter(s, "span", n) },
	DivNode:          func(s ConversionState[*HtmlWriter], n func(c Children)) { BlockNodeConverter(s, "div", n) },
	TableCaptionNode: func(s ConversionState[*HtmlWriter], n func(c Children)) { n(nil) },
	TableNode: func(s ConversionState[*HtmlWriter], n func(c Children)) {
		if len(s.Node.Children) > 0 && s.Node.Children[0].Type == TableCaptionNode {
			s.Writer.OpenTag("table", s.Node.Attributes.Entries()...)
			s.Writer.WriteString("\n")
			s.Writer.InTag("caption")(func() { n(s.Node.Children[:1]) })
			s.Writer.WriteString("\n")
			s.Writer.InTag("tbody")(func() { n(s.Node.Children[1:]) })
			s.Writer.CloseTag("table")
		} else {
			BlockNodeConverter(s, "table", n)
		}
	},
	TableRowNode: func(s ConversionState[*HtmlWriter], n func(c Children)) { BlockNodeConverter(s, "tr", n) },
	TableHeaderNode: func(s ConversionState[*HtmlWriter], n func(c Children)) {
		InlineNodeConverter(s, "th", n)
		s.Writer.WriteString("\n")
	},
	TableCellNode: func(s ConversionState[*HtmlWriter], n func(c Children)) {
		InlineNodeConverter(s, "td", n)
		s.Writer.WriteString("\n")
	},
	TaskListNode:       func(s ConversionState[*HtmlWriter], n func(c Children)) { BlockNodeConverter(s, "ul", n) },
	DefinitionListNode: func(s ConversionState[*HtmlWriter], n func(c Children)) { BlockNodeConverter(s, "dl", n) },
	UnorderedListNode:  func(s ConversionState[*HtmlWriter], n func(c Children)) { BlockNodeConverter(s, "ul", n) },
	OrderedListNode:    func(s ConversionState[*HtmlWriter], n func(c Children)) { BlockNodeConverter(s, "ol", n) },
	ListItemNode: func(s ConversionState[*HtmlWriter], n func(c Children)) {
		class := s.Node.Attributes.Get(djot_tokenizer.DjotAttributeClassKey)
		if class == CheckedTaskItemClass || class == UncheckedTaskItemClass {
			s.Writer.InTag("li")(func() {
				s.Writer.WriteString("\n")
				s.Writer.WriteString("<input disabled=\"\" type=\"checkbox\"")
				if class == CheckedTaskItemClass {
					s.Writer.WriteString(" checked=\"\"")
				}
				s.Writer.WriteString("/>").WriteString("\n")
				n(s.Node.Children)
			}).WriteString("\n")
		} else {
			BlockNodeConverter(s, "li", n)
		}
	},
	DefinitionTermNode: func(s ConversionState[*HtmlWriter], n func(c Children)) {
		InlineNodeConverter(s, "dt", n)
		s.Writer.WriteString("\n")
	},
	DefinitionItemNode: func(s ConversionState[*HtmlWriter], n func(c Children)) { BlockNodeConverter(s, "dd", n) },
	SectionNode:        func(s ConversionState[*HtmlWriter], n func(c Children)) { BlockNodeConverter(s, "section", n) },
	QuoteNode:          func(s ConversionState[*HtmlWriter], n func(c Children)) { BlockNodeConverter(s, "blockquote", n) },
	DocumentNode:       func(s ConversionState[*HtmlWriter], n func(c Children)) { n(nil) },
	FootnoteDefNode:    func(s ConversionState[*HtmlWriter], n func(c Children)) { n(nil) },
	CodeNode: func(s ConversionState[*HtmlWriter], n func(c Children)) {
		s.Writer.OpenTag("pre").OpenTag("code", s.Node.Attributes.Entries()...)
		n(nil)
		s.Writer.CloseTag("code").CloseTag("pre").WriteString("\n")
	},
	VerbatimNode: func(s ConversionState[*HtmlWriter], n func(c Children)) {
		if _, ok := s.Node.Attributes.TryGet(djot_tokenizer.InlineMathKey); ok {
			attributes := append([]tokenizer.AttributeEntry{{Key: "class", Value: "math inline"}}, s.Node.Attributes.Entries()...)
			s.Writer.InTag("span", attributes...)(func() {
				s.Writer.WriteString("\\(")
				n(nil)
				s.Writer.WriteString("\\)")
			})
		} else if _, ok := s.Node.Attributes.TryGet(djot_tokenizer.DisplayMathKey); ok {
			attributes := append([]tokenizer.AttributeEntry{{Key: "class", Value: "math display"}}, s.Node.Attributes.Entries()...)
			s.Writer.InTag("span", attributes...)(func() {
				s.Writer.WriteString("\\[")
				n(nil)
				s.Writer.WriteString("\\]")
			})
		} else if rawFormat := s.Node.Attributes.Get(RawInlineFormatKey); rawFormat == s.Format {
			n(nil)
		} else {
			s.Writer.InTag("code", s.Node.Attributes.Entries()...)(func() { n(nil) })
		}
	},
	HeadingNode: func(s ConversionState[*HtmlWriter], n func(c Children)) {
		level := len(s.Node.Attributes.Get(HeadingLevelKey))
		s.Writer.InTag(fmt.Sprintf("h%v", level), s.Node.Attributes.Entries()...)(func() { n(nil) }).WriteString("\n")
	},
	RawNode: func(s ConversionState[*HtmlWriter], next func(c Children)) {
		if s.Format == s.Node.Attributes.Get(RawBlockFormatKey) {
			next(nil)
		}
	},
}

Functions

func New

func New(converters ...map[DjotNode]Conversion[*HtmlWriter]) ConversionContext[*HtmlWriter]

Types

type HtmlWriter

type HtmlWriter struct {
	Builder     strings.Builder
	Indentation int
	TabSize     int
	InContent   bool
	InPre       bool
}

func BlockNodeConverter

func BlockNodeConverter(state ConversionState[*HtmlWriter], tag string, next func(c Children)) *HtmlWriter

func InlineNodeConverter

func InlineNodeConverter(state ConversionState[*HtmlWriter], tag string, next func(c Children)) *HtmlWriter

func StandaloneNodeConverter

func StandaloneNodeConverter(state ConversionState[*HtmlWriter], tag string) *HtmlWriter

func (*HtmlWriter) CloseTag

func (w *HtmlWriter) CloseTag(tag string) *HtmlWriter

func (*HtmlWriter) InTag

func (w *HtmlWriter) InTag(tag string, attributes ...tokenizer.AttributeEntry) func(func()) *HtmlWriter

func (*HtmlWriter) OpenTag

func (w *HtmlWriter) OpenTag(tag string, attributes ...tokenizer.AttributeEntry) *HtmlWriter

func (*HtmlWriter) String

func (w *HtmlWriter) String() string

func (*HtmlWriter) WriteBytes

func (w *HtmlWriter) WriteBytes(text []byte) *HtmlWriter

func (*HtmlWriter) WriteString

func (w *HtmlWriter) WriteString(text string) *HtmlWriter

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL