ext/commonmarker/cmark/src/render.c in commonmarker-0.3.0 vs ext/commonmarker/cmark/src/render.c in commonmarker-0.4.0

- old
+ new

@@ -3,184 +3,161 @@ #include "chunk.h" #include "cmark.h" #include "utf8.h" #include "render.h" -static inline -void S_cr(cmark_renderer *renderer) -{ - if (renderer->need_cr < 1) { - renderer->need_cr = 1; - } +static inline void S_cr(cmark_renderer *renderer) { + if (renderer->need_cr < 1) { + renderer->need_cr = 1; + } } -static inline -void S_blankline(cmark_renderer *renderer) -{ - if (renderer->need_cr < 2) { - renderer->need_cr = 2; - } +static inline void S_blankline(cmark_renderer *renderer) { + if (renderer->need_cr < 2) { + renderer->need_cr = 2; + } } -static -void S_out(cmark_renderer *renderer, - const char *source, - bool wrap, - cmark_escaping escape) -{ - int length = cmark_strbuf_safe_strlen(source); - unsigned char nextc; - int32_t c; - int i = 0; - int len; - cmark_chunk remainder = cmark_chunk_literal(""); - int k = renderer->buffer->size - 1; +static void S_out(cmark_renderer *renderer, const char *source, bool wrap, + cmark_escaping escape) { + int length = cmark_strbuf_safe_strlen(source); + unsigned char nextc; + int32_t c; + int i = 0; + int len; + cmark_chunk remainder = cmark_chunk_literal(""); + int k = renderer->buffer->size - 1; - wrap = wrap && !renderer->no_wrap; + wrap = wrap && !renderer->no_wrap; - if (renderer->in_tight_list_item && renderer->need_cr > 1) { - renderer->need_cr = 1; - } - while (renderer->need_cr) { - if (k < 0 || renderer->buffer->ptr[k] == '\n') { - k -= 1; - } else { - cmark_strbuf_putc(renderer->buffer, '\n'); - if (renderer->need_cr > 1) { - cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr, - renderer->prefix->size); - } - } - renderer->column = 0; - renderer->begin_line = true; - renderer->need_cr -= 1; - } + if (renderer->in_tight_list_item && renderer->need_cr > 1) { + renderer->need_cr = 1; + } + while (renderer->need_cr) { + if (k < 0 || renderer->buffer->ptr[k] == '\n') { + k -= 1; + } else { + cmark_strbuf_putc(renderer->buffer, '\n'); + if (renderer->need_cr > 1) { + cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr, + renderer->prefix->size); + } + } + renderer->column = 0; + renderer->begin_line = true; + renderer->need_cr -= 1; + } - while (i < length) { - if (renderer->begin_line) { - cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr, - renderer->prefix->size); - // note: this assumes prefix is ascii: - renderer->column = renderer->prefix->size; - } + while (i < length) { + if (renderer->begin_line) { + cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr, + renderer->prefix->size); + // note: this assumes prefix is ascii: + renderer->column = renderer->prefix->size; + } - len = utf8proc_iterate((const uint8_t *)source + i, length - i, &c); - if (len == -1) { // error condition - return; // return without rendering rest of string - } - nextc = source[i + len]; - if (c == 32 && wrap) { - if (!renderer->begin_line) { - cmark_strbuf_putc(renderer->buffer, ' '); - renderer->column += 1; - renderer->begin_line = false; - renderer->last_breakable = renderer->buffer->size - - 1; - // skip following spaces - while (source[i + 1] == ' ') { - i++; - } - } + len = cmark_utf8proc_iterate((const uint8_t *)source + i, length - i, &c); + if (len == -1) { // error condition + return; // return without rendering rest of string + } + nextc = source[i + len]; + if (c == 32 && wrap) { + if (!renderer->begin_line) { + cmark_strbuf_putc(renderer->buffer, ' '); + renderer->column += 1; + renderer->begin_line = false; + renderer->last_breakable = renderer->buffer->size - 1; + // skip following spaces + while (source[i + 1] == ' ') { + i++; + } + } - } else if (c == 10) { - cmark_strbuf_putc(renderer->buffer, '\n'); - renderer->column = 0; - renderer->begin_line = true; - renderer->last_breakable = 0; - } else if (escape == LITERAL) { - cmark_render_code_point(renderer, c); - renderer->begin_line = false; - } else { - (renderer->outc)(renderer, escape, c, nextc); - renderer->begin_line = false; - } + } else if (c == 10) { + cmark_strbuf_putc(renderer->buffer, '\n'); + renderer->column = 0; + renderer->begin_line = true; + renderer->last_breakable = 0; + } else if (escape == LITERAL) { + cmark_render_code_point(renderer, c); + renderer->begin_line = false; + } else { + (renderer->outc)(renderer, escape, c, nextc); + renderer->begin_line = false; + } - // If adding the character went beyond width, look for an - // earlier place where the line could be broken: - if (renderer->width > 0 && - renderer->column > renderer->width && - !renderer->begin_line && - renderer->last_breakable > 0) { + // If adding the character went beyond width, look for an + // earlier place where the line could be broken: + if (renderer->width > 0 && renderer->column > renderer->width && + !renderer->begin_line && renderer->last_breakable > 0) { - // copy from last_breakable to remainder - cmark_chunk_set_cstr(&remainder, (char *) renderer->buffer->ptr + renderer->last_breakable + 1); - // truncate at last_breakable - cmark_strbuf_truncate(renderer->buffer, renderer->last_breakable); - // add newline, prefix, and remainder - cmark_strbuf_putc(renderer->buffer, '\n'); - cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr, - renderer->prefix->size); - cmark_strbuf_put(renderer->buffer, remainder.data, remainder.len); - renderer->column = renderer->prefix->size + remainder.len; - cmark_chunk_free(&remainder); - renderer->last_breakable = 0; - renderer->begin_line = false; - } + // copy from last_breakable to remainder + cmark_chunk_set_cstr(&remainder, (char *)renderer->buffer->ptr + + renderer->last_breakable + 1); + // truncate at last_breakable + cmark_strbuf_truncate(renderer->buffer, renderer->last_breakable); + // add newline, prefix, and remainder + cmark_strbuf_putc(renderer->buffer, '\n'); + cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr, + renderer->prefix->size); + cmark_strbuf_put(renderer->buffer, remainder.data, remainder.len); + renderer->column = renderer->prefix->size + remainder.len; + cmark_chunk_free(&remainder); + renderer->last_breakable = 0; + renderer->begin_line = false; + } - i += len; - } + i += len; + } } // Assumes no newlines, assumes ascii content: -void -cmark_render_ascii(cmark_renderer* renderer, const char* s) -{ - int origsize = renderer->buffer->size; - cmark_strbuf_puts(renderer->buffer, s); - renderer->column += renderer->buffer->size - origsize; +void cmark_render_ascii(cmark_renderer *renderer, const char *s) { + int origsize = renderer->buffer->size; + cmark_strbuf_puts(renderer->buffer, s); + renderer->column += renderer->buffer->size - origsize; } -void -cmark_render_code_point(cmark_renderer *renderer, uint32_t c) -{ - utf8proc_encode_char(c, renderer->buffer); - renderer->column += 1; +void cmark_render_code_point(cmark_renderer *renderer, uint32_t c) { + cmark_utf8proc_encode_char(c, renderer->buffer); + renderer->column += 1; } -char* -cmark_render(cmark_node *root, - int options, - int width, - void (*outc)(cmark_renderer*, - cmark_escaping, - int32_t, - unsigned char), - int (*render_node)(cmark_renderer *renderer, - cmark_node *node, - cmark_event_type ev_type, - int options)) -{ - cmark_strbuf pref = GH_BUF_INIT; - cmark_strbuf buf = GH_BUF_INIT; - cmark_node *cur; - cmark_event_type ev_type; - char *result; - cmark_iter *iter = cmark_iter_new(root); +char *cmark_render(cmark_node *root, int options, int width, + void (*outc)(cmark_renderer *, cmark_escaping, int32_t, + unsigned char), + int (*render_node)(cmark_renderer *renderer, + cmark_node *node, + cmark_event_type ev_type, int options)) { + cmark_strbuf pref = GH_BUF_INIT; + cmark_strbuf buf = GH_BUF_INIT; + cmark_node *cur; + cmark_event_type ev_type; + char *result; + cmark_iter *iter = cmark_iter_new(root); - cmark_renderer renderer = { &buf, &pref, 0, width, - 0, 0, true, false, false, - outc, S_cr, S_blankline, S_out - }; + cmark_renderer renderer = {&buf, &pref, 0, width, 0, 0, true, + false, false, outc, S_cr, S_blankline, S_out}; - while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { - cur = cmark_iter_get_node(iter); - if (!render_node(&renderer, cur, ev_type, options)) { - // a false value causes us to skip processing - // the node's contents. this is used for - // autolinks. - cmark_iter_reset(iter, cur, CMARK_EVENT_EXIT); - } - } + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + if (!render_node(&renderer, cur, ev_type, options)) { + // a false value causes us to skip processing + // the node's contents. this is used for + // autolinks. + cmark_iter_reset(iter, cur, CMARK_EVENT_EXIT); + } + } - // ensure final newline - if (renderer.buffer->ptr[renderer.buffer->size - 1] != '\n') { - cmark_strbuf_putc(renderer.buffer, '\n'); - } + // ensure final newline + if (renderer.buffer->ptr[renderer.buffer->size - 1] != '\n') { + cmark_strbuf_putc(renderer.buffer, '\n'); + } - result = (char *)cmark_strbuf_detach(renderer.buffer); + result = (char *)cmark_strbuf_detach(renderer.buffer); - cmark_iter_free(iter); - cmark_strbuf_free(renderer.prefix); - cmark_strbuf_free(renderer.buffer); + cmark_iter_free(iter); + cmark_strbuf_free(renderer.prefix); + cmark_strbuf_free(renderer.buffer); - return result; + return result; }