diff --git a/src/html.rs b/src/html.rs index be4b57f..07e896d 100644 --- a/src/html.rs +++ b/src/html.rs @@ -30,6 +30,7 @@ pub struct Renderer { footnote_number: Option, not_first_line: bool, close_para: bool, + ignore: bool, } impl Render for Renderer { @@ -41,6 +42,20 @@ impl Render for Renderer { return Ok(()); } + if matches!(&e, Event::Start(Container::LinkDefinition { .. }, ..)) { + self.ignore = true; + return Ok(()); + } + + if matches!(&e, Event::End(Container::LinkDefinition { .. })) { + self.ignore = false; + return Ok(()); + } + + if self.ignore { + return Ok(()); + } + let close_para = self.close_para; if close_para { self.close_para = false; @@ -151,6 +166,7 @@ impl Render for Renderer { Container::Strong => out.write_str(" out.write_str(" out.write_str(" return Ok(()), } for (a, v) in attrs.iter().filter(|(a, _)| *a != "class") { @@ -343,6 +359,7 @@ impl Render for Renderer { Container::Strong => out.write_str("")?, Container::Emphasis => out.write_str("")?, Container::Mark => out.write_str("")?, + Container::LinkDefinition { .. } => unreachable!(), } } Event::Str(s) => match self.raw { diff --git a/src/lib.rs b/src/lib.rs index 05e1228..dd0a126 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -327,6 +327,8 @@ pub enum Container<'s> { Caption, /// A term within a description list. DescriptionTerm, + /// A link definition. + LinkDefinition { label: &'s str }, /// A block with raw markup for a specific output format. RawBlock { format: &'s str }, /// A block with code in a specific language. @@ -381,6 +383,7 @@ impl<'s> Container<'s> { | Self::TableCell { .. } | Self::Caption | Self::DescriptionTerm + | Self::LinkDefinition { .. } | Self::RawBlock { .. } | Self::CodeBlock { .. } => true, Self::Span @@ -419,6 +422,7 @@ impl<'s> Container<'s> { | Self::TableCell { .. } | Self::Caption | Self::DescriptionTerm + | Self::LinkDefinition { .. } | Self::RawBlock { .. } | Self::CodeBlock { .. } | Self::Span @@ -941,14 +945,6 @@ impl<'s> Parser<'s> { let cont = match c { block::Node::Leaf(l) => { self.inline_parser.reset(); - if matches!(l, block::Leaf::LinkDefinition) { - // ignore link definitions - if enter { - self.tree.take_inlines().last(); - } - self.block_attributes = Attributes::new(); - continue; - } match l { block::Leaf::Paragraph => Container::Paragraph, block::Leaf::Heading { has_section } => Container::Heading { @@ -977,7 +973,9 @@ impl<'s> Parser<'s> { head: self.table_head_row, }, block::Leaf::Caption => Container::Caption, - block::Leaf::LinkDefinition => unreachable!(), + block::Leaf::LinkDefinition => { + Container::LinkDefinition { label: content } + } } } block::Node::Container(c) => match c { @@ -1418,6 +1416,9 @@ mod test { End(Link("url".into(), LinkType::Span(SpanLinkType::Reference))), End(Paragraph), Blankline, + Start(LinkDefinition { label: "tag" }, Attributes::new()), + Str("url".into()), + End(LinkDefinition { label: "tag" }), ); test_parse!( concat!( @@ -1434,6 +1435,9 @@ mod test { End(Image("url".into(), SpanLinkType::Reference)), End(Paragraph), Blankline, + Start(LinkDefinition { label: "tag" }, Attributes::new()), + Str("url".into()), + End(LinkDefinition { label: "tag" }), ); } @@ -1483,6 +1487,9 @@ mod test { End(Paragraph), End(Blockquote), Blankline, + Start(LinkDefinition { label: "a b" }, Attributes::new()), + Str("url".into()), + End(LinkDefinition { label: "a b" }), ); } @@ -1504,6 +1511,11 @@ mod test { End(Link("url".into(), LinkType::Span(SpanLinkType::Reference))), End(Paragraph), Blankline, + Start(LinkDefinition { label: "tag" }, Attributes::new()), + Str("u".into()), + Softbreak, + Str("rl".into()), + End(LinkDefinition { label: "tag" }), ); test_parse!( concat!( @@ -1521,6 +1533,9 @@ mod test { End(Link("url".into(), LinkType::Span(SpanLinkType::Reference))), End(Paragraph), Blankline, + Start(LinkDefinition { label: "tag" }, Attributes::new()), + Str("url".into()), + End(LinkDefinition { label: "tag" }), ); } @@ -1543,6 +1558,12 @@ mod test { End(Link("url".into(), LinkType::Span(SpanLinkType::Reference))), End(Paragraph), Blankline, + Start( + LinkDefinition { label: "tag" }, + [("a", "b")].into_iter().collect() + ), + Str("url".into()), + End(LinkDefinition { label: "tag" }), Start(Paragraph, Attributes::new()), Str("para".into()), End(Paragraph),