diff --git a/snudown.c b/snudown.c index 781efa0..0b28007 100644 --- a/snudown.c +++ b/snudown.c @@ -52,6 +52,14 @@ static const unsigned int snudown_default_md_flags = MKDEXT_STRIKETHROUGH | MKDEXT_TABLES; +static const unsigned int snudown_wiki_md_flags = + MKDEXT_NO_INTRA_EMPHASIS | + MKDEXT_SUPERSCRIPT | + MKDEXT_AUTOLINK | + MKDEXT_STRIKETHROUGH | + MKDEXT_HTML_INLINE | + MKDEXT_TABLES; + static const unsigned int snudown_default_render_flags = HTML_SKIP_HTML | HTML_SKIP_IMAGES | @@ -116,8 +124,8 @@ void init_default_renderer(PyObject *module) { void init_wiki_renderer(PyObject *module) { PyModule_AddIntConstant(module, "RENDERER_WIKI", RENDERER_WIKI); - sundown[RENDERER_WIKI].main_renderer = make_custom_renderer(&wiki_state, snudown_wiki_render_flags, snudown_default_md_flags, 0); - sundown[RENDERER_WIKI].toc_renderer = make_custom_renderer(&wiki_toc_state, snudown_wiki_render_flags, snudown_default_md_flags, 1); + sundown[RENDERER_WIKI].main_renderer = make_custom_renderer(&wiki_state, snudown_wiki_render_flags, snudown_wiki_md_flags, 0); + sundown[RENDERER_WIKI].toc_renderer = make_custom_renderer(&wiki_toc_state, snudown_wiki_render_flags, snudown_wiki_md_flags, 1); sundown[RENDERER_WIKI].state = &wiki_state; sundown[RENDERER_WIKI].toc_state = &wiki_toc_state; } diff --git a/src/markdown.c b/src/markdown.c index f251d10..42ac3a3 100644 --- a/src/markdown.c +++ b/src/markdown.c @@ -736,6 +736,13 @@ char_entity(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offs return end; } +static size_t is_html_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size) { + enum mkd_autolink altype = MKDA_NOT_AUTOLINK; + size_t end = tag_length(data, size, &altype); + + return ((end > 2) && (rndr->cb.raw_html_tag) && (!rndr->cb.autolink || altype == MKDA_NOT_AUTOLINK)); +} + /* char_langle_tag • '<' when tags or autolinks are allowed */ static size_t char_langle_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size) @@ -1453,13 +1460,27 @@ parse_htmlblock(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t static size_t parse_paragraph(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size) { - size_t i = 0, end = 0; + size_t i = 0, end = 0, hit_tag; int level = 0; struct buf work = { data, 0, 0, 0 }; while (i < size) { - for (end = i + 1; end < size && data[end - 1] != '\n'; end++) /* empty */; - + hit_tag = 0; + for (end = i + 1; end < size && data[end - 1] != '\n'; end++) { + if(data[end - 1] == '<' && (rndr->ext_flags & MKDEXT_HTML_INLINE)) { + if(is_html_tag(ob, rndr, data + (end - 1), size - (end - 1))) { + end = end - 1; + i = end; + hit_tag = 1; + break; + } + } + } + + if(hit_tag) { + break; + } + if (prefix_quote(data + i, end - i) != 0) { end = i; break; @@ -2231,7 +2252,10 @@ parse_block(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size else if (data[beg] == '<' && rndr->cb.blockhtml && (i = parse_htmlblock(ob, rndr, txt_data, end, 1)) != 0) beg += i; - + + else if (data[beg] == '<' && (rndr->ext_flags & MKDEXT_HTML_INLINE) && + (i = char_langle_tag(ob, rndr, txt_data, beg, end))) + beg += i; else if ((i = is_empty(txt_data, end)) != 0) beg += i; diff --git a/src/markdown.h b/src/markdown.h index 6f6553e..d5ea4bc 100644 --- a/src/markdown.h +++ b/src/markdown.h @@ -59,6 +59,7 @@ enum mkd_extensions { MKDEXT_SPACE_HEADERS = (1 << 6), MKDEXT_SUPERSCRIPT = (1 << 7), MKDEXT_LAX_SPACING = (1 << 8), + MKDEXT_HTML_INLINE = (1 << 9) }; /* sd_callbacks - functions for rendering parsed data */