@@ -104,6 +104,25 @@ thread_local!(pub static PLAYGROUND: RefCell<Option<(Option<String>, String)>> =
104
104
RefCell :: new( None )
105
105
} ) ;
106
106
107
+ macro_rules! event_loop_break {
108
+ ( $parser: expr, $toc_builder: expr, $shorter: expr, $buf: expr, $( $end_event: pat) |* ) => { {
109
+ while let Some ( event) = $parser. next( ) {
110
+ match event {
111
+ $( $end_event) |* => break ,
112
+ Event :: Text ( ref s) => {
113
+ $buf. push_str( s) ;
114
+ }
115
+ Event :: SoftBreak | Event :: HardBreak if !$buf. is_empty( ) => {
116
+ $buf. push( ' ' ) ;
117
+ }
118
+ x => {
119
+ looper( $parser, & mut $buf, Some ( x) , $toc_builder, $shorter) ;
120
+ }
121
+ }
122
+ }
123
+ } }
124
+ }
125
+
107
126
pub fn render ( w : & mut fmt:: Formatter ,
108
127
s : & str ,
109
128
print_toc : bool ,
@@ -186,21 +205,10 @@ pub fn render(w: &mut fmt::Formatter,
186
205
} ) ;
187
206
}
188
207
189
- fn header ( parser : & mut Parser , level : i32 , toc_builder : & mut Option < TocBuilder > ,
190
- buffer : & mut String ) {
208
+ fn header ( parser : & mut Parser , buffer : & mut String , toc_builder : & mut Option < TocBuilder > ,
209
+ shorter : MarkdownOutputStyle , level : i32 ) {
191
210
let mut ret = String :: new ( ) ;
192
- while let Some ( event) = parser. next ( ) {
193
- match event {
194
- Event :: End ( Tag :: Header ( _) ) => break ,
195
- Event :: Text ( ref s) => {
196
- ret. push_str ( s) ;
197
- }
198
- Event :: SoftBreak | Event :: HardBreak if !ret. is_empty ( ) => {
199
- ret. push ( ' ' ) ;
200
- }
201
- _ => { }
202
- }
203
- }
211
+ event_loop_break ! ( parser, toc_builder, shorter, ret, Event :: End ( Tag :: Header ( _) ) ) ;
204
212
ret = ret. trim_right ( ) . to_owned ( ) ;
205
213
206
214
let id = ret. clone ( ) ;
@@ -236,82 +244,35 @@ pub fn render(w: &mut fmt::Formatter,
236
244
ret, lvl = level, id = id, sec = sec) ) ;
237
245
}
238
246
239
- fn codespan ( parser : & mut Parser , buffer : & mut String ) {
247
+ fn codespan ( parser : & mut Parser , buffer : & mut String , toc_builder : & mut Option < TocBuilder > ,
248
+ shorter : MarkdownOutputStyle ) {
240
249
let mut content = String :: new ( ) ;
241
- while let Some ( event) = parser. next ( ) {
242
- match event {
243
- Event :: End ( Tag :: Code ) => break ,
244
- Event :: Text ( ref s) => {
245
- content. push_str ( s) ;
246
- }
247
- Event :: SoftBreak | Event :: HardBreak if !content. is_empty ( ) => {
248
- content. push ( ' ' ) ;
249
- }
250
- _ => { }
251
- }
252
- }
253
- buffer. push_str ( & format ! ( "<code>{}</code>" , Escape ( & collapse_whitespace( content. trim_right( ) ) ) ) ) ;
250
+ event_loop_break ! ( parser, toc_builder, shorter, content, Event :: End ( Tag :: Code ) ) ;
251
+ buffer. push_str ( & format ! ( "<code>{}</code>" ,
252
+ Escape ( & collapse_whitespace( content. trim_right( ) ) ) ) ) ;
254
253
}
255
254
256
255
fn link ( parser : & mut Parser , buffer : & mut String , toc_builder : & mut Option < TocBuilder > ,
257
256
shorter : MarkdownOutputStyle , url : & str , mut title : String ) {
258
- while let Some ( event) = parser. next ( ) {
259
- match event {
260
- Event :: End ( Tag :: Link ( _, _) ) => break ,
261
- Event :: Text ( ref s) => {
262
- title. push_str ( s) ;
263
- }
264
- Event :: SoftBreak | Event :: HardBreak if !title. is_empty ( ) => {
265
- title. push ( ' ' ) ;
266
- }
267
- x => {
268
- looper ( parser, & mut title, Some ( x) , toc_builder, shorter) ;
269
- }
270
- }
271
- }
257
+ event_loop_break ! ( parser, toc_builder, shorter, title, Event :: End ( Tag :: Link ( _, _) ) ) ;
272
258
buffer. push_str ( & format ! ( "<a href=\" {}\" >{}</a>" , url, title) ) ;
273
259
}
274
260
275
261
fn paragraph ( parser : & mut Parser , buffer : & mut String , toc_builder : & mut Option < TocBuilder > ,
276
262
shorter : MarkdownOutputStyle ) {
277
263
let mut content = String :: new ( ) ;
278
- while let Some ( event) = parser. next ( ) {
279
- match event {
280
- Event :: End ( Tag :: Paragraph ) => break ,
281
- Event :: Text ( ref s) => {
282
- content. push_str ( s) ;
283
- }
284
- Event :: SoftBreak | Event :: HardBreak if !content. is_empty ( ) => {
285
- content. push ( ' ' ) ;
286
- }
287
- x => {
288
- looper ( parser, & mut content, Some ( x) , toc_builder, shorter) ;
289
- }
290
- }
291
- }
264
+ event_loop_break ! ( parser, toc_builder, shorter, content, Event :: End ( Tag :: Paragraph ) ) ;
292
265
buffer. push_str ( & format ! ( "<p>{}</p>" , content. trim_right( ) ) ) ;
293
266
}
294
267
295
268
fn cell ( parser : & mut Parser , buffer : & mut String , toc_builder : & mut Option < TocBuilder > ,
296
269
shorter : MarkdownOutputStyle ) {
297
270
let mut content = String :: new ( ) ;
298
- while let Some ( event) = parser. next ( ) {
299
- match event {
300
- Event :: End ( Tag :: TableHead ) |
301
- Event :: End ( Tag :: Table ( _) ) |
302
- Event :: End ( Tag :: TableRow ) |
303
- Event :: End ( Tag :: TableCell ) => break ,
304
- Event :: Text ( ref s) => {
305
- content. push_str ( s) ;
306
- }
307
- Event :: SoftBreak | Event :: HardBreak => {
308
- content. push ( ' ' ) ;
309
- }
310
- x => {
311
- looper ( parser, & mut content, Some ( x) , toc_builder, shorter) ;
312
- }
313
- }
314
- }
271
+ event_loop_break ! ( parser, toc_builder, shorter, content,
272
+ Event :: End ( Tag :: TableHead ) |
273
+ Event :: End ( Tag :: Table ( _) ) |
274
+ Event :: End ( Tag :: TableRow ) |
275
+ Event :: End ( Tag :: TableCell ) ) ;
315
276
buffer. push_str ( & format ! ( "<td>{}</td>" , content. trim( ) ) ) ;
316
277
}
317
278
@@ -381,20 +342,7 @@ pub fn render(w: &mut fmt::Formatter,
381
342
fn blockquote ( parser : & mut Parser , buffer : & mut String , toc_builder : & mut Option < TocBuilder > ,
382
343
shorter : MarkdownOutputStyle ) {
383
344
let mut content = String :: new ( ) ;
384
- while let Some ( event) = parser. next ( ) {
385
- match event {
386
- Event :: End ( Tag :: BlockQuote ) => break ,
387
- Event :: Text ( ref s) => {
388
- content. push_str ( s) ;
389
- }
390
- Event :: SoftBreak | Event :: HardBreak if !content. is_empty ( ) => {
391
- content. push ( ' ' ) ;
392
- }
393
- x => {
394
- looper ( parser, & mut content, Some ( x) , toc_builder, shorter) ;
395
- }
396
- }
397
- }
345
+ event_loop_break ! ( parser, toc_builder, shorter, content, Event :: End ( Tag :: BlockQuote ) ) ;
398
346
buffer. push_str ( & format ! ( "<blockquote>{}</blockquote>" , content. trim_right( ) ) ) ;
399
347
}
400
348
@@ -435,40 +383,14 @@ pub fn render(w: &mut fmt::Formatter,
435
383
fn emphasis ( parser : & mut Parser , buffer : & mut String , toc_builder : & mut Option < TocBuilder > ,
436
384
shorter : MarkdownOutputStyle ) {
437
385
let mut content = String :: new ( ) ;
438
- while let Some ( event) = parser. next ( ) {
439
- match event {
440
- Event :: End ( Tag :: Emphasis ) => break ,
441
- Event :: Text ( ref s) => {
442
- content. push_str ( s) ;
443
- }
444
- Event :: SoftBreak | Event :: HardBreak if !content. is_empty ( ) => {
445
- content. push ( ' ' ) ;
446
- }
447
- x => {
448
- looper ( parser, & mut content, Some ( x) , toc_builder, shorter) ;
449
- }
450
- }
451
- }
386
+ event_loop_break ! ( parser, toc_builder, shorter, content, Event :: End ( Tag :: Emphasis ) ) ;
452
387
buffer. push_str ( & format ! ( "<em>{}</em>" , content) ) ;
453
388
}
454
389
455
390
fn strong ( parser : & mut Parser , buffer : & mut String , toc_builder : & mut Option < TocBuilder > ,
456
391
shorter : MarkdownOutputStyle ) {
457
392
let mut content = String :: new ( ) ;
458
- while let Some ( event) = parser. next ( ) {
459
- match event {
460
- Event :: End ( Tag :: Strong ) => break ,
461
- Event :: Text ( ref s) => {
462
- content. push_str ( s) ;
463
- }
464
- Event :: SoftBreak | Event :: HardBreak if !content. is_empty ( ) => {
465
- content. push ( ' ' ) ;
466
- }
467
- x => {
468
- looper ( parser, & mut content, Some ( x) , toc_builder, shorter) ;
469
- }
470
- }
471
- }
393
+ event_loop_break ! ( parser, toc_builder, shorter, content, Event :: End ( Tag :: Strong ) ) ;
472
394
buffer. push_str ( & format ! ( "<strong>{}</strong>" , content) ) ;
473
395
}
474
396
@@ -480,10 +402,10 @@ pub fn render(w: &mut fmt::Formatter,
480
402
block ( parser, buffer, & * lang) ;
481
403
}
482
404
Event :: Start ( Tag :: Header ( level) ) => {
483
- header ( parser, level , toc_builder, buffer ) ;
405
+ header ( parser, buffer , toc_builder, shorter , level ) ;
484
406
}
485
407
Event :: Start ( Tag :: Code ) => {
486
- codespan ( parser, buffer) ;
408
+ codespan ( parser, buffer, toc_builder , shorter ) ;
487
409
}
488
410
Event :: Start ( Tag :: Paragraph ) => {
489
411
paragraph ( parser, buffer, toc_builder, shorter) ;
0 commit comments