summaryrefslogtreecommitdiff
path: root/vendor/github.com/yuin/goldmark/ast/ast.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/yuin/goldmark/ast/ast.go')
-rw-r--r--vendor/github.com/yuin/goldmark/ast/ast.go521
1 files changed, 0 insertions, 521 deletions
diff --git a/vendor/github.com/yuin/goldmark/ast/ast.go b/vendor/github.com/yuin/goldmark/ast/ast.go
deleted file mode 100644
index 36ba606f7..000000000
--- a/vendor/github.com/yuin/goldmark/ast/ast.go
+++ /dev/null
@@ -1,521 +0,0 @@
-// Package ast defines AST nodes that represent markdown elements.
-package ast
-
-import (
- "bytes"
- "fmt"
- "strings"
-
- textm "github.com/yuin/goldmark/text"
- "github.com/yuin/goldmark/util"
-)
-
-// A NodeType indicates what type a node belongs to.
-type NodeType int
-
-const (
- // TypeBlock indicates that a node is kind of block nodes.
- TypeBlock NodeType = iota + 1
- // TypeInline indicates that a node is kind of inline nodes.
- TypeInline
- // TypeDocument indicates that a node is kind of document nodes.
- TypeDocument
-)
-
-// NodeKind indicates more specific type than NodeType.
-type NodeKind int
-
-func (k NodeKind) String() string {
- return kindNames[k]
-}
-
-var kindMax NodeKind
-var kindNames = []string{""}
-
-// NewNodeKind returns a new Kind value.
-func NewNodeKind(name string) NodeKind {
- kindMax++
- kindNames = append(kindNames, name)
- return kindMax
-}
-
-// An Attribute is an attribute of the Node.
-type Attribute struct {
- Name []byte
- Value interface{}
-}
-
-// A Node interface defines basic AST node functionalities.
-type Node interface {
- // Type returns a type of this node.
- Type() NodeType
-
- // Kind returns a kind of this node.
- Kind() NodeKind
-
- // NextSibling returns a next sibling node of this node.
- NextSibling() Node
-
- // PreviousSibling returns a previous sibling node of this node.
- PreviousSibling() Node
-
- // Parent returns a parent node of this node.
- Parent() Node
-
- // SetParent sets a parent node to this node.
- SetParent(Node)
-
- // SetPreviousSibling sets a previous sibling node to this node.
- SetPreviousSibling(Node)
-
- // SetNextSibling sets a next sibling node to this node.
- SetNextSibling(Node)
-
- // HasChildren returns true if this node has any children, otherwise false.
- HasChildren() bool
-
- // ChildCount returns a total number of children.
- ChildCount() int
-
- // FirstChild returns a first child of this node.
- FirstChild() Node
-
- // LastChild returns a last child of this node.
- LastChild() Node
-
- // AppendChild append a node child to the tail of the children.
- AppendChild(self, child Node)
-
- // RemoveChild removes a node child from this node.
- // If a node child is not children of this node, RemoveChild nothing to do.
- RemoveChild(self, child Node)
-
- // RemoveChildren removes all children from this node.
- RemoveChildren(self Node)
-
- // SortChildren sorts childrens by comparator.
- SortChildren(comparator func(n1, n2 Node) int)
-
- // ReplaceChild replace a node v1 with a node insertee.
- // If v1 is not children of this node, ReplaceChild append a insetee to the
- // tail of the children.
- ReplaceChild(self, v1, insertee Node)
-
- // InsertBefore inserts a node insertee before a node v1.
- // If v1 is not children of this node, InsertBefore append a insetee to the
- // tail of the children.
- InsertBefore(self, v1, insertee Node)
-
- // InsertAfterinserts a node insertee after a node v1.
- // If v1 is not children of this node, InsertBefore append a insetee to the
- // tail of the children.
- InsertAfter(self, v1, insertee Node)
-
- // OwnerDocument returns this node's owner document.
- // If this node is not a child of the Document node, OwnerDocument
- // returns nil.
- OwnerDocument() *Document
-
- // Dump dumps an AST tree structure to stdout.
- // This function completely aimed for debugging.
- // level is a indent level. Implementer should indent informations with
- // 2 * level spaces.
- Dump(source []byte, level int)
-
- // Text returns text values of this node.
- // This method is valid only for some inline nodes.
- // If this node is a block node, Text returns a text value as reasonable as possible.
- // Notice that there are no 'correct' text values for the block nodes.
- // Result for the block nodes may be different from your expectation.
- //
- // Deprecated: Use other properties of the node to get the text value(i.e. Pragraph.Lines, Text.Value).
- Text(source []byte) []byte
-
- // HasBlankPreviousLines returns true if the row before this node is blank,
- // otherwise false.
- // This method is valid only for block nodes.
- HasBlankPreviousLines() bool
-
- // SetBlankPreviousLines sets whether the row before this node is blank.
- // This method is valid only for block nodes.
- SetBlankPreviousLines(v bool)
-
- // Lines returns text segments that hold positions in a source.
- // This method is valid only for block nodes.
- Lines() *textm.Segments
-
- // SetLines sets text segments that hold positions in a source.
- // This method is valid only for block nodes.
- SetLines(*textm.Segments)
-
- // IsRaw returns true if contents should be rendered as 'raw' contents.
- IsRaw() bool
-
- // SetAttribute sets the given value to the attributes.
- SetAttribute(name []byte, value interface{})
-
- // SetAttributeString sets the given value to the attributes.
- SetAttributeString(name string, value interface{})
-
- // Attribute returns a (attribute value, true) if an attribute
- // associated with the given name is found, otherwise
- // (nil, false)
- Attribute(name []byte) (interface{}, bool)
-
- // AttributeString returns a (attribute value, true) if an attribute
- // associated with the given name is found, otherwise
- // (nil, false)
- AttributeString(name string) (interface{}, bool)
-
- // Attributes returns a list of attributes.
- // This may be a nil if there are no attributes.
- Attributes() []Attribute
-
- // RemoveAttributes removes all attributes from this node.
- RemoveAttributes()
-}
-
-// A BaseNode struct implements the Node interface partialliy.
-type BaseNode struct {
- firstChild Node
- lastChild Node
- parent Node
- next Node
- prev Node
- childCount int
- attributes []Attribute
-}
-
-func ensureIsolated(v Node) {
- if p := v.Parent(); p != nil {
- p.RemoveChild(p, v)
- }
-}
-
-// HasChildren implements Node.HasChildren .
-func (n *BaseNode) HasChildren() bool {
- return n.firstChild != nil
-}
-
-// SetPreviousSibling implements Node.SetPreviousSibling .
-func (n *BaseNode) SetPreviousSibling(v Node) {
- n.prev = v
-}
-
-// SetNextSibling implements Node.SetNextSibling .
-func (n *BaseNode) SetNextSibling(v Node) {
- n.next = v
-}
-
-// PreviousSibling implements Node.PreviousSibling .
-func (n *BaseNode) PreviousSibling() Node {
- return n.prev
-}
-
-// NextSibling implements Node.NextSibling .
-func (n *BaseNode) NextSibling() Node {
- return n.next
-}
-
-// RemoveChild implements Node.RemoveChild .
-func (n *BaseNode) RemoveChild(self, v Node) {
- if v.Parent() != self {
- return
- }
- n.childCount--
- prev := v.PreviousSibling()
- next := v.NextSibling()
- if prev != nil {
- prev.SetNextSibling(next)
- } else {
- n.firstChild = next
- }
- if next != nil {
- next.SetPreviousSibling(prev)
- } else {
- n.lastChild = prev
- }
- v.SetParent(nil)
- v.SetPreviousSibling(nil)
- v.SetNextSibling(nil)
-}
-
-// RemoveChildren implements Node.RemoveChildren .
-func (n *BaseNode) RemoveChildren(self Node) {
- for c := n.firstChild; c != nil; {
- c.SetParent(nil)
- c.SetPreviousSibling(nil)
- next := c.NextSibling()
- c.SetNextSibling(nil)
- c = next
- }
- n.firstChild = nil
- n.lastChild = nil
- n.childCount = 0
-}
-
-// SortChildren implements Node.SortChildren.
-func (n *BaseNode) SortChildren(comparator func(n1, n2 Node) int) {
- var sorted Node
- current := n.firstChild
- for current != nil {
- next := current.NextSibling()
- if sorted == nil || comparator(sorted, current) >= 0 {
- current.SetNextSibling(sorted)
- if sorted != nil {
- sorted.SetPreviousSibling(current)
- }
- sorted = current
- sorted.SetPreviousSibling(nil)
- } else {
- c := sorted
- for c.NextSibling() != nil && comparator(c.NextSibling(), current) < 0 {
- c = c.NextSibling()
- }
- current.SetNextSibling(c.NextSibling())
- current.SetPreviousSibling(c)
- if c.NextSibling() != nil {
- c.NextSibling().SetPreviousSibling(current)
- }
- c.SetNextSibling(current)
- }
- current = next
- }
- n.firstChild = sorted
- for c := n.firstChild; c != nil; c = c.NextSibling() {
- n.lastChild = c
- }
-}
-
-// FirstChild implements Node.FirstChild .
-func (n *BaseNode) FirstChild() Node {
- return n.firstChild
-}
-
-// LastChild implements Node.LastChild .
-func (n *BaseNode) LastChild() Node {
- return n.lastChild
-}
-
-// ChildCount implements Node.ChildCount .
-func (n *BaseNode) ChildCount() int {
- return n.childCount
-}
-
-// Parent implements Node.Parent .
-func (n *BaseNode) Parent() Node {
- return n.parent
-}
-
-// SetParent implements Node.SetParent .
-func (n *BaseNode) SetParent(v Node) {
- n.parent = v
-}
-
-// AppendChild implements Node.AppendChild .
-func (n *BaseNode) AppendChild(self, v Node) {
- ensureIsolated(v)
- if n.firstChild == nil {
- n.firstChild = v
- v.SetNextSibling(nil)
- v.SetPreviousSibling(nil)
- } else {
- last := n.lastChild
- last.SetNextSibling(v)
- v.SetPreviousSibling(last)
- }
- v.SetParent(self)
- n.lastChild = v
- n.childCount++
-}
-
-// ReplaceChild implements Node.ReplaceChild .
-func (n *BaseNode) ReplaceChild(self, v1, insertee Node) {
- n.InsertBefore(self, v1, insertee)
- n.RemoveChild(self, v1)
-}
-
-// InsertAfter implements Node.InsertAfter .
-func (n *BaseNode) InsertAfter(self, v1, insertee Node) {
- n.InsertBefore(self, v1.NextSibling(), insertee)
-}
-
-// InsertBefore implements Node.InsertBefore .
-func (n *BaseNode) InsertBefore(self, v1, insertee Node) {
- n.childCount++
- if v1 == nil {
- n.AppendChild(self, insertee)
- return
- }
- ensureIsolated(insertee)
- if v1.Parent() == self {
- c := v1
- prev := c.PreviousSibling()
- if prev != nil {
- prev.SetNextSibling(insertee)
- insertee.SetPreviousSibling(prev)
- } else {
- n.firstChild = insertee
- insertee.SetPreviousSibling(nil)
- }
- insertee.SetNextSibling(c)
- c.SetPreviousSibling(insertee)
- insertee.SetParent(self)
- }
-}
-
-// OwnerDocument implements Node.OwnerDocument.
-func (n *BaseNode) OwnerDocument() *Document {
- d := n.Parent()
- for {
- p := d.Parent()
- if p == nil {
- if v, ok := d.(*Document); ok {
- return v
- }
- break
- }
- d = p
- }
- return nil
-}
-
-// Text implements Node.Text .
-//
-// Deprecated: Use other properties of the node to get the text value(i.e. Pragraph.Lines, Text.Value).
-func (n *BaseNode) Text(source []byte) []byte {
- var buf bytes.Buffer
- for c := n.firstChild; c != nil; c = c.NextSibling() {
- buf.Write(c.Text(source))
- if sb, ok := c.(interface {
- SoftLineBreak() bool
- }); ok && sb.SoftLineBreak() {
- buf.WriteByte('\n')
- }
- }
- return buf.Bytes()
-}
-
-// SetAttribute implements Node.SetAttribute.
-func (n *BaseNode) SetAttribute(name []byte, value interface{}) {
- if n.attributes == nil {
- n.attributes = make([]Attribute, 0, 10)
- } else {
- for i, a := range n.attributes {
- if bytes.Equal(a.Name, name) {
- n.attributes[i].Name = name
- n.attributes[i].Value = value
- return
- }
- }
- }
- n.attributes = append(n.attributes, Attribute{name, value})
-}
-
-// SetAttributeString implements Node.SetAttributeString.
-func (n *BaseNode) SetAttributeString(name string, value interface{}) {
- n.SetAttribute(util.StringToReadOnlyBytes(name), value)
-}
-
-// Attribute implements Node.Attribute.
-func (n *BaseNode) Attribute(name []byte) (interface{}, bool) {
- if n.attributes == nil {
- return nil, false
- }
- for i, a := range n.attributes {
- if bytes.Equal(a.Name, name) {
- return n.attributes[i].Value, true
- }
- }
- return nil, false
-}
-
-// AttributeString implements Node.AttributeString.
-func (n *BaseNode) AttributeString(s string) (interface{}, bool) {
- return n.Attribute(util.StringToReadOnlyBytes(s))
-}
-
-// Attributes implements Node.Attributes.
-func (n *BaseNode) Attributes() []Attribute {
- return n.attributes
-}
-
-// RemoveAttributes implements Node.RemoveAttributes.
-func (n *BaseNode) RemoveAttributes() {
- n.attributes = nil
-}
-
-// DumpHelper is a helper function to implement Node.Dump.
-// kv is pairs of an attribute name and an attribute value.
-// cb is a function called after wrote a name and attributes.
-func DumpHelper(v Node, source []byte, level int, kv map[string]string, cb func(int)) {
- name := v.Kind().String()
- indent := strings.Repeat(" ", level)
- fmt.Printf("%s%s {\n", indent, name)
- indent2 := strings.Repeat(" ", level+1)
- if v.Type() == TypeBlock {
- fmt.Printf("%sRawText: \"", indent2)
- for i := 0; i < v.Lines().Len(); i++ {
- line := v.Lines().At(i)
- fmt.Printf("%s", line.Value(source))
- }
- fmt.Printf("\"\n")
- fmt.Printf("%sHasBlankPreviousLines: %v\n", indent2, v.HasBlankPreviousLines())
- }
- for name, value := range kv {
- fmt.Printf("%s%s: %s\n", indent2, name, value)
- }
- if cb != nil {
- cb(level + 1)
- }
- for c := v.FirstChild(); c != nil; c = c.NextSibling() {
- c.Dump(source, level+1)
- }
- fmt.Printf("%s}\n", indent)
-}
-
-// WalkStatus represents a current status of the Walk function.
-type WalkStatus int
-
-const (
- // WalkStop indicates no more walking needed.
- WalkStop WalkStatus = iota + 1
-
- // WalkSkipChildren indicates that Walk wont walk on children of current
- // node.
- WalkSkipChildren
-
- // WalkContinue indicates that Walk can continue to walk.
- WalkContinue
-)
-
-// Walker is a function that will be called when Walk find a
-// new node.
-// entering is set true before walks children, false after walked children.
-// If Walker returns error, Walk function immediately stop walking.
-type Walker func(n Node, entering bool) (WalkStatus, error)
-
-// Walk walks a AST tree by the depth first search algorithm.
-func Walk(n Node, walker Walker) error {
- _, err := walkHelper(n, walker)
- return err
-}
-
-func walkHelper(n Node, walker Walker) (WalkStatus, error) {
- status, err := walker(n, true)
- if err != nil || status == WalkStop {
- return status, err
- }
- if status != WalkSkipChildren {
- for c := n.FirstChild(); c != nil; c = c.NextSibling() {
- if st, err := walkHelper(c, walker); err != nil || st == WalkStop {
- return WalkStop, err
- }
- }
- }
- status, err = walker(n, false)
- if err != nil || status == WalkStop {
- return WalkStop, err
- }
- return WalkContinue, nil
-}