@@ -54,7 +54,8 @@ use crate::html::render::small_url_encode;
54
54
use crate :: html:: toc:: TocBuilder ;
55
55
56
56
use pulldown_cmark:: {
57
- html, BrokenLink , CodeBlockKind , CowStr , Event , LinkType , OffsetIter , Options , Parser , Tag ,
57
+ html, BrokenLink , BrokenLinkCallback , CodeBlockKind , CowStr , Event , LinkType , OffsetIter ,
58
+ Options , Parser , Tag , TagEnd ,
58
59
} ;
59
60
60
61
#[ cfg( test) ]
@@ -230,7 +231,7 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for CodeBlocks<'_, 'a, I> {
230
231
let mut original_text = String :: new ( ) ;
231
232
for event in & mut self . inner {
232
233
match event {
233
- Event :: End ( Tag :: CodeBlock ( .. ) ) => break ,
234
+ Event :: End ( TagEnd :: CodeBlock ) => break ,
234
235
Event :: Text ( ref s) => {
235
236
original_text. push_str ( s) ;
236
237
}
@@ -359,16 +360,17 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for LinkReplacer<'a, I> {
359
360
match & mut event {
360
361
// This is a shortcut link that was resolved by the broken_link_callback: `[fn@f]`
361
362
// Remove any disambiguator.
362
- Some ( Event :: Start ( Tag :: Link (
363
+ Some ( Event :: Start ( Tag :: Link {
363
364
// [fn@f] or [fn@f][]
364
- LinkType :: ShortcutUnknown | LinkType :: CollapsedUnknown ,
365
- dest ,
365
+ link_type : LinkType :: ShortcutUnknown | LinkType :: CollapsedUnknown ,
366
+ dest_url ,
366
367
title,
367
- ) ) ) => {
368
- debug ! ( "saw start of shortcut link to {dest} with title {title}" ) ;
368
+ ..
369
+ } ) ) => {
370
+ debug ! ( "saw start of shortcut link to {dest_url} with title {title}" ) ;
369
371
// If this is a shortcut link, it was resolved by the broken_link_callback.
370
372
// So the URL will already be updated properly.
371
- let link = self . links . iter ( ) . find ( |& link| * link. href == * * dest ) ;
373
+ let link = self . links . iter ( ) . find ( |& link| * link. href == * * dest_url ) ;
372
374
// Since this is an external iterator, we can't replace the inner text just yet.
373
375
// Store that we saw a link so we know to replace it later.
374
376
if let Some ( link) = link {
@@ -381,16 +383,9 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for LinkReplacer<'a, I> {
381
383
}
382
384
}
383
385
// Now that we're done with the shortcut link, don't replace any more text.
384
- Some ( Event :: End ( Tag :: Link (
385
- LinkType :: ShortcutUnknown | LinkType :: CollapsedUnknown ,
386
- dest,
387
- _,
388
- ) ) ) => {
389
- debug ! ( "saw end of shortcut link to {dest}" ) ;
390
- if self . links . iter ( ) . any ( |link| * link. href == * * dest) {
391
- assert ! ( self . shortcut_link. is_some( ) , "saw closing link without opening tag" ) ;
392
- self . shortcut_link = None ;
393
- }
386
+ Some ( Event :: End ( TagEnd :: Link ) ) if self . shortcut_link . is_some ( ) => {
387
+ debug ! ( "saw end of shortcut link" ) ;
388
+ self . shortcut_link = None ;
394
389
}
395
390
// Handle backticks in inline code blocks, but only if we're in the middle of a shortcut link.
396
391
// [`fn@f`]
@@ -433,9 +428,11 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for LinkReplacer<'a, I> {
433
428
}
434
429
// If this is a link, but not a shortcut link,
435
430
// replace the URL, since the broken_link_callback was not called.
436
- Some ( Event :: Start ( Tag :: Link ( _, dest, title) ) ) => {
437
- if let Some ( link) = self . links . iter ( ) . find ( |& link| * link. original_text == * * dest) {
438
- * dest = CowStr :: Borrowed ( link. href . as_ref ( ) ) ;
431
+ Some ( Event :: Start ( Tag :: Link { dest_url, title, .. } ) ) => {
432
+ if let Some ( link) =
433
+ self . links . iter ( ) . find ( |& link| * link. original_text == * * dest_url)
434
+ {
435
+ * dest_url = CowStr :: Borrowed ( link. href . as_ref ( ) ) ;
439
436
if title. is_empty ( ) && !link. tooltip . is_empty ( ) {
440
437
* title = CowStr :: Borrowed ( link. tooltip . as_ref ( ) ) ;
441
438
}
@@ -477,9 +474,9 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for TableWrapper<'a, I> {
477
474
self . stored_events . push_back ( Event :: Start ( Tag :: Table ( t) ) ) ;
478
475
Event :: Html ( CowStr :: Borrowed ( "<div>" ) )
479
476
}
480
- Event :: End ( Tag :: Table ( t ) ) => {
477
+ Event :: End ( TagEnd :: Table ) => {
481
478
self . stored_events . push_back ( Event :: Html ( CowStr :: Borrowed ( "</div>" ) ) ) ;
482
- Event :: End ( Tag :: Table ( t ) )
479
+ Event :: End ( TagEnd :: Table )
483
480
}
484
481
e => e,
485
482
} )
@@ -519,11 +516,11 @@ impl<'a, 'b, 'ids, I: Iterator<Item = SpannedEvent<'a>>> Iterator
519
516
}
520
517
521
518
let event = self . inner . next ( ) ;
522
- if let Some ( ( Event :: Start ( Tag :: Heading ( level, _ , _ ) ) , _) ) = event {
519
+ if let Some ( ( Event :: Start ( Tag :: Heading { level, .. } ) , _) ) = event {
523
520
let mut id = String :: new ( ) ;
524
521
for event in & mut self . inner {
525
522
match & event. 0 {
526
- Event :: End ( Tag :: Heading ( .. ) ) => break ,
523
+ Event :: End ( TagEnd :: Heading ( _ ) ) => break ,
527
524
Event :: Text ( text) | Event :: Code ( text) => {
528
525
id. extend ( text. chars ( ) . filter_map ( slugify) ) ;
529
526
self . buf . push_back ( event) ;
@@ -566,27 +563,27 @@ impl<'a, I: Iterator<Item = Event<'a>>> SummaryLine<'a, I> {
566
563
}
567
564
}
568
565
569
- fn check_if_allowed_tag ( t : & Tag < ' _ > ) -> bool {
566
+ fn check_if_allowed_tag ( t : & TagEnd ) -> bool {
570
567
matches ! (
571
568
t,
572
- Tag :: Paragraph
573
- | Tag :: Emphasis
574
- | Tag :: Strong
575
- | Tag :: Strikethrough
576
- | Tag :: Link ( .. )
577
- | Tag :: BlockQuote
569
+ TagEnd :: Paragraph
570
+ | TagEnd :: Emphasis
571
+ | TagEnd :: Strong
572
+ | TagEnd :: Strikethrough
573
+ | TagEnd :: Link
574
+ | TagEnd :: BlockQuote
578
575
)
579
576
}
580
577
581
- fn is_forbidden_tag ( t : & Tag < ' _ > ) -> bool {
578
+ fn is_forbidden_tag ( t : & TagEnd ) -> bool {
582
579
matches ! (
583
580
t,
584
- Tag :: CodeBlock ( _ )
585
- | Tag :: Table ( _ )
586
- | Tag :: TableHead
587
- | Tag :: TableRow
588
- | Tag :: TableCell
589
- | Tag :: FootnoteDefinition ( _ )
581
+ TagEnd :: CodeBlock
582
+ | TagEnd :: Table
583
+ | TagEnd :: TableHead
584
+ | TagEnd :: TableRow
585
+ | TagEnd :: TableCell
586
+ | TagEnd :: FootnoteDefinition
590
587
)
591
588
}
592
589
@@ -604,12 +601,12 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for SummaryLine<'a, I> {
604
601
let mut is_start = true ;
605
602
let is_allowed_tag = match event {
606
603
Event :: Start ( ref c) => {
607
- if is_forbidden_tag ( c ) {
604
+ if is_forbidden_tag ( & c . to_end ( ) ) {
608
605
self . skipped_tags += 1 ;
609
606
return None ;
610
607
}
611
608
self . depth += 1 ;
612
- check_if_allowed_tag ( c )
609
+ check_if_allowed_tag ( & c . to_end ( ) )
613
610
}
614
611
Event :: End ( ref c) => {
615
612
if is_forbidden_tag ( c) {
@@ -633,7 +630,7 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for SummaryLine<'a, I> {
633
630
if is_start {
634
631
Some ( Event :: Start ( Tag :: Paragraph ) )
635
632
} else {
636
- Some ( Event :: End ( Tag :: Paragraph ) )
633
+ Some ( Event :: End ( TagEnd :: Paragraph ) )
637
634
}
638
635
} else {
639
636
Some ( event)
@@ -679,7 +676,7 @@ impl<'a, I: Iterator<Item = SpannedEvent<'a>>> Iterator for Footnotes<'a, I> {
679
676
Some ( ( Event :: Start ( Tag :: FootnoteDefinition ( def) ) , _) ) => {
680
677
let mut content = Vec :: new ( ) ;
681
678
for ( event, _) in & mut self . inner {
682
- if let Event :: End ( Tag :: FootnoteDefinition ( .. ) ) = event {
679
+ if let Event :: End ( TagEnd :: FootnoteDefinition ) = event {
683
680
break ;
684
681
}
685
682
content. push ( event) ;
@@ -696,7 +693,7 @@ impl<'a, I: Iterator<Item = SpannedEvent<'a>>> Iterator for Footnotes<'a, I> {
696
693
for ( mut content, id) in v {
697
694
write ! ( ret, "<li id=\" fn{id}\" >" ) . unwrap ( ) ;
698
695
let mut is_paragraph = false ;
699
- if let Some ( & Event :: End ( Tag :: Paragraph ) ) = content. last ( ) {
696
+ if let Some ( & Event :: End ( TagEnd :: Paragraph ) ) = content. last ( ) {
700
697
content. pop ( ) ;
701
698
is_paragraph = true ;
702
699
}
@@ -806,7 +803,7 @@ pub(crate) fn find_codes<T: doctest::DoctestVisitor>(
806
803
tests. visit_test ( text, block_info, line) ;
807
804
prev_offset = offset. start ;
808
805
}
809
- Event :: Start ( Tag :: Heading ( level, _ , _ ) ) => {
806
+ Event :: Start ( Tag :: Heading { level, .. } ) => {
810
807
register_header = Some ( level as u32 ) ;
811
808
}
812
809
Event :: Text ( ref s) if register_header. is_some ( ) => {
@@ -1432,7 +1429,7 @@ impl MarkdownItemInfo<'_> {
1432
1429
1433
1430
// Treat inline HTML as plain text.
1434
1431
let p = p. map ( |event| match event. 0 {
1435
- Event :: Html ( text) => ( Event :: Text ( text) , event. 1 ) ,
1432
+ Event :: Html ( text) | Event :: InlineHtml ( text ) => ( Event :: Text ( text) , event. 1 ) ,
1436
1433
_ => event,
1437
1434
} ) ;
1438
1435
@@ -1442,7 +1439,7 @@ impl MarkdownItemInfo<'_> {
1442
1439
let p = Footnotes :: new ( p) ;
1443
1440
let p = TableWrapper :: new ( p. map ( |( ev, _) | ev) ) ;
1444
1441
let p = p. filter ( |event| {
1445
- !matches ! ( event, Event :: Start ( Tag :: Paragraph ) | Event :: End ( Tag :: Paragraph ) )
1442
+ !matches ! ( event, Event :: Start ( Tag :: Paragraph ) | Event :: End ( TagEnd :: Paragraph ) )
1446
1443
} ) ;
1447
1444
html:: push_html ( & mut s, p) ;
1448
1445
@@ -1472,7 +1469,7 @@ impl MarkdownSummaryLine<'_> {
1472
1469
let mut s = String :: new ( ) ;
1473
1470
1474
1471
let without_paragraphs = LinkReplacer :: new ( & mut summary, links) . filter ( |event| {
1475
- !matches ! ( event, Event :: Start ( Tag :: Paragraph ) | Event :: End ( Tag :: Paragraph ) )
1472
+ !matches ! ( event, Event :: Start ( Tag :: Paragraph ) | Event :: End ( TagEnd :: Paragraph ) )
1476
1473
} ) ;
1477
1474
1478
1475
html:: push_html ( & mut s, without_paragraphs) ;
@@ -1544,8 +1541,8 @@ fn markdown_summary_with_limit(
1544
1541
_ => { }
1545
1542
} ,
1546
1543
Event :: End ( tag) => match tag {
1547
- Tag :: Emphasis | Tag :: Strong => buf. close_tag ( ) ,
1548
- Tag :: Paragraph | Tag :: Heading ( .. ) => return ControlFlow :: Break ( ( ) ) ,
1544
+ TagEnd :: Emphasis | TagEnd :: Strong => buf. close_tag ( ) ,
1545
+ TagEnd :: Paragraph | TagEnd :: Heading ( _ ) => return ControlFlow :: Break ( ( ) ) ,
1549
1546
_ => { }
1550
1547
} ,
1551
1548
Event :: HardBreak | Event :: SoftBreak => buf. push ( " " ) ?,
@@ -1605,8 +1602,8 @@ pub(crate) fn plain_text_summary(md: &str, link_names: &[RenderedLink]) -> Strin
1605
1602
}
1606
1603
Event :: HardBreak | Event :: SoftBreak => s. push ( ' ' ) ,
1607
1604
Event :: Start ( Tag :: CodeBlock ( ..) ) => break ,
1608
- Event :: End ( Tag :: Paragraph ) => break ,
1609
- Event :: End ( Tag :: Heading ( ..) ) => break ,
1605
+ Event :: End ( TagEnd :: Paragraph ) => break ,
1606
+ Event :: End ( TagEnd :: Heading ( ..) ) => break ,
1610
1607
_ => ( ) ,
1611
1608
}
1612
1609
}
@@ -1765,7 +1762,7 @@ pub(crate) fn markdown_links<'md, R>(
1765
1762
1766
1763
while let Some ( ( event, span) ) = event_iter. next ( ) {
1767
1764
match event {
1768
- Event :: Start ( Tag :: Link ( link_type, dest , _ ) ) if may_be_doc_link ( link_type) => {
1765
+ Event :: Start ( Tag :: Link { link_type, dest_url , .. } ) if may_be_doc_link ( link_type) => {
1769
1766
let range = match link_type {
1770
1767
// Link is pulled from the link itself.
1771
1768
LinkType :: ReferenceUnknown | LinkType :: ShortcutUnknown => {
@@ -1775,7 +1772,7 @@ pub(crate) fn markdown_links<'md, R>(
1775
1772
LinkType :: Inline => span_for_offset_backward ( span, b'(' , b')' ) ,
1776
1773
// Link is pulled from elsewhere in the document.
1777
1774
LinkType :: Reference | LinkType :: Collapsed | LinkType :: Shortcut => {
1778
- span_for_link ( & dest , span)
1775
+ span_for_link ( & dest_url , span)
1779
1776
}
1780
1777
LinkType :: Autolink | LinkType :: Email => unreachable ! ( ) ,
1781
1778
} ;
@@ -1795,7 +1792,7 @@ pub(crate) fn markdown_links<'md, R>(
1795
1792
1796
1793
if let Some ( link) = preprocess_link ( MarkdownLink {
1797
1794
kind : link_type,
1798
- link : dest . into_string ( ) ,
1795
+ link : dest_url . into_string ( ) ,
1799
1796
display_text,
1800
1797
range,
1801
1798
} ) {
@@ -1810,8 +1807,8 @@ pub(crate) fn markdown_links<'md, R>(
1810
1807
}
1811
1808
1812
1809
/// Collects additional data of link.
1813
- fn collect_link_data < ' input , ' callback > (
1814
- event_iter : & mut OffsetIter < ' input , ' callback > ,
1810
+ fn collect_link_data < ' input , F : BrokenLinkCallback < ' input > > (
1811
+ event_iter : & mut OffsetIter < ' input , F > ,
1815
1812
) -> Option < String > {
1816
1813
let mut display_text: Option < String > = None ;
1817
1814
let mut append_text = |text : CowStr < ' _ > | {
0 commit comments