From 0355745bf4326e0186538432d1f70145503cc232 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Sun, 29 Jul 2018 17:03:36 +0100 Subject: [PATCH] Ordered list: detect starting number This keeps track of the starting number of an ordered list and uses it when not zero. Fails the tests so it will probably have to wait until we have the Mmark extension merged. Signed-off-by: Miek Gieben --- ast/node.go | 1 + html/renderer.go | 3 +++ parser/block.go | 23 ++++++++++++++++------- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/ast/node.go b/ast/node.go index 6fe70cd..825b343 100644 --- a/ast/node.go +++ b/ast/node.go @@ -137,6 +137,7 @@ type List struct { Tight bool // Skip

s around list item data if true BulletChar byte // '*', '+' or '-' in bullet lists Delimiter byte // '.' or ')' after the number in ordered lists + Start int // for ordered lists this indicates the starting number if > 0 RefLink []byte // If not nil, turns this list item into a footnote item and triggers different rendering IsFootnotesList bool // This is a list of footnotes } diff --git a/html/renderer.go b/html/renderer.go index 6089e56..0d03e98 100644 --- a/html/renderer.go +++ b/html/renderer.go @@ -653,6 +653,9 @@ func (r *Renderer) listEnter(w io.Writer, nodeData *ast.List) { openTag := " 0 { + attrs = append(attrs, fmt.Sprintf(`start="%d"`, nodeData.Start)) + } openTag = " 0 { - data = data[p.list(data, 0):] + data = data[p.list(data, 0, 0):] continue } @@ -237,8 +238,15 @@ func (p *Parser) block(data []byte) { // // 1. Item 1 // 2. Item 2 - if p.oliPrefix(data) > 0 { - data = data[p.list(data, ast.ListTypeOrdered):] + if i := p.oliPrefix(data); i > 0 { + start := 0 + if i > 2 { + start, _ = strconv.Atoi(string(data[:i-2])) // this cannot fail because we just est. the thing *is* a number. + if start == 1 { + start = 0 + } + } + data = data[p.list(data, ast.ListTypeOrdered, start):] continue } @@ -252,7 +260,7 @@ func (p *Parser) block(data []byte) { // : Definition c if p.extensions&DefinitionLists != 0 { if p.dliPrefix(data) > 0 { - data = data[p.list(data, ast.ListTypeDefinition):] + data = data[p.list(data, ast.ListTypeDefinition, 0):] continue } } @@ -1192,12 +1200,13 @@ func (p *Parser) dliPrefix(data []byte) int { } // parse ordered or unordered list block -func (p *Parser) list(data []byte, flags ast.ListType) int { +func (p *Parser) list(data []byte, flags ast.ListType, start int) int { i := 0 flags |= ast.ListItemBeginningOfList list := &ast.List{ ListFlags: flags, Tight: true, + Start: start, } block := p.addBlock(list) @@ -1533,7 +1542,7 @@ func (p *Parser) paragraph(data []byte) int { // did this blank line followed by a definition list item? if p.extensions&DefinitionLists != 0 { if i < len(data)-1 && data[i+1] == ':' { - listLen := p.list(data[prev:], ast.ListTypeDefinition) + listLen := p.list(data[prev:], ast.ListTypeDefinition, 0) return prev + listLen } } @@ -1600,7 +1609,7 @@ func (p *Parser) paragraph(data []byte) int { // if there's a definition list item, prev line is a definition term if p.extensions&DefinitionLists != 0 { if p.dliPrefix(current) != 0 { - ret := p.list(data[prev:], ast.ListTypeDefinition) + ret := p.list(data[prev:], ast.ListTypeDefinition, 0) return ret + prev } }