Terminate descriptive list when list kind (ordered, unordered) changes
This commit is contained in:
parent
1744ea100b
commit
4e536f44bd
4 changed files with 166 additions and 11 deletions
24
org/list.go
24
org/list.go
|
@ -25,7 +25,7 @@ type DescriptiveListItem struct {
|
||||||
Details []Node
|
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 orderedListRegexp = regexp.MustCompile(`^(\s*)(([0-9]+|[a-zA-Z])[.)])\s+(.*)`)
|
||||||
var descriptiveListItemRegexp = regexp.MustCompile(`\s::(\s|$)`)
|
var descriptiveListItemRegexp = regexp.MustCompile(`\s::(\s|$)`)
|
||||||
var listItemStatusRegexp = regexp.MustCompile(`\[( |X|-)\]\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 == "")
|
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]; {
|
switch bullet := t.matches[2]; {
|
||||||
case descriptiveListItemRegexp.MatchString(t.content):
|
|
||||||
return "descriptive"
|
|
||||||
case bullet == "*" || bullet == "+" || bullet == "-":
|
case bullet == "*" || bullet == "+" || bullet == "-":
|
||||||
return "unordered"
|
kind = "unordered"
|
||||||
case unicode.IsLetter(rune(bullet[0])), unicode.IsDigit(rune(bullet[0])):
|
case unicode.IsLetter(rune(bullet[0])), unicode.IsDigit(rune(bullet[0])):
|
||||||
return "ordered"
|
kind = "ordered"
|
||||||
default:
|
default:
|
||||||
panic(fmt.Sprintf("bad list bullet '%s': %#v", bullet, t))
|
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) {
|
func (d *Document) parseList(i int, parentStop stopFn) (int, Node) {
|
||||||
start, lvl := i, d.tokens[i].lvl
|
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 {
|
stop := func(*Document, int) bool {
|
||||||
if parentStop(d, i) || d.tokens[i].lvl != lvl || !isListToken(d.tokens[i]) {
|
if parentStop(d, i) || d.tokens[i].lvl != lvl || !isListToken(d.tokens[i]) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if list.Kind == "descriptive" {
|
itemMainKind, _ := listKind(d.tokens[i])
|
||||||
return false
|
return itemMainKind != listMainKind
|
||||||
}
|
|
||||||
return listKind(d.tokens[i]) != list.Kind
|
|
||||||
}
|
}
|
||||||
for !stop(d, i) {
|
for !stop(d, i) {
|
||||||
consumed, node := d.parseListItem(list, i, parentStop)
|
consumed, node := d.parseListItem(list, i, parentStop)
|
||||||
|
|
103
org/testdata/lists.html
vendored
103
org/testdata/lists.html
vendored
|
@ -127,3 +127,106 @@ echo "Hello World!"
|
||||||
</div>
|
</div>
|
||||||
<dd>
|
<dd>
|
||||||
</dl>
|
</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>
|
||||||
|
|
25
org/testdata/lists.org
vendored
25
org/testdata/lists.org
vendored
|
@ -36,3 +36,28 @@ descriptive lists
|
||||||
#+BEGIN_SRC bash
|
#+BEGIN_SRC bash
|
||||||
echo "Hello World!"
|
echo "Hello World!"
|
||||||
#+END_SRC
|
#+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
|
||||||
|
|
25
org/testdata/lists.pretty_org
vendored
25
org/testdata/lists.pretty_org
vendored
|
@ -36,3 +36,28 @@ descriptive lists
|
||||||
#+BEGIN_SRC bash
|
#+BEGIN_SRC bash
|
||||||
echo "Hello World!"
|
echo "Hello World!"
|
||||||
#+END_SRC
|
#+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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue