Skip to content

Commit e0e4aac

Browse files
authored
fix(markdown_parser): reject link reference definition with trailing text after destination (#9780)
1 parent aafca2d commit e0e4aac

2 files changed

Lines changed: 40 additions & 63 deletions

File tree

crates/biome_markdown_parser/src/syntax/link_block.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,10 @@ fn skip_destination_tokens(p: &mut MarkdownParser) -> DestinationResult {
305305
continue;
306306
}
307307

308-
if at_title_start(p) && has_content && saw_separator {
309-
// Break here - we've found separator before title
308+
if has_content && saw_separator {
309+
// After whitespace following destination content, only a title
310+
// starter is valid. Any other text means the destination ended
311+
// at the whitespace boundary.
310312
break;
311313
}
312314

crates/biome_markdown_parser/tests/md_test_suite/ok/link_definition_edge_cases.md.snap

Lines changed: 36 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -581,43 +581,28 @@ MdDocument {
581581
MdNewline {
582582
value_token: NEWLINE@439..440 "\n" [] [],
583583
},
584-
MdLinkReferenceDefinition {
585-
indent: MdIndentTokenList [],
586-
l_brack_token: L_BRACK@440..441 "[" [] [],
587-
label: MdLinkLabel {
588-
content: MdInlineItemList [
589-
MdTextual {
590-
value_token: MD_TEXTUAL_LITERAL@441..448 "invalid" [] [],
591-
},
592-
MdTextual {
593-
value_token: MD_TEXTUAL_LITERAL@448..449 "-" [] [],
594-
},
595-
MdTextual {
596-
value_token: MD_TEXTUAL_LITERAL@449..457 "trailing" [] [],
597-
},
598-
],
599-
},
600-
r_brack_token: R_BRACK@457..458 "]" [] [],
601-
colon_token: COLON@458..459 ":" [] [],
602-
destination: MdLinkDestination {
603-
content: MdInlineItemList [
604-
MdTextual {
605-
value_token: MD_TEXTUAL_LITERAL@459..460 " " [] [],
606-
},
607-
MdTextual {
608-
value_token: MD_TEXTUAL_LITERAL@460..464 "/url" [] [],
609-
},
610-
],
611-
},
612-
title: missing (optional),
613-
},
614584
MdParagraph {
615585
list: MdInlineItemList [
616586
MdTextual {
617-
value_token: MD_TEXTUAL_LITERAL@464..465 " " [] [],
587+
value_token: MD_TEXTUAL_LITERAL@440..441 "[" [] [],
588+
},
589+
MdTextual {
590+
value_token: MD_TEXTUAL_LITERAL@441..448 "invalid" [] [],
591+
},
592+
MdTextual {
593+
value_token: MD_TEXTUAL_LITERAL@448..449 "-" [] [],
594+
},
595+
MdTextual {
596+
value_token: MD_TEXTUAL_LITERAL@449..457 "trailing" [] [],
597+
},
598+
MdTextual {
599+
value_token: MD_TEXTUAL_LITERAL@457..458 "]" [] [],
600+
},
601+
MdTextual {
602+
value_token: MD_TEXTUAL_LITERAL@458..459 ":" [] [],
618603
},
619604
MdTextual {
620-
value_token: MD_TEXTUAL_LITERAL@465..472 "invalid" [] [],
605+
value_token: MD_TEXTUAL_LITERAL@459..472 " /url invalid" [] [],
621606
},
622607
MdTextual {
623608
value_token: MD_TEXTUAL_LITERAL@472..473 "\n" [] [],
@@ -1033,38 +1018,28 @@ MdDocument {
10331018
1: (empty)
10341019
36: MD_NEWLINE@439..440
10351020
0: NEWLINE@439..440 "\n" [] []
1036-
37: MD_LINK_REFERENCE_DEFINITION@440..464
1037-
0: MD_INDENT_TOKEN_LIST@440..440
1038-
1: L_BRACK@440..441 "[" [] []
1039-
2: MD_LINK_LABEL@441..457
1040-
0: MD_INLINE_ITEM_LIST@441..457
1041-
0: MD_TEXTUAL@441..448
1042-
0: MD_TEXTUAL_LITERAL@441..448 "invalid" [] []
1043-
1: MD_TEXTUAL@448..449
1044-
0: MD_TEXTUAL_LITERAL@448..449 "-" [] []
1045-
2: MD_TEXTUAL@449..457
1046-
0: MD_TEXTUAL_LITERAL@449..457 "trailing" [] []
1047-
3: R_BRACK@457..458 "]" [] []
1048-
4: COLON@458..459 ":" [] []
1049-
5: MD_LINK_DESTINATION@459..464
1050-
0: MD_INLINE_ITEM_LIST@459..464
1051-
0: MD_TEXTUAL@459..460
1052-
0: MD_TEXTUAL_LITERAL@459..460 " " [] []
1053-
1: MD_TEXTUAL@460..464
1054-
0: MD_TEXTUAL_LITERAL@460..464 "/url" [] []
1055-
6: (empty)
1056-
38: MD_PARAGRAPH@464..473
1057-
0: MD_INLINE_ITEM_LIST@464..473
1058-
0: MD_TEXTUAL@464..465
1059-
0: MD_TEXTUAL_LITERAL@464..465 " " [] []
1060-
1: MD_TEXTUAL@465..472
1061-
0: MD_TEXTUAL_LITERAL@465..472 "invalid" [] []
1062-
2: MD_TEXTUAL@472..473
1021+
37: MD_PARAGRAPH@440..473
1022+
0: MD_INLINE_ITEM_LIST@440..473
1023+
0: MD_TEXTUAL@440..441
1024+
0: MD_TEXTUAL_LITERAL@440..441 "[" [] []
1025+
1: MD_TEXTUAL@441..448
1026+
0: MD_TEXTUAL_LITERAL@441..448 "invalid" [] []
1027+
2: MD_TEXTUAL@448..449
1028+
0: MD_TEXTUAL_LITERAL@448..449 "-" [] []
1029+
3: MD_TEXTUAL@449..457
1030+
0: MD_TEXTUAL_LITERAL@449..457 "trailing" [] []
1031+
4: MD_TEXTUAL@457..458
1032+
0: MD_TEXTUAL_LITERAL@457..458 "]" [] []
1033+
5: MD_TEXTUAL@458..459
1034+
0: MD_TEXTUAL_LITERAL@458..459 ":" [] []
1035+
6: MD_TEXTUAL@459..472
1036+
0: MD_TEXTUAL_LITERAL@459..472 " /url invalid" [] []
1037+
7: MD_TEXTUAL@472..473
10631038
0: MD_TEXTUAL_LITERAL@472..473 "\n" [] []
10641039
1: (empty)
1065-
39: MD_NEWLINE@473..474
1040+
38: MD_NEWLINE@473..474
10661041
0: NEWLINE@473..474 "\n" [] []
1067-
40: MD_PARAGRAPH@474..507
1042+
39: MD_PARAGRAPH@474..507
10681043
0: MD_INLINE_ITEM_LIST@474..507
10691044
0: MD_TEXTUAL@474..475
10701045
0: MD_TEXTUAL_LITERAL@474..475 "[" [] []

0 commit comments

Comments
 (0)