diff options
| -rw-r--r-- | src/ast.h | 80 | ||||
| -rw-r--r-- | src/cmark.c | 16 | ||||
| -rw-r--r-- | src/inlines.c | 77 | 
3 files changed, 77 insertions, 96 deletions
| @@ -39,86 +39,6 @@ struct cmark_doc_parser {  	cmark_strbuf *curline;  }; -unsigned char *cmark_clean_autolink(chunk *url, int is_email); - -static inline cmark_node *cmark_make_link(cmark_node *label, unsigned char *url, unsigned char *title) -{ -	cmark_node* e = (cmark_node *)calloc(1, sizeof(*e)); -	if(e != NULL) { -		e->type = CMARK_NODE_LINK; -		e->as.link.label = label; -		e->as.link.url   = url; -		e->as.link.title = title; -		e->next = NULL; -	} -	return e; -} - -static inline cmark_node* cmark_make_autolink(cmark_node* label, cmark_chunk url, int is_email) -{ -	return cmark_make_link(label, cmark_clean_autolink(&url, is_email), NULL); -} - -static inline cmark_node* cmark_make_inlines(cmark_node_type t, cmark_node* contents) -{ -	cmark_node * e = (cmark_node *)calloc(1, sizeof(*e)); -	if(e != NULL) { -		e->type = t; -		e->first_child = contents; -		e->next = NULL; -	} -	return e; -} - -// Create an inline with a literal string value. -static inline cmark_node* cmark_make_literal(cmark_node_type t, cmark_chunk s) -{ -	cmark_node * e = (cmark_node *)calloc(1, sizeof(*e)); -	if(e != NULL) { -		e->type = t; -		e->as.literal = s; -		e->next = NULL; -	} -	return e; -} - -// Create an inline with no value. -static inline cmark_node* cmark_make_simple(cmark_node_type t) -{ -	cmark_node* e = (cmark_node *)calloc(1, sizeof(*e)); -	if(e != NULL) { -		e->type = t; -		e->next = NULL; -	} -	return e; -} - -// Macros for creating various kinds of simple. -#define cmark_make_str(s) cmark_make_literal(CMARK_NODE_STRING, s) -#define cmark_make_code(s) cmark_make_literal(CMARK_NODE_INLINE_CODE, s) -#define cmark_make_raw_html(s) cmark_make_literal(CMARK_NODE_INLINE_HTML, s) -#define cmark_make_linebreak() cmark_make_simple(CMARK_NODE_LINEBREAK) -#define cmark_make_softbreak() cmark_make_simple(CMARK_NODE_SOFTBREAK) -#define cmark_make_emph(contents) cmark_make_inlines(CMARK_NODE_EMPH, contents) -#define cmark_make_strong(contents) cmark_make_inlines(CMARK_NODE_STRONG, contents) - - - -#ifndef CMARK_NO_SHORT_NAMES -  #define make_link                 cmark_make_link -  #define make_autolink             cmark_make_autolink -  #define make_str                  cmark_make_str -  #define make_code                 cmark_make_code -  #define make_raw_html             cmark_make_raw_html -  #define make_linebreak            cmark_make_linebreak -  #define make_softbreak            cmark_make_softbreak -  #define make_emph                 cmark_make_emph -  #define make_strong               cmark_make_strong -  #define make_simple               cmark_make_simple -  #define make_literal              cmark_make_literal -  #define make_inlines              cmark_make_inlines -#endif -  #ifdef __cplusplus  }  #endif diff --git a/src/cmark.c b/src/cmark.c index fa9b5c8..f779e80 100644 --- a/src/cmark.c +++ b/src/cmark.c @@ -37,22 +37,6 @@ static void splice_into_list(cmark_node* e, cmark_node* children) {  	return ;  } -unsigned char *cmark_clean_autolink(chunk *url, int is_email) -{ -	strbuf buf = GH_BUF_INIT; - -	chunk_trim(url); - -	if (url->len == 0) -		return NULL; - -	if (is_email) -		strbuf_puts(&buf, "mailto:"); - -	houdini_unescape_html_f(&buf, url->data, url->len); -	return strbuf_detach(&buf); -} -  // Free a cmark_node list and any children.  void cmark_free_nodes(cmark_node *e)  { diff --git a/src/inlines.c b/src/inlines.c index 313dfe5..2bfdfd5 100644 --- a/src/inlines.c +++ b/src/inlines.c @@ -14,6 +14,15 @@  #include "inlines.h" +// Macros for creating various kinds of simple. +#define make_str(s) make_literal(CMARK_NODE_STRING, s) +#define make_code(s) make_literal(CMARK_NODE_INLINE_CODE, s) +#define make_raw_html(s) make_literal(CMARK_NODE_INLINE_HTML, s) +#define make_linebreak() make_simple(CMARK_NODE_LINEBREAK) +#define make_softbreak() make_simple(CMARK_NODE_SOFTBREAK) +#define make_emph(contents) make_inlines(CMARK_NODE_EMPH, contents) +#define make_strong(contents) make_inlines(CMARK_NODE_STRONG, contents) +  typedef struct DelimiterStack {  	struct DelimiterStack *previous;  	struct DelimiterStack *next; @@ -38,6 +47,74 @@ static int parse_inline(subject* subj, cmark_node ** last);  static void subject_from_buf(subject *e, strbuf *buffer, reference_map *refmap);  static int subject_find_special_char(subject *subj); +static unsigned char *cmark_clean_autolink(chunk *url, int is_email) +{ +	strbuf buf = GH_BUF_INIT; + +	chunk_trim(url); + +	if (url->len == 0) +		return NULL; + +	if (is_email) +		strbuf_puts(&buf, "mailto:"); + +	houdini_unescape_html_f(&buf, url->data, url->len); +	return strbuf_detach(&buf); +} + +static inline cmark_node *make_link(cmark_node *label, unsigned char *url, unsigned char *title) +{ +	cmark_node* e = (cmark_node *)calloc(1, sizeof(*e)); +	if(e != NULL) { +		e->type = CMARK_NODE_LINK; +		e->as.link.label = label; +		e->as.link.url   = url; +		e->as.link.title = title; +		e->next = NULL; +	} +	return e; +} + +static inline cmark_node* make_autolink(cmark_node* label, cmark_chunk url, int is_email) +{ +	return make_link(label, cmark_clean_autolink(&url, is_email), NULL); +} + +static inline cmark_node* make_inlines(cmark_node_type t, cmark_node* contents) +{ +	cmark_node * e = (cmark_node *)calloc(1, sizeof(*e)); +	if(e != NULL) { +		e->type = t; +		e->first_child = contents; +		e->next = NULL; +	} +	return e; +} + +// Create an inline with a literal string value. +static inline cmark_node* make_literal(cmark_node_type t, cmark_chunk s) +{ +	cmark_node * e = (cmark_node *)calloc(1, sizeof(*e)); +	if(e != NULL) { +		e->type = t; +		e->as.literal = s; +		e->next = NULL; +	} +	return e; +} + +// Create an inline with no value. +static inline cmark_node* make_simple(cmark_node_type t) +{ +	cmark_node* e = (cmark_node *)calloc(1, sizeof(*e)); +	if(e != NULL) { +		e->type = t; +		e->next = NULL; +	} +	return e; +} +  static unsigned char *bufdup(const unsigned char *buf)  {  	unsigned char *new_buf = NULL; | 
