adoc/element/codeblock.go

55 lines
1.0 KiB
Go

package element
import (
"ewintr.nl/adoc/token"
)
type CodeBlock []Element
func (cb CodeBlock) Text() string {
txt := ""
for _, e := range cb {
txt += e.Text()
}
return txt
}
func (cb CodeBlock) Append(els []Element) Element {
return CodeBlock{append(cb, els...)}
}
func NewCodeBlockFromTokens(p ReadUnreader) (ParseResult, bool) {
delimiter := token.Token{Type: token.TYPE_DASH, Literal: "----"}
toks, ok := p.Read(2)
if !ok {
return ParseResult{}, false
}
if !toks[0].Equal(delimiter) || toks[1].Type != token.TYPE_NEWLINE {
p.Unread(2)
return ParseResult{}, false
}
for {
ntoks, ok := p.Read(2)
if !ok {
p.Unread(len(toks))
return ParseResult{}, false
}
if ntoks[0].Equal(delimiter) && (ntoks[1].Type == token.TYPE_NEWLINE || ntoks[1].Equal(token.TOKEN_EOF)) {
break
}
p.Unread(1)
toks = append(toks, ntoks[0])
}
cb := CodeBlock{}
for _, tok := range toks[2:] {
cb = append(cb, MakePlain(tok))
}
return ParseResult{
Element: cb,
Inner: []token.Token{},
}, true
}