@@ -42,7 +42,7 @@ impl<'a, 'b, R: BufRead> Converter<'a, 'b, R> {
42
42
} else if line. starts_with ( VIDEO_BLOCK_PREFIX ) {
43
43
self . process_video_block ( None , 0 ) ?;
44
44
} else {
45
- self . process_paragraph ( 0 ) ?;
45
+ self . process_paragraph ( 0 , |line| line . is_empty ( ) ) ?;
46
46
}
47
47
48
48
self . skip_blank_lines ( ) ?;
@@ -84,16 +84,19 @@ impl<'a, 'b, R: BufRead> Converter<'a, 'b, R> {
84
84
85
85
fn process_list ( & mut self ) -> anyhow:: Result < ( ) > {
86
86
let mut nesting = ListNesting :: new ( ) ;
87
- while let Some ( line) = self . iter . next ( ) {
88
- let line = line?;
89
- if line. is_empty ( ) {
90
- break ;
91
- }
87
+ while let Some ( line) = self . iter . peek ( ) {
88
+ let line = line. as_deref ( ) . map_err ( |e| anyhow ! ( "{e}" ) ) ?;
92
89
93
- if let Some ( ( marker, item) ) = get_list_item ( & line) {
90
+ if get_list_item ( & line) . is_some ( ) {
91
+ let line = self . iter . next ( ) . unwrap ( ) ?;
92
+ let ( marker, item) = get_list_item ( & line) . unwrap ( ) ;
94
93
nesting. set_current ( marker) ;
95
94
self . write_list_item ( item, & nesting) ;
95
+ self . process_paragraph ( nesting. indent ( ) , |line| {
96
+ line. is_empty ( ) || get_list_item ( line) . is_some ( ) || line == "+"
97
+ } ) ?;
96
98
} else if line == "+" {
99
+ let _ = self . iter . next ( ) . unwrap ( ) ?;
97
100
let line = self
98
101
. iter
99
102
. peek ( )
@@ -118,11 +121,17 @@ impl<'a, 'b, R: BufRead> Converter<'a, 'b, R> {
118
121
self . process_video_block ( None , indent) ?;
119
122
} else {
120
123
self . write_line ( "" , 0 ) ;
121
- self . process_paragraph ( indent) ?;
124
+ let current = nesting. current ( ) . unwrap ( ) ;
125
+ self . process_paragraph ( indent, |line| {
126
+ line. is_empty ( )
127
+ || get_list_item ( line) . filter ( |( m, _) | m == current) . is_some ( )
128
+ || line == "+"
129
+ } ) ?;
122
130
}
123
131
} else {
124
- bail ! ( "not a list block" )
132
+ break ;
125
133
}
134
+ self . skip_blank_lines ( ) ?;
126
135
}
127
136
128
137
Ok ( ( ) )
@@ -235,15 +244,19 @@ impl<'a, 'b, R: BufRead> Converter<'a, 'b, R> {
235
244
bail ! ( "not a video block" )
236
245
}
237
246
238
- fn process_paragraph ( & mut self , level : usize ) -> anyhow:: Result < ( ) > {
247
+ fn process_paragraph < P > ( & mut self , level : usize , predicate : P ) -> anyhow:: Result < ( ) >
248
+ where
249
+ P : Fn ( & str ) -> bool ,
250
+ {
239
251
while let Some ( line) = self . iter . peek ( ) {
240
252
let line = line. as_deref ( ) . map_err ( |e| anyhow ! ( "{e}" ) ) ?;
241
- if line . is_empty ( ) || ( level > 0 && line == "+" ) {
253
+ if predicate ( & line) {
242
254
break ;
243
255
}
244
256
245
257
self . write_indent ( level) ;
246
258
let line = self . iter . next ( ) . unwrap ( ) ?;
259
+ let line = line. trim_start ( ) ;
247
260
if line. ends_with ( '+' ) {
248
261
let line = & line[ ..( line. len ( ) - 1 ) ] ;
249
262
self . output . push_str ( line) ;
@@ -373,6 +386,10 @@ impl ListNesting {
373
386
Self ( Vec :: < ListMarker > :: with_capacity ( 6 ) )
374
387
}
375
388
389
+ fn current ( & mut self ) -> Option < & ListMarker > {
390
+ self . 0 . last ( )
391
+ }
392
+
376
393
fn set_current ( & mut self , marker : ListMarker ) {
377
394
let Self ( markers) = self ;
378
395
if let Some ( index) = markers. iter ( ) . position ( |m| * m == marker) {
@@ -469,6 +486,22 @@ rustup update nightly
469
486
----
470
487
This is a plain listing.
471
488
----
489
+ * single line item followed by empty lines
490
+
491
+ * multiline list
492
+ item followed by empty lines
493
+
494
+ * multiline list
495
+ item with indent
496
+
497
+ * multiline list
498
+ item not followed by empty lines
499
+ * multiline list
500
+ item followed by different marker
501
+ ** foo
502
+ ** bar
503
+ * multiline list
504
+ item followed by list continuation
472
505
+
473
506
paragraph
474
507
paragraph
@@ -539,6 +572,19 @@ Release: release:2022-01-01[]
539
572
```
540
573
This is a plain listing.
541
574
```
575
+ - single line item followed by empty lines
576
+ - multiline list
577
+ item followed by empty lines
578
+ - multiline list
579
+ item with indent
580
+ - multiline list
581
+ item not followed by empty lines
582
+ - multiline list
583
+ item followed by different marker
584
+ - foo
585
+ - bar
586
+ - multiline list
587
+ item followed by list continuation
542
588
543
589
paragraph
544
590
paragraph
0 commit comments