Fix list item parsing and headline token lvls
As headlines are always lvl (indent) 0 I thought it would be clever to abuse the lvl field to store the headline lvl. Well, here we are - it wasn't clever. List items only end when their parent ends or they run into something that's not indented enough - everything else becomes part of the list item. Abusing the token.lvl field (indent) for the headline lvl means headlines look indented to the list item parsing logic - i.e. they become part of the list item if the headline has a high enough lvl. That should never happen - so let's get rid of the hack and (re-)calculate the headline lvl when we need it.
This commit is contained in:
parent
add727c011
commit
64b2b22270
4 changed files with 44 additions and 6 deletions
|
@ -35,14 +35,14 @@ var tagRegexp = regexp.MustCompile(`(.*?)\s+(:[A-Za-z0-9_@#%:]+:\s*$)`)
|
|||
|
||||
func lexHeadline(line string) (token, bool) {
|
||||
if m := headlineRegexp.FindStringSubmatch(line); m != nil {
|
||||
return token{"headline", len(m[1]), m[2], m}, true
|
||||
return token{"headline", 0, m[2], m}, true
|
||||
}
|
||||
return nilToken, false
|
||||
}
|
||||
|
||||
func (d *Document) parseHeadline(i int, parentStop stopFn) (int, Node) {
|
||||
t, headline := d.tokens[i], Headline{}
|
||||
headline.Lvl = t.lvl
|
||||
headline.Lvl = len(t.matches[1])
|
||||
|
||||
headline.Index = d.addHeadline(&headline)
|
||||
|
||||
|
@ -69,7 +69,7 @@ func (d *Document) parseHeadline(i int, parentStop stopFn) (int, Node) {
|
|||
headline.Title = d.parseInline(text)
|
||||
|
||||
stop := func(d *Document, i int) bool {
|
||||
return parentStop(d, i) || d.tokens[i].kind == "headline" && d.tokens[i].lvl <= headline.Lvl
|
||||
return parentStop(d, i) || d.tokens[i].kind == "headline" && len(d.tokens[i].matches[1]) <= headline.Lvl
|
||||
}
|
||||
consumed, nodes := d.parseMany(i+1, stop)
|
||||
if len(nodes) > 0 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue