Skip to content

Commit 25aa773

Browse files
committed
Fixes #509
1 parent 31bbeb2 commit 25aa773

File tree

7 files changed

+75
-13
lines changed

7 files changed

+75
-13
lines changed

_test/extra.txt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,3 +843,21 @@ text" /></p>
843843
</code></pre>
844844
</blockquote>
845845
//= = = = = = = = = = = = = = = = = = = = = = = =//
846+
847+
68: HTML comments in list items
848+
//- - - - - - - - -//
849+
- test
850+
<!--
851+
Test
852+
-->
853+
- test2
854+
//- - - - - - - - -//
855+
<ul>
856+
<li>test
857+
<!--
858+
Test
859+
-->
860+
</li>
861+
<li>test2</li>
862+
</ul>
863+
//= = = = = = = = = = = = = = = = = = = = = = = =//

parser/code_block.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func (b *codeBlockParser) Open(parent ast.Node, reader text.Reader, pc Context)
3737
}
3838
segment.ForceNewline = true
3939
node.Lines().Append(segment)
40-
reader.Advance(segment.Len() - 1)
40+
reader.AdvanceToEOL()
4141
return node, NoChildren
4242

4343
}
@@ -62,7 +62,7 @@ func (b *codeBlockParser) Continue(node ast.Node, reader text.Reader, pc Context
6262

6363
segment.ForceNewline = true
6464
node.Lines().Append(segment)
65-
reader.Advance(segment.Len() - 1)
65+
reader.AdvanceToEOL()
6666
return Continue | NoChildren
6767
}
6868

parser/html_block.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ func (b *htmlBlockParser) Open(parent ast.Node, reader text.Reader, pc Context)
150150
}
151151
}
152152
if node != nil {
153-
reader.Advance(segment.Len() - util.TrimRightSpaceLength(line))
153+
reader.AdvanceToEOL()
154154
node.Lines().Append(segment)
155155
return node, NoChildren
156156
}
@@ -173,7 +173,7 @@ func (b *htmlBlockParser) Continue(node ast.Node, reader text.Reader, pc Context
173173
}
174174
if htmlBlockType1CloseRegexp.Match(line) {
175175
htmlBlock.ClosureLine = segment
176-
reader.Advance(segment.Len() - util.TrimRightSpaceLength(line))
176+
reader.AdvanceToEOL()
177177
return Close
178178
}
179179
case ast.HTMLBlockType2:
@@ -202,7 +202,7 @@ func (b *htmlBlockParser) Continue(node ast.Node, reader text.Reader, pc Context
202202
}
203203
if bytes.Contains(line, closurePattern) {
204204
htmlBlock.ClosureLine = segment
205-
reader.Advance(segment.Len())
205+
reader.AdvanceToEOL()
206206
return Close
207207
}
208208

@@ -212,7 +212,7 @@ func (b *htmlBlockParser) Continue(node ast.Node, reader text.Reader, pc Context
212212
}
213213
}
214214
node.Lines().Append(segment)
215-
reader.Advance(segment.Len() - util.TrimRightSpaceLength(line))
215+
reader.AdvanceToEOL()
216216
return Continue | NoChildren
217217
}
218218

parser/list_item.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func (b *listItemParser) Open(parent ast.Node, reader text.Reader, pc Context) (
5353
func (b *listItemParser) Continue(node ast.Node, reader text.Reader, pc Context) State {
5454
line, _ := reader.PeekLine()
5555
if util.IsBlank(line) {
56-
reader.Advance(len(line) - 1)
56+
reader.AdvanceToEOL()
5757
return Continue | HasChildren
5858
}
5959

parser/paragraph.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func (b *paragraphParser) Open(parent ast.Node, reader text.Reader, pc Context)
2929
}
3030
node := ast.NewParagraph()
3131
node.Lines().Append(segment)
32-
reader.Advance(segment.Len() - 1)
32+
reader.AdvanceToEOL()
3333
return node, NoChildren
3434
}
3535

@@ -39,7 +39,7 @@ func (b *paragraphParser) Continue(node ast.Node, reader text.Reader, pc Context
3939
return Close
4040
}
4141
node.Lines().Append(segment)
42-
reader.Advance(segment.Len() - 1)
42+
reader.AdvanceToEOL()
4343
return Continue | NoChildren
4444
}
4545

parser/thematic_break.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ func (b *thematicBreakPraser) Trigger() []byte {
5050
}
5151

5252
func (b *thematicBreakPraser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) {
53-
line, segment := reader.PeekLine()
53+
line, _ := reader.PeekLine()
5454
if isThematicBreak(line, reader.LineOffset()) {
55-
reader.Advance(segment.Len() - 1)
55+
reader.AdvanceToEOL()
5656
return ast.NewThematicBreak(), NoChildren
5757
}
5858
return nil, NoChildren

text/reader.go

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ type Reader interface {
5555
// reader.
5656
AdvanceAndSetPadding(int, int)
5757

58+
// AdvanceToEOL advances the internal pointer to the end of line.
59+
// If the line ends with a newline, it will be included in the segment.
60+
// If the line ends with EOF, it will not be included in the segment.
61+
AdvanceToEOL()
62+
5863
// AdvanceLine advances the internal pointer to the next line head.
5964
AdvanceLine()
6065

@@ -220,16 +225,44 @@ func (r *reader) AdvanceAndSetPadding(n, padding int) {
220225
}
221226
}
222227

228+
func (r *reader) AdvanceToEOL() {
229+
if r.pos.Start >= r.sourceLength {
230+
return
231+
}
232+
233+
r.lineOffset = -1
234+
i := -1
235+
if r.peekedLine != nil {
236+
r.pos.Start += len(r.peekedLine) - r.pos.Padding - 1
237+
if r.source[r.pos.Start] == '\n' {
238+
i = 0
239+
}
240+
}
241+
if i == -1 {
242+
i = bytes.IndexByte(r.source[r.pos.Start:], '\n')
243+
}
244+
r.peekedLine = nil
245+
if i != -1 {
246+
r.pos.Start += i
247+
} else {
248+
r.pos.Start = r.sourceLength
249+
}
250+
r.pos.Padding = 0
251+
}
252+
223253
func (r *reader) AdvanceLine() {
224254
r.lineOffset = -1
225255
r.peekedLine = nil
226256
r.pos.Start = r.pos.Stop
227257
r.head = r.pos.Start
228-
if r.pos.Start < 0 {
258+
if r.pos.Start < 0 || r.pos.Start >= r.sourceLength {
229259
return
230260
}
231261
r.pos.Stop = r.sourceLength
232-
i := bytes.IndexByte(r.source[r.pos.Start:], '\n')
262+
i := 0
263+
if r.source[r.pos.Start] != '\n' {
264+
i = bytes.IndexByte(r.source[r.pos.Start:], '\n')
265+
}
233266
if i != -1 {
234267
r.pos.Stop = r.pos.Start + i + 1
235268
}
@@ -441,6 +474,17 @@ func (r *blockReader) AdvanceAndSetPadding(n, padding int) {
441474
}
442475
}
443476

477+
func (r *blockReader) AdvanceToEOL() {
478+
r.lineOffset = -1
479+
r.pos.Padding = 0
480+
c := r.source[r.pos.Stop-1]
481+
if c == '\n' {
482+
r.pos.Start = r.pos.Stop - 1
483+
} else {
484+
r.pos.Start = r.pos.Stop
485+
}
486+
}
487+
444488
func (r *blockReader) AdvanceLine() {
445489
r.SetPosition(r.line+1, NewSegment(invalidValue, invalidValue))
446490
r.head = r.pos.Start

0 commit comments

Comments
 (0)