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

    +
      +
    1. +

      use `[@n]` to change the value of list items

      +
    2. +
    3. +

      foobar

      +
    4. +
    5. +

      that even works in combination with list statuses (`[ ]`)

      +
    6. +
    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 (`[ ]`)