From 1cf1ec9a8f893a41910a300d9d8f1e6c20288287 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Wed, 19 Nov 2014 20:24:08 +0100 Subject: Stackless HTML rendering Now that every node has a parent pointer, it's possible to implement the HTML rendering functions without render stacks and any dynamic memory allocations. This commit also adds some minor optimizations that eliminate some strbuf_put* calls for the common case and avoid printf for headers. --- api_test/main.c | 32 +++- src/html/html.c | 463 +++++++++++++++++++++++++++----------------------------- 2 files changed, 257 insertions(+), 238 deletions(-) diff --git a/api_test/main.c b/api_test/main.c index f484a53..35570e9 100644 --- a/api_test/main.c +++ b/api_test/main.c @@ -197,7 +197,7 @@ accessors(test_batch_runner *runner) "

Item 2

\n" "\n" "\n" - "\n" : "\n"); + // Restore old 'tight' value. + tmp = tight; + tight = list->tight; + list->tight = tmp; + break; + } - if (strbuf_len(info) > 0) { - int first_tag = strbuf_strchr(info, ' ', 0); - if (first_tag < 0) - first_tag = strbuf_len(info); + case NODE_ATX_HEADER: + case NODE_SETEXT_HEADER: + end_header[3] = '0' + node->as.header.level; + strbuf_puts(html, end_header); + break; - strbuf_puts(html, " class=\"language-"); - escape_html(html, info->ptr, first_tag); - strbuf_putc(html, '"'); - } - } + case NODE_INDENTED_CODE: + case NODE_FENCED_CODE: + strbuf_puts(html, "\n"); + break; - strbuf_putc(html, '>'); - escape_html(html, b->string_content.ptr, b->string_content.size); - strbuf_puts(html, "\n"); - break; + case NODE_INLINE_CODE: + strbuf_puts(html, ""); + break; - case NODE_HTML: - strbuf_put(html, b->string_content.ptr, b->string_content.size); - break; + case NODE_LINK: + strbuf_puts(html, ""); + break; - case NODE_HRULE: - strbuf_puts(html, "
\n"); - break; + case NODE_STRONG: + strbuf_puts(html, ""); + break; - case NODE_REFERENCE_DEF: - break; + case NODE_EMPH: + strbuf_puts(html, ""); + break; - default: - assert(false); - } - if (visit_children) { - b = b->first_child; - } else { - b = b->next; - } - while (b == NULL && rstack != NULL) { - strbuf_puts(html, rstack->literal); - if (rstack->trim) { - strbuf_rtrim(html); - } - tight = rstack->tight; - b = rstack->next_sibling; - rstack = pop_render_stack(rstack); - } + default: + break; } - free_render_stack(rstack); + return tight; } unsigned char *cmark_render_html(cmark_node *root) { unsigned char *result; strbuf html = GH_BUF_INIT; - blocks_to_html(&html, root); + node_to_html(&html, root); result = strbuf_detach(&html); strbuf_free(&html); return result; -- cgit v1.2.3