61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
|
// Copyright 2015 Frustra. All rights reserved.
|
||
|
// Use of this source code is governed by the MIT
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package bbcode
|
||
|
|
||
|
type BBCodeNode struct {
|
||
|
Token
|
||
|
Parent *BBCodeNode
|
||
|
Children []*BBCodeNode
|
||
|
ClosingTag *BBClosingTag
|
||
|
|
||
|
Compiler *Compiler
|
||
|
Info interface{}
|
||
|
}
|
||
|
|
||
|
func (n *BBCodeNode) GetOpeningTag() *BBOpeningTag {
|
||
|
if tag, ok := n.Value.(BBOpeningTag); ok {
|
||
|
return &tag
|
||
|
} else {
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (n *BBCodeNode) appendChild(t Token) *BBCodeNode {
|
||
|
if t.ID == CLOSING_TAG {
|
||
|
curr := n
|
||
|
closing := t.Value.(BBClosingTag)
|
||
|
for curr.Parent != nil {
|
||
|
if curr.ID == OPENING_TAG && curr.Value.(BBOpeningTag).Name == closing.Name {
|
||
|
curr.ClosingTag = &closing
|
||
|
return curr.Parent
|
||
|
}
|
||
|
curr = curr.Parent
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Join consecutive TEXT tokens
|
||
|
if len(n.Children) == 0 && t.ID == TEXT && n.ID == TEXT {
|
||
|
n.Value = n.Value.(string) + t.Value.(string)
|
||
|
return n
|
||
|
}
|
||
|
|
||
|
node := &BBCodeNode{t, n, make([]*BBCodeNode, 0, 5), nil, nil, nil}
|
||
|
n.Children = append(n.Children, node)
|
||
|
if t.ID == OPENING_TAG {
|
||
|
return node
|
||
|
} else {
|
||
|
return n
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Parse(tokens chan Token) *BBCodeNode {
|
||
|
root := &BBCodeNode{Token{TEXT, ""}, nil, make([]*BBCodeNode, 0, 5), nil, nil, nil}
|
||
|
curr := root
|
||
|
for tok := range tokens {
|
||
|
curr = curr.appendChild(tok)
|
||
|
}
|
||
|
return root
|
||
|
}
|