package element import "go-mod.ewintr.nl/adoc/token" type Strong []Element func (st Strong) Text() string { var txt string for _, e := range st { txt += e.Text() } return txt } func (st Strong) Append(els []Element) Element { return append(st, els...) } type Emphasis []Element func (em Emphasis) Text() string { var txt string for _, e := range em { txt += e.Text() } return txt } func (em Emphasis) Append(els []Element) Element { return append(em, els...) } type Code []Element func (c Code) Text() string { var txt string for _, e := range c { txt += e.Text() } return txt } func (c Code) Append(els []Element) Element { return append(c, els...) } func NewStyleFromTokens(tr ReadUnreader) (ParseResult, bool) { toks, ok := tr.Read(2) if !ok { return ParseResult{}, false } markers := []token.Token{ {Type: token.TYPE_ASTERISK, Literal: "*"}, {Type: token.TYPE_UNDERSCORE, Literal: "_"}, {Type: token.TYPE_BACKTICK, Literal: "`"}, } if !toks[0].Equal(markers...) { tr.Unread(2) return ParseResult{}, false } if toks[1].Type == token.TYPE_WHITESPACE { tr.Unread(2) return ParseResult{}, false } marker := toks[0] toks = []token.Token{toks[1]} for { ntoks, ok := tr.Read(1) if !ok { tr.Unread(len(toks) + 1) return ParseResult{}, false } tok := ntoks[0] if tok.Equal(token.TOKEN_EOF, token.TOKEN_DOUBLE_NEWLINE) { tr.Unread(len(toks) + 1) return ParseResult{}, false } if tok.Equal(marker) { break } toks = append(toks, tok) } if toks[len(toks)-1].Type == token.TYPE_WHITESPACE { tr.Unread(len(toks) + 2) return ParseResult{}, false } var s Element switch marker.Type { case token.TYPE_ASTERISK: s = Strong{} case token.TYPE_UNDERSCORE: s = Emphasis{} case token.TYPE_BACKTICK: s = Code{} } return ParseResult{ Element: s, Inner: toks, }, true }