diff options
Diffstat (limited to 'vendor/github.com/yuin')
9 files changed, 78 insertions, 58 deletions
diff --git a/vendor/github.com/yuin/goldmark/ast/block.go b/vendor/github.com/yuin/goldmark/ast/block.go index d17564a99..efeea08ef 100644 --- a/vendor/github.com/yuin/goldmark/ast/block.go +++ b/vendor/github.com/yuin/goldmark/ast/block.go @@ -10,8 +10,8 @@ import ( // A BaseBlock struct implements the Node interface partialliy. type BaseBlock struct { BaseNode + lines textm.Segments blankPreviousLines bool - lines *textm.Segments } // Type implements Node.Type. @@ -36,15 +36,12 @@ func (b *BaseBlock) SetBlankPreviousLines(v bool) { // Lines implements Node.Lines. func (b *BaseBlock) Lines() *textm.Segments { - if b.lines == nil { - b.lines = textm.NewSegments() - } - return b.lines + return &b.lines } // SetLines implements Node.SetLines. func (b *BaseBlock) SetLines(v *textm.Segments) { - b.lines = v + b.lines = *v } // A Document struct is a root node of Markdown text. diff --git a/vendor/github.com/yuin/goldmark/parser/code_block.go b/vendor/github.com/yuin/goldmark/parser/code_block.go index d99146c52..5a2401695 100644 --- a/vendor/github.com/yuin/goldmark/parser/code_block.go +++ b/vendor/github.com/yuin/goldmark/parser/code_block.go @@ -37,7 +37,7 @@ func (b *codeBlockParser) Open(parent ast.Node, reader text.Reader, pc Context) } segment.ForceNewline = true node.Lines().Append(segment) - reader.Advance(segment.Len() - 1) + reader.AdvanceToEOL() return node, NoChildren } @@ -62,7 +62,7 @@ func (b *codeBlockParser) Continue(node ast.Node, reader text.Reader, pc Context segment.ForceNewline = true node.Lines().Append(segment) - reader.Advance(segment.Len() - 1) + reader.AdvanceToEOL() return Continue | NoChildren } diff --git a/vendor/github.com/yuin/goldmark/parser/html_block.go b/vendor/github.com/yuin/goldmark/parser/html_block.go index 09dc21f42..262ef9325 100644 --- a/vendor/github.com/yuin/goldmark/parser/html_block.go +++ b/vendor/github.com/yuin/goldmark/parser/html_block.go @@ -150,7 +150,7 @@ func (b *htmlBlockParser) Open(parent ast.Node, reader text.Reader, pc Context) } } if node != nil { - reader.Advance(segment.Len() - util.TrimRightSpaceLength(line)) + reader.AdvanceToEOL() node.Lines().Append(segment) return node, NoChildren } @@ -173,7 +173,7 @@ func (b *htmlBlockParser) Continue(node ast.Node, reader text.Reader, pc Context } if htmlBlockType1CloseRegexp.Match(line) { htmlBlock.ClosureLine = segment - reader.Advance(segment.Len() - util.TrimRightSpaceLength(line)) + reader.AdvanceToEOL() return Close } case ast.HTMLBlockType2: @@ -202,7 +202,7 @@ func (b *htmlBlockParser) Continue(node ast.Node, reader text.Reader, pc Context } if bytes.Contains(line, closurePattern) { htmlBlock.ClosureLine = segment - reader.Advance(segment.Len()) + reader.AdvanceToEOL() return Close } @@ -212,7 +212,7 @@ func (b *htmlBlockParser) Continue(node ast.Node, reader text.Reader, pc Context } } node.Lines().Append(segment) - reader.Advance(segment.Len() - util.TrimRightSpaceLength(line)) + reader.AdvanceToEOL() return Continue | NoChildren } diff --git a/vendor/github.com/yuin/goldmark/parser/list_item.go b/vendor/github.com/yuin/goldmark/parser/list_item.go index 2206ad908..f4d7da4a7 100644 --- a/vendor/github.com/yuin/goldmark/parser/list_item.go +++ b/vendor/github.com/yuin/goldmark/parser/list_item.go @@ -53,7 +53,7 @@ func (b *listItemParser) Open(parent ast.Node, reader text.Reader, pc Context) ( func (b *listItemParser) Continue(node ast.Node, reader text.Reader, pc Context) State { line, _ := reader.PeekLine() if util.IsBlank(line) { - reader.Advance(len(line) - 1) + reader.AdvanceToEOL() return Continue | HasChildren } diff --git a/vendor/github.com/yuin/goldmark/parser/paragraph.go b/vendor/github.com/yuin/goldmark/parser/paragraph.go index 9d3fa38e0..801b0df56 100644 --- a/vendor/github.com/yuin/goldmark/parser/paragraph.go +++ b/vendor/github.com/yuin/goldmark/parser/paragraph.go @@ -29,7 +29,7 @@ func (b *paragraphParser) Open(parent ast.Node, reader text.Reader, pc Context) } node := ast.NewParagraph() node.Lines().Append(segment) - reader.Advance(segment.Len() - 1) + reader.AdvanceToEOL() return node, NoChildren } @@ -39,7 +39,7 @@ func (b *paragraphParser) Continue(node ast.Node, reader text.Reader, pc Context return Close } node.Lines().Append(segment) - reader.Advance(segment.Len() - 1) + reader.AdvanceToEOL() return Continue | NoChildren } diff --git a/vendor/github.com/yuin/goldmark/parser/parser.go b/vendor/github.com/yuin/goldmark/parser/parser.go index 7ec40b31a..78a6b2603 100644 --- a/vendor/github.com/yuin/goldmark/parser/parser.go +++ b/vendor/github.com/yuin/goldmark/parser/parser.go @@ -1030,47 +1030,35 @@ type lineStat struct { } func isBlankLine(lineNum, level int, stats []lineStat) bool { - ret := true - for i := len(stats) - 1 - level; i >= 0; i-- { - ret = false + l := len(stats) + if l == 0 { + return true + } + for i := l - 1 - level; i >= 0; i-- { s := stats[i] - if s.lineNum == lineNum { - if s.level < level && s.isBlank { - return true - } else if s.level == level { - return s.isBlank - } - } - if s.lineNum < lineNum { - return ret + if s.lineNum == lineNum && s.level <= level { + return s.isBlank + } else if s.lineNum < lineNum { + break } } - return ret + return false } func (p *parser) parseBlocks(parent ast.Node, reader text.Reader, pc Context) { - pc.SetOpenedBlocks([]Block{}) + pc.SetOpenedBlocks(nil) blankLines := make([]lineStat, 0, 128) - var isBlank bool for { // process blocks separated by blank lines - _, lines, ok := reader.SkipBlankLines() + _, _, ok := reader.SkipBlankLines() if !ok { return } - lineNum, _ := reader.Position() - if lines != 0 { - blankLines = blankLines[0:0] - l := len(pc.OpenedBlocks()) - for i := 0; i < l; i++ { - blankLines = append(blankLines, lineStat{lineNum - 1, i, lines != 0}) - } - } - isBlank = isBlankLine(lineNum-1, 0, blankLines) // first, we try to open blocks - if p.openBlocks(parent, isBlank, reader, pc) != newBlocksOpened { + if p.openBlocks(parent, true, reader, pc) != newBlocksOpened { return } reader.AdvanceLine() + blankLines = blankLines[0:0] for { // process opened blocks line by line openedBlocks := pc.OpenedBlocks() l := len(openedBlocks) @@ -1096,7 +1084,7 @@ func (p *parser) parseBlocks(parent ast.Node, reader text.Reader, pc Context) { // When current node is a container block and has no children, // we try to open new child nodes if state&HasChildren != 0 && i == lastIndex { - isBlank = isBlankLine(lineNum-1, i+1, blankLines) + isBlank := isBlankLine(lineNum-1, i+1, blankLines) p.openBlocks(be.Node, isBlank, reader, pc) break } @@ -1104,7 +1092,7 @@ func (p *parser) parseBlocks(parent ast.Node, reader text.Reader, pc Context) { } } // current node may be closed or lazy continuation - isBlank = isBlankLine(lineNum-1, i, blankLines) + isBlank := isBlankLine(lineNum-1, i, blankLines) thisParent := parent if i != 0 { thisParent = openedBlocks[i-1].Node diff --git a/vendor/github.com/yuin/goldmark/parser/thematic_break.go b/vendor/github.com/yuin/goldmark/parser/thematic_break.go index db20a1e7a..ea015c870 100644 --- a/vendor/github.com/yuin/goldmark/parser/thematic_break.go +++ b/vendor/github.com/yuin/goldmark/parser/thematic_break.go @@ -50,9 +50,9 @@ func (b *thematicBreakPraser) Trigger() []byte { } func (b *thematicBreakPraser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) { - line, segment := reader.PeekLine() + line, _ := reader.PeekLine() if isThematicBreak(line, reader.LineOffset()) { - reader.Advance(segment.Len() - 1) + reader.AdvanceToEOL() return ast.NewThematicBreak(), NoChildren } return nil, NoChildren diff --git a/vendor/github.com/yuin/goldmark/text/reader.go b/vendor/github.com/yuin/goldmark/text/reader.go index b3f97fb56..21083dcbb 100644 --- a/vendor/github.com/yuin/goldmark/text/reader.go +++ b/vendor/github.com/yuin/goldmark/text/reader.go @@ -55,6 +55,11 @@ type Reader interface { // reader. AdvanceAndSetPadding(int, int) + // AdvanceToEOL advances the internal pointer to the end of line. + // If the line ends with a newline, it will be included in the segment. + // If the line ends with EOF, it will not be included in the segment. + AdvanceToEOL() + // AdvanceLine advances the internal pointer to the next line head. AdvanceLine() @@ -220,21 +225,46 @@ func (r *reader) AdvanceAndSetPadding(n, padding int) { } } +func (r *reader) AdvanceToEOL() { + if r.pos.Start >= r.sourceLength { + return + } + + r.lineOffset = -1 + i := -1 + if r.peekedLine != nil { + r.pos.Start += len(r.peekedLine) - r.pos.Padding - 1 + if r.source[r.pos.Start] == '\n' { + i = 0 + } + } + if i == -1 { + i = bytes.IndexByte(r.source[r.pos.Start:], '\n') + } + r.peekedLine = nil + if i != -1 { + r.pos.Start += i + } else { + r.pos.Start = r.sourceLength + } + r.pos.Padding = 0 +} + func (r *reader) AdvanceLine() { r.lineOffset = -1 r.peekedLine = nil r.pos.Start = r.pos.Stop r.head = r.pos.Start - if r.pos.Start < 0 { + if r.pos.Start < 0 || r.pos.Start >= r.sourceLength { return } r.pos.Stop = r.sourceLength - for i := r.pos.Start; i < r.sourceLength; i++ { - c := r.source[i] - if c == '\n' { - r.pos.Stop = i + 1 - break - } + i := 0 + if r.source[r.pos.Start] != '\n' { + i = bytes.IndexByte(r.source[r.pos.Start:], '\n') + } + if i != -1 { + r.pos.Stop = r.pos.Start + i + 1 } r.line++ r.pos.Padding = 0 @@ -444,6 +474,17 @@ func (r *blockReader) AdvanceAndSetPadding(n, padding int) { } } +func (r *blockReader) AdvanceToEOL() { + r.lineOffset = -1 + r.pos.Padding = 0 + c := r.source[r.pos.Stop-1] + if c == '\n' { + r.pos.Start = r.pos.Stop - 1 + } else { + r.pos.Start = r.pos.Stop + } +} + func (r *blockReader) AdvanceLine() { r.SetPosition(r.line+1, NewSegment(invalidValue, invalidValue)) r.head = r.pos.Start diff --git a/vendor/github.com/yuin/goldmark/text/segment.go b/vendor/github.com/yuin/goldmark/text/segment.go index 93fbf1994..30655dd3f 100644 --- a/vendor/github.com/yuin/goldmark/text/segment.go +++ b/vendor/github.com/yuin/goldmark/text/segment.go @@ -176,17 +176,11 @@ func NewSegments() *Segments { // Append appends the given segment after the tail of the collection. func (s *Segments) Append(t Segment) { - if s.values == nil { - s.values = make([]Segment, 0, 20) - } s.values = append(s.values, t) } // AppendAll appends all elements of given segments after the tail of the collection. func (s *Segments) AppendAll(t []Segment) { - if s.values == nil { - s.values = make([]Segment, 0, 20) - } s.values = append(s.values, t...) } |
