ext/redcarpet/markdown.c in redcarpet-2.3.0 vs ext/redcarpet/markdown.c in redcarpet-3.0.0
- old
+ new
@@ -63,10 +63,11 @@
typedef size_t
(*char_trigger)(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
static size_t char_emphasis(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
static size_t char_underline(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
+static size_t char_highlight(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
static size_t char_linebreak(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
static size_t char_codespan(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
static size_t char_escape(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
static size_t char_entity(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
static size_t char_langle_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
@@ -393,11 +394,11 @@
find_emph_char(uint8_t *data, size_t size, uint8_t c)
{
size_t i = 1;
while (i < size) {
- while (i < size && data[i] != c && data[i] != '`' && data[i] != '[')
+ while (i < size && data[i] != c && data[i] != '[')
i++;
if (i == size)
return 0;
@@ -537,10 +538,12 @@
work = rndr_newbuf(rndr, BUFFER_SPAN);
parse_inline(work, rndr, data, i);
if (c == '~')
r = rndr->cb.strikethrough(ob, work, rndr->opaque);
+ else if (c == '=')
+ r = rndr->cb.highlight(ob, work, rndr->opaque);
else
r = rndr->cb.double_emphasis(ob, work, rndr->opaque);
rndr_popbuf(rndr, BUFFER_SPAN);
return r ? i + 2 : 0;
@@ -598,18 +601,18 @@
{
uint8_t c = data[0];
size_t ret;
if (rndr->ext_flags & MKDEXT_NO_INTRA_EMPHASIS) {
- if (offset > 0 && !_isspace(data[-1]) && data[-1] != '>')
+ if (offset > 0 && !_isspace(data[-1]) && data[-1] != '>' && data[-1] != '(')
return 0;
}
if (size > 2 && data[1] != c) {
/* whitespace cannot follow an opening emphasis;
* strikethrough only takes two characters '~~' */
- if (c == '~' || _isspace(data[1]) || (ret = parse_emph1(ob, rndr, data + 1, size - 1, c)) == 0)
+ if (c == '~' || c == '=' || _isspace(data[1]) || (ret = parse_emph1(ob, rndr, data + 1, size - 1, c)) == 0)
return 0;
return ret + 1;
}
@@ -619,11 +622,11 @@
return ret + 2;
}
if (size > 4 && data[1] == c && data[2] == c && data[3] != c) {
- if (c == '~' || _isspace(data[3]) || (ret = parse_emph3(ob, rndr, data + 3, size - 3, c)) == 0)
+ if (c == '~' || c == '=' || _isspace(data[3]) || (ret = parse_emph3(ob, rndr, data + 3, size - 3, c)) == 0)
return 0;
return ret + 3;
}
@@ -896,14 +899,22 @@
i++;
link_b = i;
/* looking for link end: ' " ) */
+ /* Count the number of open parenthesis */
+ size_t nb_p = 0;
+
while (i < size) {
if (data[i] == '\\') i += 2;
- else if (data[i] == ')') break;
- else if (i >= 1 && _isspace(data[i-1]) && (data[i] == '\'' || data[i] == '"')) break;
+ else if (data[i] == '(' && i != 0) {
+ nb_p++; i++;
+ }
+ else if (data[i] == ')') {
+ if (nb_p == 0) break;
+ else nb_p--; i++;
+ } else if (i >= 1 && _isspace(data[i-1]) && (data[i] == '\'' || data[i] == '"')) break;
else i++;
}
if (i >= size) goto cleanup;
link_e = i;
@@ -2421,10 +2432,12 @@
if (md->cb.emphasis || md->cb.double_emphasis || md->cb.triple_emphasis) {
md->active_char['*'] = MD_CHAR_EMPHASIS;
md->active_char['_'] = MD_CHAR_EMPHASIS;
if (extensions & MKDEXT_STRIKETHROUGH)
md->active_char['~'] = MD_CHAR_EMPHASIS;
+ if (extensions & MKDEXT_HIGHLIGHT)
+ md->active_char['='] = MD_CHAR_EMPHASIS;
}
if (md->cb.codespan)
md->active_char['`'] = MD_CHAR_CODESPAN;
@@ -2553,7 +2566,5 @@
{
*ver_major = SUNDOWN_VER_MAJOR;
*ver_minor = SUNDOWN_VER_MINOR;
*ver_revision = SUNDOWN_VER_REVISION;
}
-
-/* vim: set filetype=c: */