summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2015-12-19 15:26:18 -0800
committerJohn MacFarlane <jgm@berkeley.edu>2015-12-19 15:26:18 -0800
commit00ae2c61a47e09bb7643f0a7153c2009b7537e09 (patch)
treeb5d07e1ad0d9950012951b6c69013a63722ff192 /src
parent70545251f4d1685a600e8eeb7b78eea430613b94 (diff)
Added RAW_BLOCK and RAW_INLINE node types.
These are passed through verbatim by all writers, with no escaping. They are never generated by the parser, and do not correspond to CommonMark elements. They are designed to be inserted by filters that postprocess the AST. For example, a filter might convert specially marked code blocks to svg diagrams in HTML and tikz diagrams in LaTeX, passing these through to the renderer as a RAW_BLOCK.
Diffstat (limited to 'src')
-rw-r--r--src/cmark.h6
-rw-r--r--src/commonmark.c2
-rw-r--r--src/html.c10
-rw-r--r--src/latex.c10
-rw-r--r--src/man.c10
-rw-r--r--src/node.c4
-rw-r--r--src/xml.c2
7 files changed, 44 insertions, 0 deletions
diff --git a/src/cmark.h b/src/cmark.h
index 79bfbc5..612440f 100644
--- a/src/cmark.h
+++ b/src/cmark.h
@@ -40,6 +40,7 @@ typedef enum {
CMARK_NODE_ITEM,
CMARK_NODE_CODE_BLOCK,
CMARK_NODE_HTML,
+ CMARK_NODE_RAW_BLOCK,
CMARK_NODE_PARAGRAPH,
CMARK_NODE_HEADER,
CMARK_NODE_HRULE,
@@ -53,6 +54,7 @@ typedef enum {
CMARK_NODE_LINEBREAK,
CMARK_NODE_CODE,
CMARK_NODE_INLINE_HTML,
+ CMARK_NODE_RAW_INLINE,
CMARK_NODE_EMPH,
CMARK_NODE_STRONG,
CMARK_NODE_LINK,
@@ -158,6 +160,7 @@ CMARK_EXPORT cmark_node *cmark_node_last_child(cmark_node *node);
* of type:
*
* * CMARK_NODE_HTML
+ * * CMARK_NODE_RAW_BLOCK
* * CMARK_NODE_HRULE
* * CMARK_NODE_CODE_BLOCK
* * CMARK_NODE_TEXT
@@ -165,6 +168,7 @@ CMARK_EXPORT cmark_node *cmark_node_last_child(cmark_node *node);
* * CMARK_NODE_LINEBREAK
* * CMARK_NODE_CODE
* * CMARK_NODE_INLINE_HTML
+ * * CMARK_NODE_RAW_INLINE
*
* Nodes must only be modified after an `EXIT` event, or an `ENTER` event for
* leaf nodes.
@@ -514,6 +518,7 @@ const char *cmark_version_string();
#define NODE_ITEM CMARK_NODE_ITEM
#define NODE_CODE_BLOCK CMARK_NODE_CODE_BLOCK
#define NODE_HTML CMARK_NODE_HTML
+#define NODE_RAW_BLOCK CMARK_NODE_RAW_BLOCK
#define NODE_PARAGRAPH CMARK_NODE_PARAGRAPH
#define NODE_HEADER CMARK_NODE_HEADER
#define NODE_HRULE CMARK_NODE_HRULE
@@ -522,6 +527,7 @@ const char *cmark_version_string();
#define NODE_LINEBREAK CMARK_NODE_LINEBREAK
#define NODE_CODE CMARK_NODE_CODE
#define NODE_INLINE_HTML CMARK_NODE_INLINE_HTML
+#define NODE_RAW_INLINE CMARK_NODE_RAW_INLINE
#define NODE_EMPH CMARK_NODE_EMPH
#define NODE_STRONG CMARK_NODE_STRONG
#define NODE_LINK CMARK_NODE_LINK
diff --git a/src/commonmark.c b/src/commonmark.c
index cbf99c1..32b09a1 100644
--- a/src/commonmark.c
+++ b/src/commonmark.c
@@ -280,6 +280,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
break;
case CMARK_NODE_HTML:
+ case CMARK_NODE_RAW_BLOCK:
BLANKLINE();
OUT(cmark_node_get_literal(node), false, LITERAL);
BLANKLINE();
@@ -336,6 +337,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
break;
case CMARK_NODE_INLINE_HTML:
+ case CMARK_NODE_RAW_INLINE:
OUT(cmark_node_get_literal(node), false, LITERAL);
break;
diff --git a/src/html.c b/src/html.c
index dfe2aec..4fa4437 100644
--- a/src/html.c
+++ b/src/html.c
@@ -176,6 +176,12 @@ static int S_render_node(cmark_node *node, cmark_event_type ev_type,
cr(html);
break;
+ case CMARK_NODE_RAW_BLOCK:
+ cr(html);
+ cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
+ cr(html);
+ break;
+
case CMARK_NODE_HRULE:
cr(html);
cmark_strbuf_puts(html, "<hr");
@@ -233,6 +239,10 @@ static int S_render_node(cmark_node *node, cmark_event_type ev_type,
}
break;
+ case CMARK_NODE_RAW_INLINE:
+ cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
+ break;
+
case CMARK_NODE_STRONG:
if (entering) {
cmark_strbuf_puts(html, "<strong>");
diff --git a/src/latex.c b/src/latex.c
index 146062e..e7cb9f7 100644
--- a/src/latex.c
+++ b/src/latex.c
@@ -303,6 +303,12 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
case CMARK_NODE_HTML:
break;
+ case CMARK_NODE_RAW_BLOCK:
+ CR();
+ OUT(cmark_node_get_literal(node), false, LITERAL);
+ CR();
+ break;
+
case CMARK_NODE_HRULE:
BLANKLINE();
LIT("\\begin{center}\\rule{0.5\\linewidth}{\\linethickness}\\end{center}");
@@ -341,6 +347,10 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
case CMARK_NODE_INLINE_HTML:
break;
+ case CMARK_NODE_RAW_INLINE:
+ OUT(cmark_node_get_literal(node), false, LITERAL);
+ break;
+
case CMARK_NODE_STRONG:
if (entering) {
LIT("\\textbf{");
diff --git a/src/man.c b/src/man.c
index 8e3913e..a1ea6e4 100644
--- a/src/man.c
+++ b/src/man.c
@@ -142,6 +142,12 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
case CMARK_NODE_HTML:
break;
+ case CMARK_NODE_RAW_BLOCK:
+ CR();
+ OUT(cmark_node_get_literal(node), false, LITERAL);
+ CR();
+ break;
+
case CMARK_NODE_HRULE:
CR();
LIT(".PP\n * * * * *");
@@ -190,6 +196,10 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
case CMARK_NODE_INLINE_HTML:
break;
+ case CMARK_NODE_RAW_INLINE:
+ OUT(cmark_node_get_literal(node), false, LITERAL);
+ break;
+
case CMARK_NODE_STRONG:
if (entering) {
LIT("\\f[B]");
diff --git a/src/node.c b/src/node.c
index 3bb79d7..4c5f474 100644
--- a/src/node.c
+++ b/src/node.c
@@ -161,6 +161,8 @@ const char *cmark_node_get_type_string(cmark_node *node) {
return "code_block";
case CMARK_NODE_HTML:
return "html";
+ case CMARK_NODE_RAW_BLOCK:
+ return "raw_block";
case CMARK_NODE_PARAGRAPH:
return "paragraph";
case CMARK_NODE_HEADER:
@@ -177,6 +179,8 @@ const char *cmark_node_get_type_string(cmark_node *node) {
return "code";
case CMARK_NODE_INLINE_HTML:
return "inline_html";
+ case CMARK_NODE_RAW_INLINE:
+ return "raw_inline";
case CMARK_NODE_EMPH:
return "emph";
case CMARK_NODE_STRONG:
diff --git a/src/xml.c b/src/xml.c
index 4885d0a..2b7e645 100644
--- a/src/xml.c
+++ b/src/xml.c
@@ -53,7 +53,9 @@ static int S_render_node(cmark_node *node, cmark_event_type ev_type,
case CMARK_NODE_TEXT:
case CMARK_NODE_CODE:
case CMARK_NODE_HTML:
+ case CMARK_NODE_RAW_BLOCK:
case CMARK_NODE_INLINE_HTML:
+ case CMARK_NODE_RAW_INLINE:
cmark_strbuf_puts(xml, ">");
escape_xml(xml, node->as.literal.data, node->as.literal.len);
cmark_strbuf_puts(xml, "</");