From 407b98c7f049a068f08c9d2b157583bf92714277 Mon Sep 17 00:00:00 2001 From: rhysd Date: Sat, 21 Sep 2024 21:40:20 +0900 Subject: [PATCH] fix `` is nested when a text inside a link is auto-linked --- v2/src/markdown/parser.rs | 15 ++++++++-- ...kdown__parser__tests__url_inside_link.snap | 29 +++++++++++++++++++ v2/src/markdown/testdata/url_inside_link.md | 4 +++ 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 v2/src/markdown/snapshots/shiba_preview__markdown__parser__tests__url_inside_link.snap create mode 100644 v2/src/markdown/testdata/url_inside_link.md diff --git a/v2/src/markdown/parser.rs b/v2/src/markdown/parser.rs index 71f5221..430e0c5 100644 --- a/v2/src/markdown/parser.rs +++ b/v2/src/markdown/parser.rs @@ -551,6 +551,7 @@ impl<'input, W: Write, V: TextVisitor, T: TextTokenizer> RenderTreeEncoder<'inpu fn events(&mut self, parser: Parser<'input>) -> Result<()> { let mut in_code_block = false; let mut in_auto_link = false; + let mut in_link = false; let mut events = parser.into_offset_iter().peekable(); while let Some((event, range)) = events.next() { @@ -669,6 +670,8 @@ impl<'input, W: Write, V: TextVisitor, T: TextTokenizer> RenderTreeEncoder<'inpu self.out.write_all(br#","title":"#)?; self.string(&title)?; } + + in_link = true; } Image { dest_url, title, .. } => { self.tag("img")?; @@ -717,9 +720,14 @@ impl<'input, W: Write, V: TextVisitor, T: TextTokenizer> RenderTreeEncoder<'inpu use TagEnd::*; match tag_end { Link if in_auto_link => in_auto_link = false, + Link => { + in_link = false; + self.tag_end()? + } Paragraph | Heading(_) | TableRow | TableCell | BlockQuote(_) | List(_) - | Item | Emphasis | Strong | Strikethrough | Link | Image - | FootnoteDefinition => self.tag_end()?, + | Item | Emphasis | Strong | Strikethrough | Image | FootnoteDefinition => { + self.tag_end()? + } CodeBlock => { in_code_block = false; self.tag_end()?; @@ -742,7 +750,7 @@ impl<'input, W: Write, V: TextVisitor, T: TextTokenizer> RenderTreeEncoder<'inpu | MetadataBlock(_) => unreachable!("disabled markdown feature"), // This option is not enabled } } - Event::Text(text) if in_code_block => self.text(&text, range)?, + Event::Text(text) if in_code_block || in_link => self.text(&text, range)?, Event::Text(text) => self.autolink_text(&text, range)?, Event::Code(text) => { let pad = (range.len() - text.len()) / 2; @@ -1042,6 +1050,7 @@ mod tests { snapshot_test!(inline_items_nested_in_inline_html); snapshot_test!(escaped_chars_in_text); snapshot_test!(alert); + snapshot_test!(url_inside_link); // Offset snapshot_test!(offset_block, Some(30)); diff --git a/v2/src/markdown/snapshots/shiba_preview__markdown__parser__tests__url_inside_link.snap b/v2/src/markdown/snapshots/shiba_preview__markdown__parser__tests__url_inside_link.snap new file mode 100644 index 0000000..d0c6d2b --- /dev/null +++ b/v2/src/markdown/snapshots/shiba_preview__markdown__parser__tests__url_inside_link.snap @@ -0,0 +1,29 @@ +--- +source: src/markdown/parser.rs +expression: json +--- +{ + "kind": "render_tree", + "tree": [ + { + "c": [ + { + "c": [ + "https://example.com/text" + ], + "href": "https://example.com/link", + "t": "a" + }, + " ", + { + "c": [ + "https://example.com/text" + ], + "href": "https://example.com/label", + "t": "a" + } + ], + "t": "p" + } + ] +} diff --git a/v2/src/markdown/testdata/url_inside_link.md b/v2/src/markdown/testdata/url_inside_link.md new file mode 100644 index 0000000..78445c1 --- /dev/null +++ b/v2/src/markdown/testdata/url_inside_link.md @@ -0,0 +1,4 @@ +[https://example.com/text](https://example.com/link) +[https://example.com/text][example] + +[example]: https://example.com/label