ext/redcarpet/markdown.c in redcarpet-2.2.2 vs ext/redcarpet/markdown.c in redcarpet-2.3.0
- old
+ new
@@ -62,10 +62,11 @@
struct sd_markdown;
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_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);
@@ -133,11 +134,11 @@
pool->item[pool->size] != NULL) {
work = pool->item[pool->size++];
work->size = 0;
} else {
work = bufnew(buf_size[type]);
- stack_push(pool, work);
+ redcarpet_stack_push(pool, work);
}
return work;
}
@@ -485,12 +486,10 @@
{
size_t i = 0, len;
struct buf *work = 0;
int r;
- if (!rndr->cb.emphasis) return 0;
-
/* skipping one symbol if coming from emph3 */
if (size > 1 && data[0] == c && data[1] == c) i = 1;
while (i < size) {
len = find_emph_char(data + i, size - i, c);
@@ -505,11 +504,16 @@
continue;
}
work = rndr_newbuf(rndr, BUFFER_SPAN);
parse_inline(work, rndr, data, i);
- r = rndr->cb.emphasis(ob, work, rndr->opaque);
+
+ if (rndr->ext_flags & MKDEXT_UNDERLINE && c == '_')
+ r = rndr->cb.underline(ob, work, rndr->opaque);
+ else
+ r = rndr->cb.emphasis(ob, work, rndr->opaque);
+
rndr_popbuf(rndr, BUFFER_SPAN);
return r ? i + 1 : 0;
}
}
@@ -518,29 +522,28 @@
/* parse_emph2 • parsing single emphase */
static size_t
parse_emph2(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)
{
- int (*render_method)(struct buf *ob, const struct buf *text, void *opaque);
size_t i = 0, len;
struct buf *work = 0;
int r;
- render_method = (c == '~') ? rndr->cb.strikethrough : rndr->cb.double_emphasis;
-
- if (!render_method)
- return 0;
-
while (i < size) {
len = find_emph_char(data + i, size - i, c);
if (!len) return 0;
i += len;
if (i + 1 < size && data[i] == c && data[i + 1] == c && i && !_isspace(data[i - 1])) {
work = rndr_newbuf(rndr, BUFFER_SPAN);
parse_inline(work, rndr, data, i);
- r = render_method(ob, work, rndr->opaque);
+
+ if (c == '~')
+ r = rndr->cb.strikethrough(ob, work, rndr->opaque);
+ else
+ r = rndr->cb.double_emphasis(ob, work, rndr->opaque);
+
rndr_popbuf(rndr, BUFFER_SPAN);
return r ? i + 2 : 0;
}
i++;
}
@@ -2100,11 +2103,11 @@
}
while (i < under_end && data[i] == ' ')
i++;
- if (i < under_end && data[i] != '|')
+ if (i < under_end && data[i] != '|' && data[i] != '+')
break;
if (dashes < 3)
break;
@@ -2228,11 +2231,11 @@
beg += i;
else if (prefix_quote(txt_data, end))
beg += parse_blockquote(ob, rndr, txt_data, end);
- else if (prefix_code(txt_data, end))
+ else if (!(rndr->ext_flags & MKDEXT_DISABLE_INDENTED_CODE) && prefix_code(txt_data, end))
beg += parse_blockcode(ob, rndr, txt_data, end);
else if (prefix_uli(txt_data, end))
beg += parse_list(ob, rndr, txt_data, end, 0);
@@ -2408,12 +2411,12 @@
if (!md)
return NULL;
memcpy(&md->cb, callbacks, sizeof(struct sd_callbacks));
- stack_init(&md->work_bufs[BUFFER_BLOCK], 4);
- stack_init(&md->work_bufs[BUFFER_SPAN], 8);
+ redcarpet_stack_init(&md->work_bufs[BUFFER_BLOCK], 4);
+ redcarpet_stack_init(&md->work_bufs[BUFFER_SPAN], 8);
memset(md->active_char, 0x0, 256);
if (md->cb.emphasis || md->cb.double_emphasis || md->cb.triple_emphasis) {
md->active_char['*'] = MD_CHAR_EMPHASIS;
@@ -2537,11 +2540,11 @@
bufrelease(md->work_bufs[BUFFER_SPAN].item[i]);
for (i = 0; i < (size_t)md->work_bufs[BUFFER_BLOCK].asize; ++i)
bufrelease(md->work_bufs[BUFFER_BLOCK].item[i]);
- stack_free(&md->work_bufs[BUFFER_SPAN]);
- stack_free(&md->work_bufs[BUFFER_BLOCK]);
+ redcarpet_stack_free(&md->work_bufs[BUFFER_SPAN]);
+ redcarpet_stack_free(&md->work_bufs[BUFFER_BLOCK]);
free(md);
}
void