Terminate descriptive list when list kind (ordered, unordered) changes

This commit is contained in:
Niklas Fasching 2018-12-19 17:31:02 +01:00
parent 1744ea100b
commit 4e536f44bd
4 changed files with 166 additions and 11 deletions

View file

@ -25,7 +25,7 @@ type DescriptiveListItem struct {
Details []Node
}
var unorderedListRegexp = regexp.MustCompile(`^(\s*)([-]|[+]|[*])\s(.*)`)
var unorderedListRegexp = regexp.MustCompile(`^(\s*)([+*-])\s(.*)`)
var orderedListRegexp = regexp.MustCompile(`^(\s*)(([0-9]+|[a-zA-Z])[.)])\s+(.*)`)
var descriptiveListItemRegexp = regexp.MustCompile(`\s::(\s|$)`)
var listItemStatusRegexp = regexp.MustCompile(`\[( |X|-)\]\s`)
@ -47,30 +47,32 @@ func stopIndentBelow(t token, minIndent int) bool {
return t.lvl < minIndent && !(t.kind == "text" && t.content == "")
}
func listKind(t token) string {
func listKind(t token) (string, string) {
kind := ""
switch bullet := t.matches[2]; {
case descriptiveListItemRegexp.MatchString(t.content):
return "descriptive"
case bullet == "*" || bullet == "+" || bullet == "-":
return "unordered"
kind = "unordered"
case unicode.IsLetter(rune(bullet[0])), unicode.IsDigit(rune(bullet[0])):
return "ordered"
kind = "ordered"
default:
panic(fmt.Sprintf("bad list bullet '%s': %#v", bullet, t))
}
if descriptiveListItemRegexp.MatchString(t.content) {
return kind, "descriptive"
}
return kind, kind
}
func (d *Document) parseList(i int, parentStop stopFn) (int, Node) {
start, lvl := i, d.tokens[i].lvl
list := List{Kind: listKind(d.tokens[i])}
listMainKind, kind := listKind(d.tokens[i])
list := List{Kind: kind}
stop := func(*Document, int) bool {
if parentStop(d, i) || d.tokens[i].lvl != lvl || !isListToken(d.tokens[i]) {
return true
}
if list.Kind == "descriptive" {
return false
}
return listKind(d.tokens[i]) != list.Kind
itemMainKind, _ := listKind(d.tokens[i])
return itemMainKind != listMainKind
}
for !stop(d, i) {
consumed, node := d.parseListItem(list, i, parentStop)

View file

@ -127,3 +127,106 @@ echo &#34;Hello World!&#34;
</div>
<dd>
</dl>
<p>
some list termination tests
</p>
<ul>
<li>
<p>
unordered 1
</p>
</li>
<li>
<p>
unordered 2
</p>
</li>
</ul>
<ol>
<li>
<p>
ordered 1
</p>
</li>
<li>
<p>
ordered 2
</p>
</li>
</ol>
<ol>
<li>
<p>
ordered 1
</p>
</li>
<li>
<p>
ordered 2
</p>
</li>
</ol>
<ul>
<li>
<p>
unordered 1
</p>
</li>
<li>
<p>
unordered 2
</p>
</li>
</ul>
<ol>
<li>
<p>
ordered 1
</p>
</li>
<li>
<p>
ordered 2
</p>
</li>
</ol>
<dl>
<dt>
unordered descriptive<dd>
<p>
1
</p>
<dd>
<dt>
unordered descriptive<dd>
<p>
2
</p>
<dd>
</dl>
<dl>
<dt>
ordered descriptive<dd>
<p>
1
</p>
<dd>
<dt>
ordered descriptive<dd>
<p>
2
</p>
<dd>
</dl>
<ul>
<li>
<p>
unordered 1
</p>
</li>
<li>
<p>
unordered 2
</p>
</li>
</ul>

View file

@ -36,3 +36,28 @@ descriptive lists
#+BEGIN_SRC bash
echo "Hello World!"
#+END_SRC
some list termination tests
- unordered 1
- unordered 2
1. ordered 1
2. ordered 2
1. ordered 1
2. ordered 2
- unordered 1
- unordered 2
1. ordered 1
2. ordered 2
- unordered descriptive :: 1
- unordered descriptive :: 2
1. ordered descriptive :: 1
2. ordered descriptive :: 2
- unordered 1
- unordered 2

View file

@ -36,3 +36,28 @@ descriptive lists
#+BEGIN_SRC bash
echo "Hello World!"
#+END_SRC
some list termination tests
- unordered 1
- unordered 2
1. ordered 1
2. ordered 2
1. ordered 1
2. ordered 2
- unordered 1
- unordered 2
1. ordered 1
2. ordered 2
- unordered descriptive :: 1
- unordered descriptive :: 2
1. ordered descriptive :: 1
2. ordered descriptive :: 2
- unordered 1
- unordered 2