1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- // Copyright 2011 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package jade
- import (
- "bytes"
- "io"
- )
- // var textFormat = "%s" // Changed to "%q" in tests for better error messages.
- // A Node is an element in the parse tree. The interface is trivial.
- // The interface contains an unexported method so that only
- // types local to this package can satisfy it.
- type Node interface {
- Type() NodeType
- String() string
- WriteIn(io.Writer)
- // Copy does a deep copy of the Node and all its components.
- // To avoid type assertions, some XxxNodes also have specialized
- // CopyXxx methods that return *XxxNode.
- Copy() Node
- Position() Pos // byte position of start of node in full original input string
- // tree returns the containing *Tree.
- // It is unexported so all implementations of Node are in this package.
- tree() *Tree
- }
- // Pos represents a byte position in the original input text from which
- // this template was parsed.
- type Pos int
- func (p Pos) Position() Pos {
- return p
- }
- // Nodes.
- // ListNode holds a sequence of nodes.
- type ListNode struct {
- NodeType
- Pos
- tr *Tree
- Nodes []Node // The element nodes in lexical order.
- tab int
- }
- func (t *Tree) newList(pos Pos) *ListNode {
- return &ListNode{tr: t, NodeType: NodeList, Pos: pos, tab: t.tab}
- }
- func (l *ListNode) append(n Node) {
- l.Nodes = append(l.Nodes, n)
- }
- func (l *ListNode) tree() *Tree {
- return l.tr
- }
- func (l *ListNode) String() string {
- b := new(bytes.Buffer)
- l.WriteIn(b)
- return b.String()
- }
- func (l *ListNode) WriteIn(b io.Writer) {
- for _, n := range l.Nodes {
- n.WriteIn(b)
- }
- }
- func (l *ListNode) CopyList() *ListNode {
- if l == nil {
- return l
- }
- n := l.tr.newList(l.Pos)
- for _, elem := range l.Nodes {
- n.append(elem.Copy())
- }
- return n
- }
- func (l *ListNode) Copy() Node {
- return l.CopyList()
- }
|