summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/blocks.c19
-rw-r--r--src/html.c14
-rw-r--r--src/node.c6
-rw-r--r--src/node.h2
-rw-r--r--src/print.c9
5 files changed, 27 insertions, 23 deletions
diff --git a/src/blocks.c b/src/blocks.c
index 18a6536..d770c3d 100644
--- a/src/blocks.c
+++ b/src/blocks.c
@@ -220,16 +220,17 @@ finalize(cmark_parser *parser, cmark_node* b, int line_number)
// first line of contents becomes info
firstlinelen = strbuf_strchr(&b->string_content, '\n', 0);
+ strbuf tmp = GH_BUF_INIT;
houdini_unescape_html_f(
- &b->as.code.info,
- b->string_content.ptr,
- firstlinelen
- );
+ &tmp,
+ b->string_content.ptr,
+ firstlinelen
+ );
+ strbuf_trim(&tmp);
+ strbuf_unescape(&tmp);
+ b->as.code.info = chunk_buf_detach(&tmp);
strbuf_drop(&b->string_content, firstlinelen + 1);
-
- strbuf_trim(&b->as.code.info);
- strbuf_unescape(&b->as.code.info);
}
b->as.literal = chunk_buf_detach(&b->string_content);
break;
@@ -671,7 +672,7 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
container->as.code.fence_char = 0;
container->as.code.fence_length = 0;
container->as.code.fence_offset = 0;
- strbuf_init(&container->as.code.info, 0);
+ container->as.code.info = chunk_literal("");
} else { // indent > 4 in lazy line
break;
}
@@ -706,7 +707,7 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
container->as.code.fence_char = peek_at(&input, first_nonspace);
container->as.code.fence_length = matched;
container->as.code.fence_offset = first_nonspace - offset;
- strbuf_init(&container->as.code.info, 0);
+ container->as.code.info = chunk_literal("");
offset = first_nonspace + matched;
} else if ((matched = scan_html_block_tag(&input, first_nonspace))) {
diff --git a/src/html.c b/src/html.c
index 23812df..34552bf 100644
--- a/src/html.c
+++ b/src/html.c
@@ -47,7 +47,6 @@ S_render_node(cmark_node *node, cmark_event_type ev_type, void *vstate)
strbuf *html = state->html;
char start_header[] = "<h0>";
char end_header[] = "</h0>";
- strbuf *info;
bool tight;
bool entering = (ev_type == CMARK_EVENT_ENTER);
@@ -136,20 +135,21 @@ S_render_node(cmark_node *node, cmark_event_type ev_type, void *vstate)
break;
case CMARK_NODE_CODE_BLOCK:
- info = &node->as.code.info;
cr(html);
if (&node->as.code.fence_length == 0
- || strbuf_len(info) == 0) {
+ || node->as.code.info.len == 0) {
strbuf_puts(html, "<pre><code>");
}
else {
- int first_tag = strbuf_strchr(info, ' ', 0);
- if (first_tag < 0)
- first_tag = strbuf_len(info);
+ int first_tag = 0;
+ while (first_tag < node->as.code.info.len &&
+ node->as.code.info.data[first_tag] != ' ') {
+ first_tag += 1;
+ }
strbuf_puts(html, "<pre><code class=\"language-");
- escape_html(html, info->ptr, first_tag);
+ escape_html(html, node->as.code.info.data, first_tag);
strbuf_puts(html, "\">");
}
diff --git a/src/node.c b/src/node.c
index d74b1fc..b83ea78 100644
--- a/src/node.c
+++ b/src/node.c
@@ -41,7 +41,7 @@ void S_free_nodes(cmark_node *e)
strbuf_free(&e->string_content);
switch (e->type){
case NODE_CODE_BLOCK:
- strbuf_free(&e->as.code.info);
+ chunk_free(&e->as.code.info);
chunk_free(&e->as.literal);
break;
case NODE_TEXT:
@@ -352,7 +352,7 @@ cmark_node_get_fence_info(cmark_node *node) {
}
if (node->type == NODE_CODE_BLOCK) {
- return strbuf_cstr(&node->as.code.info);
+ return chunk_to_cstr(&node->as.code.info);
}
else {
return NULL;
@@ -366,7 +366,7 @@ cmark_node_set_fence_info(cmark_node *node, const char *info) {
}
if (node->type == NODE_CODE_BLOCK) {
- strbuf_sets(&node->as.code.info, info);
+ chunk_set_cstr(&node->as.code.info, info);
return 1;
}
else {
diff --git a/src/node.h b/src/node.h
index e015c12..e5508b4 100644
--- a/src/node.h
+++ b/src/node.h
@@ -26,7 +26,7 @@ typedef struct {
int fence_length;
int fence_offset;
unsigned char fence_char;
- strbuf info;
+ chunk info;
} cmark_code;
typedef struct {
diff --git a/src/print.c b/src/print.c
index 951d238..22daeac 100644
--- a/src/print.c
+++ b/src/print.c
@@ -78,14 +78,17 @@ static void render_nodes(strbuf* buffer, cmark_node* node, int indent)
break;
case NODE_CODE_BLOCK:
strbuf_printf(buffer, "code_block info=");
- print_str(buffer, node->as.code.info.ptr, -1);
+ print_str(buffer, node->as.code.info.data,
+ node->as.code.info.len);
strbuf_putc(buffer, ' ');
- print_str(buffer, node->string_content.ptr, -1);
+ print_str(buffer, node->as.literal.data,
+ node->as.literal.len);
strbuf_putc(buffer, '\n');
break;
case NODE_HTML:
strbuf_printf(buffer, "html ");
- print_str(buffer, node->string_content.ptr, -1);
+ print_str(buffer, node->as.literal.data,
+ node->as.literal.len);
strbuf_putc(buffer, '\n');
break;
case NODE_TEXT: