diff --git a/org/html_writer.go b/org/html_writer.go
index 9dfe7ad..056612e 100644
--- a/org/html_writer.go
+++ b/org/html_writer.go
@@ -412,11 +412,14 @@ func (w *HTMLWriter) WriteList(l List) {
}
func (w *HTMLWriter) WriteListItem(li ListItem) {
- if li.Status != "" {
- w.WriteString(fmt.Sprintf("
\n", listItemStatuses[li.Status]))
- } else {
- w.WriteString("\n")
+ attributes := ""
+ if li.Value != "" {
+ attributes += fmt.Sprintf(` value="%s"`, li.Value)
}
+ if li.Status != "" {
+ attributes += fmt.Sprintf(` class="%s"`, listItemStatuses[li.Status])
+ }
+ w.WriteString(fmt.Sprintf("\n", attributes))
WriteNodes(w, li.Children...)
w.WriteString("\n")
}
diff --git a/org/list.go b/org/list.go
index 54f5b2d..9fcf31c 100644
--- a/org/list.go
+++ b/org/list.go
@@ -15,6 +15,7 @@ type List struct {
type ListItem struct {
Bullet string
Status string
+ Value string
Children []Node
}
@@ -28,6 +29,7 @@ type DescriptiveListItem struct {
var unorderedListRegexp = regexp.MustCompile(`^(\s*)([+*-])(\s+(.*)|$)`)
var orderedListRegexp = regexp.MustCompile(`^(\s*)(([0-9]+|[a-zA-Z])[.)])(\s+(.*)|$)`)
var descriptiveListItemRegexp = regexp.MustCompile(`\s::(\s|$)`)
+var listItemValueRegexp = regexp.MustCompile(`\[@(\d+)\]\s`)
var listItemStatusRegexp = regexp.MustCompile(`\[( |X|-)\]\s`)
func lexList(line string) (token, bool) {
@@ -80,9 +82,12 @@ func (d *Document) parseList(i int, parentStop stopFn) (int, Node) {
func (d *Document) parseListItem(l List, i int, parentStop stopFn) (int, Node) {
start, nodes, bullet := i, []Node{}, d.tokens[i].matches[2]
- minIndent, dterm, content, status := d.tokens[i].lvl+len(bullet), "", d.tokens[i].content, ""
+ minIndent, dterm, content, status, value := d.tokens[i].lvl+len(bullet), "", d.tokens[i].content, "", ""
originalBaseLvl := d.baseLvl
d.baseLvl = minIndent + 1
+ if m := listItemValueRegexp.FindStringSubmatch(content); m != nil && l.Kind == "ordered" {
+ value, content = m[1], content[len("[@] ")+len(m[1]):]
+ }
if m := listItemStatusRegexp.FindStringSubmatch(content); m != nil {
status, content = m[1], content[len("[ ] "):]
}
@@ -110,7 +115,7 @@ func (d *Document) parseListItem(l List, i int, parentStop stopFn) (int, Node) {
if l.Kind == "descriptive" {
return i - start, DescriptiveListItem{bullet, status, d.parseInline(dterm), nodes}
}
- return i - start, ListItem{bullet, status, nodes}
+ return i - start, ListItem{bullet, status, value, nodes}
}
func (n List) String() string { return orgWriter.WriteNodesAsString(n) }
diff --git a/org/org_writer.go b/org/org_writer.go
index c502c76..dea5ff8 100644
--- a/org/org_writer.go
+++ b/org/org_writer.go
@@ -219,6 +219,9 @@ func (w *OrgWriter) WriteListItem(li ListItem) {
content := strings.TrimPrefix(w.String(), w.indent)
w.Builder, w.indent = originalBuilder, originalIndent
w.WriteString(w.indent + li.Bullet)
+ if li.Value != "" {
+ w.WriteString(fmt.Sprintf(" [@%s]", li.Value))
+ }
if li.Status != "" {
w.WriteString(fmt.Sprintf(" [%s]", li.Status))
}
diff --git a/org/testdata/lists.html b/org/testdata/lists.html
index 445c68a..83ab29c 100644
--- a/org/testdata/lists.html
+++ b/org/testdata/lists.html
@@ -195,3 +195,14 @@ ordered descriptive
unordered 2
+
+-
+
use `[@n]` to change the value of list items
+
+-
+
foobar
+
+-
+
that even works in combination with list statuses (`[ ]`)
+
+
diff --git a/org/testdata/lists.org b/org/testdata/lists.org
index b8983f1..cf4e7d7 100644
--- a/org/testdata/lists.org
+++ b/org/testdata/lists.org
@@ -68,3 +68,8 @@ some list termination tests
2. ordered descriptive :: 2
- unordered 1
- unordered 2
+
+
+1. [@2] use `[@n]` to change the value of list items
+2. [ ] foobar
+3. [@10] [X] that even works in combination with list statuses (`[ ]`)
diff --git a/org/testdata/lists.pretty_org b/org/testdata/lists.pretty_org
index c388789..33770f9 100644
--- a/org/testdata/lists.pretty_org
+++ b/org/testdata/lists.pretty_org
@@ -68,3 +68,8 @@ some list termination tests
2. ordered descriptive :: 2
- unordered 1
- unordered 2
+
+
+1. [@2] use `[@n]` to change the value of list items
+2. [ ] foobar
+3. [@10] [X] that even works in combination with list statuses (`[ ]`)