diff options
Diffstat (limited to 'src/html')
-rw-r--r-- | src/html/html.c | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/src/html/html.c b/src/html/html.c index 6261b9c..9b3a995 100644 --- a/src/html/html.c +++ b/src/html/html.c @@ -98,9 +98,56 @@ static inline void cr(strbuf *html) } // Convert an inline list to HTML. Returns 0 on success, and sets result. +static void inlines_to_plain_html(strbuf *html, node_inl* ils) +{ + node_inl* children; + render_stack* rstack = NULL; + + while(ils != NULL) { + children = NULL; + switch(ils->tag) { + case INL_STRING: + case INL_CODE: + case INL_RAW_HTML: + escape_html(html, ils->content.literal.data, ils->content.literal.len); + break; + + case INL_LINEBREAK: + case INL_SOFTBREAK: + strbuf_putc(html, '\n'); + break; + + case INL_LINK: + case INL_IMAGE: + children = ils->content.inlines; + rstack = push_inline(rstack, ils->next, ""); + break; + + case INL_STRONG: + case INL_EMPH: + children = ils->content.inlines; + rstack = push_inline(rstack, ils->next, ""); + break; + } + if (children) { + ils = children; + } else { + ils = ils->next; + } + while (ils == NULL && rstack != NULL) { + strbuf_puts(html, rstack->literal); + ils = rstack->next_sibling.inl; + rstack = pop_render_stack(rstack); + } + } + + free_render_stack(rstack); +} + + +// Convert an inline list to HTML. Returns 0 on success, and sets result. static void inlines_to_html(strbuf *html, node_inl* ils) { - strbuf scrap = GH_BUF_INIT; node_inl* children; render_stack* rstack = NULL; @@ -151,11 +198,8 @@ static void inlines_to_html(strbuf *html, node_inl* ils) if (ils->content.linkable.url) escape_href(html, ils->content.linkable.url, -1); - inlines_to_html(&scrap, ils->content.inlines); strbuf_puts(html, "\" alt=\""); - if (scrap.size) - escape_html(html, scrap.ptr, scrap.size); - strbuf_clear(&scrap); + inlines_to_plain_html(html, ils->content.inlines); if (ils->content.linkable.title) { strbuf_puts(html, "\" title=\""); @@ -189,7 +233,6 @@ static void inlines_to_html(strbuf *html, node_inl* ils) } } - strbuf_free(&scrap); free_render_stack(rstack); } |