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