@@ -229,11 +229,30 @@ static bool S_ends_with_blank_line(cmark_node *node) {
229
229
}
230
230
}
231
231
232
+ // returns true if content remains after link defs are resolved.
233
+ static bool resolve_reference_link_definitions (
234
+ cmark_parser * parser ,
235
+ cmark_node * b ) {
236
+ bufsize_t pos ;
237
+ cmark_strbuf * node_content = & b -> content ;
238
+ cmark_chunk chunk = {node_content -> ptr , node_content -> size , 0 };
239
+ while (chunk .len && chunk .data [0 ] == '[' &&
240
+ (pos = cmark_parse_reference_inline (parser -> mem , & chunk ,
241
+ parser -> refmap ))) {
242
+
243
+ chunk .data += pos ;
244
+ chunk .len -= pos ;
245
+ }
246
+ cmark_strbuf_drop (node_content , (node_content -> size - chunk .len ));
247
+ return !is_blank (& b -> content , 0 );
248
+ }
249
+
232
250
static cmark_node * finalize (cmark_parser * parser , cmark_node * b ) {
233
251
bufsize_t pos ;
234
252
cmark_node * item ;
235
253
cmark_node * subitem ;
236
254
cmark_node * parent ;
255
+ bool has_content ;
237
256
238
257
parent = b -> parent ;
239
258
assert (b -> flags &
@@ -263,15 +282,8 @@ static cmark_node *finalize(cmark_parser *parser, cmark_node *b) {
263
282
switch (S_type (b )) {
264
283
case CMARK_NODE_PARAGRAPH :
265
284
{
266
- cmark_chunk chunk = {node_content -> ptr , node_content -> size , 0 };
267
- while (chunk .len && chunk .data [0 ] == '[' &&
268
- (pos = cmark_parse_reference_inline (parser -> mem , & chunk , parser -> refmap ))) {
269
-
270
- chunk .data += pos ;
271
- chunk .len -= pos ;
272
- }
273
- cmark_strbuf_drop (node_content , (node_content -> size - chunk .len ));
274
- if (is_blank (node_content , 0 )) {
285
+ has_content = resolve_reference_link_definitions (parser , b );
286
+ if (!has_content ) {
275
287
// remove blank node (former reference def)
276
288
cmark_node_free (b );
277
289
}
@@ -905,6 +917,7 @@ static void open_new_blocks(cmark_parser *parser, cmark_node **container,
905
917
bufsize_t matched = 0 ;
906
918
int lev = 0 ;
907
919
bool save_partially_consumed_tab ;
920
+ bool has_content ;
908
921
int save_offset ;
909
922
int save_column ;
910
923
@@ -977,10 +990,16 @@ static void open_new_blocks(cmark_parser *parser, cmark_node **container,
977
990
} else if (!indented && cont_type == CMARK_NODE_PARAGRAPH &&
978
991
(lev =
979
992
scan_setext_heading_line (input , parser -> first_nonspace ))) {
980
- (* container )-> type = (uint16_t )CMARK_NODE_HEADING ;
981
- (* container )-> as .heading .level = lev ;
982
- (* container )-> as .heading .setext = true;
983
- S_advance_offset (parser , input , input -> len - 1 - parser -> offset , false);
993
+ // finalize paragraph, resolving reference links
994
+ has_content = resolve_reference_link_definitions (parser , * container );
995
+
996
+ if (has_content ) {
997
+
998
+ (* container )-> type = (uint16_t )CMARK_NODE_HEADING ;
999
+ (* container )-> as .heading .level = lev ;
1000
+ (* container )-> as .heading .setext = true;
1001
+ S_advance_offset (parser , input , input -> len - 1 - parser -> offset , false);
1002
+ }
984
1003
} else if (!indented &&
985
1004
!(cont_type == CMARK_NODE_PARAGRAPH && !all_matched ) &&
986
1005
(parser -> thematic_break_kill_pos <= parser -> first_nonspace ) &&
0 commit comments