Skip to content

Commit 5fc41e2

Browse files
allow extensions to use ! and ^ as special characters
1 parent 2cd664e commit 5fc41e2

File tree

1 file changed

+28
-21
lines changed

1 file changed

+28
-21
lines changed

src/inlines.c

+28-21
Original file line numberDiff line numberDiff line change
@@ -1516,6 +1516,7 @@ static int parse_inline(cmark_parser *parser, subject *subj, cmark_node *parent,
15161516
cmark_chunk contents;
15171517
unsigned char c;
15181518
bufsize_t startpos, endpos;
1519+
bufsize_t initpos = subj->pos;
15191520
c = peek_char(subj);
15201521
if (c == 0) {
15211522
return 0;
@@ -1563,43 +1564,49 @@ static int parse_inline(cmark_parser *parser, subject *subj, cmark_node *parent,
15631564
new_inl = handle_close_bracket(parser, subj);
15641565
break;
15651566
case '!':
1566-
advance(subj);
1567-
if (peek_char(subj) == '[' && peek_char_n(subj, 1) != '^') {
1567+
if (peek_char_n(subj, 1) == '[' && peek_char_n(subj, 2) != '^') {
1568+
advance(subj);
15681569
advance(subj);
15691570
new_inl = make_str(subj, subj->pos - 2, subj->pos - 1, cmark_chunk_literal("!["));
15701571
push_bracket(subj, IMAGE, new_inl);
1571-
} else {
1572-
new_inl = make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("!"));
15731572
}
15741573
break;
15751574
case '^':
1576-
advance(subj);
15771575
// TODO: Support a name between ^ and [
1578-
if (peek_char(subj) == '[') {
1576+
if (peek_char_n(subj, 1) == '[') {
1577+
advance(subj);
15791578
advance(subj);
15801579
new_inl = make_str(subj, subj->pos - 2, subj->pos - 1, cmark_chunk_literal("^["));
15811580
push_bracket(subj, ATTRIBUTE, new_inl);
1582-
} else {
1583-
new_inl = make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("^"));
15841581
}
15851582
break;
1586-
default:
1587-
new_inl = try_extensions(parser, parent, c, subj);
1588-
if (new_inl != NULL)
1589-
break;
1583+
}
15901584

1591-
endpos = subject_find_special_char(parser, subj, options);
1592-
contents = cmark_chunk_dup(&subj->input, subj->pos, endpos - subj->pos);
1593-
startpos = subj->pos;
1594-
subj->pos = endpos;
1585+
if (subj->pos == initpos) {
1586+
if (!new_inl)
1587+
new_inl = try_extensions(parser, parent, c, subj);
15951588

1596-
// if we're at a newline, strip trailing spaces.
1597-
if ((options & CMARK_OPT_PRESERVE_WHITESPACE) == 0 && S_is_line_end_char(peek_char(subj))) {
1598-
cmark_chunk_rtrim(&contents);
1599-
}
1589+
if (!new_inl) {
1590+
if (c == '^' || c == '!') {
1591+
advance(subj);
1592+
new_inl = make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_dup(&subj->input, subj->pos - 1, 1));
1593+
} else {
1594+
endpos = subject_find_special_char(parser, subj, options);
1595+
contents = cmark_chunk_dup(&subj->input, subj->pos, endpos - subj->pos);
1596+
startpos = subj->pos;
1597+
subj->pos = endpos;
1598+
1599+
// if we're at a newline, strip trailing spaces.
1600+
if ((options & CMARK_OPT_PRESERVE_WHITESPACE) == 0 && S_is_line_end_char(peek_char(subj))) {
1601+
cmark_chunk_rtrim(&contents);
1602+
}
16001603

1601-
new_inl = make_str(subj, startpos, endpos - 1, contents);
1604+
if (endpos > startpos)
1605+
new_inl = make_str(subj, startpos, endpos - 1, contents);
1606+
}
1607+
}
16021608
}
1609+
16031610
if (new_inl != NULL) {
16041611
cmark_node_append_child(parent, new_inl);
16051612
}

0 commit comments

Comments
 (0)