cmark

My personal build of CMark ✏️

Commit
37554bbb7901b7116e1a5006f331968444141b76
Parent
1014764a109e7f8f47d466080962f5f344287277
Author
John MacFarlane <jgm@berkeley.edu>
Date

Use as.literal instead of string_content for HTML and code blocks.

This is for consistency with the other types of nodes that have literal strings as contents.

Diffstat

4 files changed, 10 insertions, 33 deletions

Status File Name N° Changes Insertions Deletions
Modified man/man3/cmark.3 23 0 23
Modified src/blocks.c 8 6 2
Modified src/html.c 5 2 3
Modified src/node.c 7 2 5
diff --git a/man/man3/cmark.3 b/man/man3/cmark.3
@@ -102,18 +102,6 @@ way, for example, turning all level\-3 headers into regular paragraphs.
 .IP
 .nf
 \f[C]
-void
-usage_example(cmark_node *root) {
-    cmark_event_type ev_type;
-    cmark_iter *iter = cmark_iter_new(root);
-
-    while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
-        cmark_node *cur = cmark_iter_get_node(iter);
-        // Do something with `cur` and `ev_type`
-    }
-
-    cmark_iter_free(iter);
-}
 \f[]
 .fi
 
@@ -314,7 +302,6 @@ Simple interface:
 .IP
 .nf
 \f[C]
-cmark_node *document = cmark_parse_document("Hello *world*", 12);
 \f[]
 .fi
 .PP
@@ -322,16 +309,6 @@ Streaming interface:
 .IP
 .nf
 \f[C]
-cmark_parser *parser = cmark_parser_new();
-FILE *fp = fopen("myfile.md", "r");
-while ((bytes = fread(buffer, 1, sizeof(buffer), fp)) > 0) {
-       cmark_parser_feed(parser, buffer, bytes);
-       if (bytes < sizeof(buffer)) {
-           break;
-       }
-}
-document = cmark_parser_finish(parser);
-cmark_parser_free(parser);
 \f[]
 .fi
 
diff --git a/src/blocks.c b/src/blocks.c
@@ -215,7 +215,6 @@ finalize(cmark_parser *parser, cmark_node* b, int line_number)
 			if (!b->as.code.fenced) { // indented code
 				remove_trailing_blank_lines(&b->string_content);
 				strbuf_putc(&b->string_content, '\n');
-				break;
 			} else {
 
 				// first line of contents becomes info
@@ -231,8 +230,13 @@ finalize(cmark_parser *parser, cmark_node* b, int line_number)
 
 				strbuf_trim(&b->as.code.info);
 				strbuf_unescape(&b->as.code.info);
-				break;
 			}
+			b->as.literal = chunk_buf_detach(&b->string_content);
+			break;
+
+	        case NODE_HTML:
+			b->as.literal = chunk_buf_detach(&b->string_content);
+			break;
 
 		case NODE_LIST: // determine tight/loose status
 			b->as.list.tight = true; // tight by default
diff --git a/src/html.c b/src/html.c
@@ -153,14 +153,13 @@ S_render_node(cmark_node *node, cmark_event_type ev_type, void *vstate)
 			strbuf_puts(html, "\">");
 		}
 
-		escape_html(html, node->string_content.ptr, node->string_content.size);
+		escape_html(html, node->as.literal.data, node->as.literal.len);
 		strbuf_puts(html, "</code></pre>\n");
 		break;
 
 	case CMARK_NODE_HTML:
 		cr(html);
-		strbuf_put(html, node->string_content.ptr,
-			   node->string_content.size);
+		strbuf_put(html, node->as.literal.data, node->as.literal.len);
 		break;
 
 	case CMARK_NODE_HRULE:
diff --git a/src/node.c b/src/node.c
@@ -42,10 +42,12 @@ void S_free_nodes(cmark_node *e)
 		switch (e->type){
 		case NODE_CODE_BLOCK:
 			strbuf_free(&e->as.code.info);
+			chunk_free(&e->as.literal);
 			break;
 		case NODE_TEXT:
 		case NODE_INLINE_HTML:
 		case NODE_CODE:
+		case NODE_HTML:
 			chunk_free(&e->as.literal);
 			break;
 		case NODE_LINK:
@@ -183,8 +185,6 @@ cmark_node_get_string_content(cmark_node *node) {
 	switch (node->type) {
 	case NODE_CODE_BLOCK:
 	case NODE_HTML:
-		return strbuf_cstr(&node->string_content);
-
 	case NODE_TEXT:
 	case NODE_INLINE_HTML:
 	case NODE_CODE:
@@ -206,9 +206,6 @@ cmark_node_set_string_content(cmark_node *node, const char *content) {
 	switch (node->type) {
 	case NODE_CODE_BLOCK:
 	case NODE_HTML:
-		strbuf_sets(&node->string_content, content);
-		return 1;
-
 	case NODE_TEXT:
 	case NODE_INLINE_HTML:
 	case NODE_CODE: