diff options
author | John MacFarlane <jgm@berkeley.edu> | 2015-03-26 14:13:32 -0400 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2015-03-26 14:52:53 -0700 |
commit | fcc29754916a53078260dd95055f4e1dda6a3395 (patch) | |
tree | ff6544ed60209aeafe024b6ee4ead16f74072fe1 /src/commonmark.c | |
parent | 77ea10290e75313c5faf61a70cdcb1dbc5e51813 (diff) |
commonmark renderer: handle tight/loose list distinction.
Diffstat (limited to 'src/commonmark.c')
-rw-r--r-- | src/commonmark.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/commonmark.c b/src/commonmark.c index c3d556c..af15371 100644 --- a/src/commonmark.c +++ b/src/commonmark.c @@ -22,6 +22,7 @@ struct render_state { int last_breakable; bool begin_line; bool no_wrap; + bool in_tight_list_item; }; static inline void cr(struct render_state *state) @@ -67,6 +68,9 @@ static inline void out(struct render_state *state, wrap = wrap && !state->no_wrap; + if (state->in_tight_list_item && state->need_cr > 1) { + state->need_cr = 1; + } while (state->need_cr) { if (k < 0 || state->buffer->ptr[k] == '\n') { k -= 1; @@ -189,6 +193,10 @@ S_render_node(cmark_node *node, cmark_event_type ev_type, char listmarker[64]; int marker_width; + state->in_tight_list_item = + node->type == CMARK_NODE_ITEM && + cmark_node_get_list_tight(node->parent); + switch (node->type) { case CMARK_NODE_DOCUMENT: if (!entering) { @@ -201,7 +209,8 @@ S_render_node(cmark_node *node, cmark_event_type ev_type, lit(state, "> ", false); cmark_strbuf_puts(state->prefix, "> "); } else { - cmark_strbuf_truncate(state->prefix, state->prefix->size - 2); + cmark_strbuf_truncate(state->prefix, + state->prefix->size - 2); blankline(state); } break; @@ -210,7 +219,6 @@ S_render_node(cmark_node *node, cmark_event_type ev_type, break; case CMARK_NODE_ITEM: - // TODO implement tight lists if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) { marker_width = 2; @@ -413,7 +421,8 @@ char *cmark_render_commonmark(cmark_node *root, int options, int width) width = 0; } struct render_state state = - { options, &commonmark, &prefix, 0, width, 0, 0, true, false }; + { options, &commonmark, &prefix, 0, width, + 0, 0, true, false, false}; cmark_node *cur; cmark_event_type ev_type; cmark_iter *iter = cmark_iter_new(root); |