73 lines
1.4 KiB
Go
73 lines
1.4 KiB
Go
|
package element
|
||
|
|
||
|
import (
|
||
|
"ewintr.nl/adoc/token"
|
||
|
)
|
||
|
|
||
|
type Link struct {
|
||
|
URL string
|
||
|
Title string
|
||
|
}
|
||
|
|
||
|
func (l Link) Text() string { return l.Title }
|
||
|
func (l Link) Append(_ []Element) Element { return l }
|
||
|
|
||
|
func NewLinkFromTokens(tr ReadUnreader) (ParseResult, bool) {
|
||
|
tok, ok := tr.Read(1)
|
||
|
if !ok {
|
||
|
return ParseResult{}, false
|
||
|
}
|
||
|
tr.Unread(1)
|
||
|
if tok[0].Type != token.TYPE_WORD {
|
||
|
return ParseResult{}, false
|
||
|
}
|
||
|
|
||
|
url, title := []token.Token{}, []token.Token{}
|
||
|
lb := false
|
||
|
count := 0
|
||
|
for {
|
||
|
ntoks, ok := tr.Read(1)
|
||
|
if !ok {
|
||
|
tr.Unread(count)
|
||
|
return ParseResult{}, false
|
||
|
}
|
||
|
count++
|
||
|
tok := ntoks[0]
|
||
|
if tok.Equal(token.TOKEN_EOF, token.TOKEN_EOS, token.TOKEN_NEWLINE, token.TOKEN_DOUBLE_NEWLINE) {
|
||
|
tr.Unread(count)
|
||
|
return ParseResult{}, false
|
||
|
}
|
||
|
if !lb && tok.Type == token.TYPE_WHITESPACE {
|
||
|
tr.Unread(count)
|
||
|
return ParseResult{}, false
|
||
|
}
|
||
|
if tok.Equal(token.Token{Type: token.TYPE_BRACKETOPEN, Literal: "["}) {
|
||
|
lb = true
|
||
|
continue
|
||
|
}
|
||
|
if lb && tok.Equal(token.Token{Type: token.TYPE_BRACKETCLOSE, Literal: "]"}) {
|
||
|
break
|
||
|
}
|
||
|
|
||
|
if lb {
|
||
|
title = append(title, tok)
|
||
|
continue
|
||
|
}
|
||
|
url = append(url, tok)
|
||
|
}
|
||
|
|
||
|
if len(url) == 0 || !lb {
|
||
|
tr.Unread(count)
|
||
|
return ParseResult{}, false
|
||
|
}
|
||
|
link := Link{
|
||
|
URL: token.Literals(url),
|
||
|
Title: token.Literals(title),
|
||
|
}
|
||
|
|
||
|
return ParseResult{
|
||
|
Element: link,
|
||
|
Inner: []token.Token{},
|
||
|
}, true
|
||
|
}
|