Hello community, here is the log from the commit of package ghc-cmark-gfm for openSUSE:Factory checked in at 2018-10-25 08:15:47 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-cmark-gfm (Old) and /work/SRC/openSUSE:Factory/.ghc-cmark-gfm.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-cmark-gfm" Thu Oct 25 08:15:47 2018 rev:4 rq:642851 version:0.1.6 Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-cmark-gfm/ghc-cmark-gfm.changes 2018-08-27 12:58:11.560740394 +0200 +++ /work/SRC/openSUSE:Factory/.ghc-cmark-gfm.new/ghc-cmark-gfm.changes 2018-10-25 08:17:01.848052650 +0200 @@ -1,0 +2,9 @@ +Thu Oct 18 02:01:50 UTC 2018 - psim...@suse.com + +- Update cmark-gfm to version 0.1.6. + cmark-gfm 0.1.6 (17 Oct 2018) + + * Update to cmark-gfm 0.28.3.gfm.18. + * `optUnsafe` is now exposed, instead of `optSafe`. + +------------------------------------------------------------------- Old: ---- cmark-gfm-0.1.5.tar.gz New: ---- cmark-gfm-0.1.6.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-cmark-gfm.spec ++++++ --- /var/tmp/diff_new_pack.wILlLT/_old 2018-10-25 08:17:02.288052458 +0200 +++ /var/tmp/diff_new_pack.wILlLT/_new 2018-10-25 08:17:02.292052457 +0200 @@ -12,14 +12,14 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # %global pkg_name cmark-gfm %bcond_with tests Name: ghc-%{pkg_name} -Version: 0.1.5 +Version: 0.1.6 Release: 0 Summary: Fast, accurate GitHub Flavored Markdown parser and renderer License: BSD-3-Clause ++++++ cmark-gfm-0.1.5.tar.gz -> cmark-gfm-0.1.6.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/CMarkGFM.hsc new/cmark-gfm-0.1.6/CMarkGFM.hsc --- old/cmark-gfm-0.1.5/CMarkGFM.hsc 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/CMarkGFM.hsc 2018-10-17 06:04:00.000000000 +0200 @@ -15,7 +15,7 @@ , optSourcePos , optHardBreaks , optSmart - , optSafe + , optUnsafe , extStrikethrough , extTable , extAutolink @@ -278,10 +278,10 @@ optSmart :: CMarkOption optSmart = CMarkOption #const CMARK_OPT_SMART --- | Suppress rendering of raw HTML and potentially dangerous URLs in links +-- | Allow rendering of raw HTML and potentially dangerous URLs in links -- and images. -optSafe :: CMarkOption -optSafe = CMarkOption #const CMARK_OPT_SAFE +optUnsafe :: CMarkOption +optUnsafe = CMarkOption #const CMARK_OPT_UNSAFE newtype CMarkExtension = CMarkExtension { unCMarkExtension :: String } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/cmark-gfm-core-extensions.h new/cmark-gfm-0.1.6/cbits/cmark-gfm-core-extensions.h --- old/cmark-gfm-0.1.5/cbits/cmark-gfm-core-extensions.h 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/cmark-gfm-core-extensions.h 2018-10-17 06:02:59.000000000 +0200 @@ -18,6 +18,9 @@ CMARK_GFM_EXTENSIONS_EXPORT uint8_t *cmark_gfm_extensions_get_table_alignments(cmark_node *node); +CMARK_GFM_EXTENSIONS_EXPORT +int cmark_gfm_extensions_get_table_row_is_header(cmark_node *node); + #ifdef __cplusplus } #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/cmark-gfm-extension_api.h new/cmark-gfm-0.1.6/cbits/cmark-gfm-extension_api.h --- old/cmark-gfm-0.1.5/cbits/cmark-gfm-extension_api.h 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/cmark-gfm-extension_api.h 2018-10-17 06:02:59.000000000 +0200 @@ -106,8 +106,6 @@ * with 'cmark_syntax_extension_set_private', * and optionally define a free function for this data. */ -typedef struct cmark_syntax_extension cmark_syntax_extension; - typedef struct subject cmark_inline_parser; /** Exposed raw for now */ @@ -238,6 +236,9 @@ cmark_node *node, int c); +typedef const char* (*cmark_xml_attr_func) (cmark_syntax_extension *extension, + cmark_node *node); + typedef void (*cmark_html_render_func) (cmark_syntax_extension *extension, struct cmark_html_renderer *renderer, cmark_node *node, @@ -254,6 +255,10 @@ typedef int (*cmark_ispunct_func) (char c); +typedef void (*cmark_opaque_alloc_func) (cmark_syntax_extension *extension, + cmark_mem *mem, + cmark_node *node); + typedef void (*cmark_opaque_free_func) (cmark_syntax_extension *extension, cmark_mem *mem, cmark_node *node); @@ -343,6 +348,12 @@ /** See the documentation for 'cmark_syntax_extension' */ CMARK_GFM_EXPORT +void cmark_syntax_extension_set_xml_attr_func(cmark_syntax_extension *extension, + cmark_xml_attr_func func); + + /** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT void cmark_syntax_extension_set_man_render_func(cmark_syntax_extension *extension, cmark_common_render_func func); @@ -384,6 +395,12 @@ /** See the documentation for 'cmark_syntax_extension' */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_opaque_alloc_func(cmark_syntax_extension *extension, + cmark_opaque_alloc_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ CMARK_GFM_EXPORT void cmark_syntax_extension_set_opaque_free_func(cmark_syntax_extension *extension, cmark_opaque_free_func func); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/cmark-gfm-extensions_export.h new/cmark-gfm-0.1.6/cbits/cmark-gfm-extensions_export.h --- old/cmark-gfm-0.1.5/cbits/cmark-gfm-extensions_export.h 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/cmark-gfm-extensions_export.h 2018-10-17 06:02:59.000000000 +0200 @@ -39,4 +39,4 @@ # endif #endif -#endif +#endif /* CMARK_GFM_EXTENSIONS_EXPORT_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/cmark-gfm.h new/cmark-gfm-0.1.6/cbits/cmark-gfm.h --- old/cmark-gfm-0.1.5/cbits/cmark-gfm.h 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/cmark-gfm.h 2018-10-17 06:02:59.000000000 +0200 @@ -92,6 +92,7 @@ typedef struct cmark_node cmark_node; typedef struct cmark_parser cmark_parser; typedef struct cmark_iter cmark_iter; +typedef struct cmark_syntax_extension cmark_syntax_extension; /** * ## Custom memory allocator support @@ -187,6 +188,13 @@ CMARK_GFM_EXPORT cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem); +CMARK_GFM_EXPORT cmark_node *cmark_node_new_with_ext(cmark_node_type type, + cmark_syntax_extension *extension); + +CMARK_GFM_EXPORT cmark_node *cmark_node_new_with_mem_and_ext(cmark_node_type type, + cmark_mem *mem, + cmark_syntax_extension *extension); + /** Frees the memory allocated for a node and any children. */ CMARK_GFM_EXPORT void cmark_node_free(cmark_node *node); @@ -682,14 +690,6 @@ */ #define CMARK_OPT_HARDBREAKS (1 << 2) -/** Suppress raw HTML and unsafe links (`javascript:`, `vbscript:`, - * `file:`, and `data:`, except for `image/png`, `image/gif`, - * `image/jpeg`, or `image/webp` mime types). Raw HTML is replaced - * by a placeholder HTML comment. Unsafe links are replaced by - * empty strings. - */ -#define CMARK_OPT_SAFE (1 << 3) - /** Render `softbreak` elements as spaces. */ #define CMARK_OPT_NOBREAKS (1 << 4) @@ -738,6 +738,14 @@ */ #define CMARK_OPT_FULL_INFO_STRING (1 << 16) +/** Allow raw HTML and unsafe links, `javascript:`, `vbscript:`, `file:`, and + * all `data:` URLs -- by default, only `image/png`, `image/gif`, `image/jpeg`, + * or `image/webp` mime types are allowed. Without this option, raw HTML is + * replaced by a placeholder HTML comment, and unsafe links are replaced by + * empty strings. + */ +#define CMARK_OPT_UNSAFE (1 << 17) + /** * ## Version information */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/cmark-gfm_export.h new/cmark-gfm-0.1.6/cbits/cmark-gfm_export.h --- old/cmark-gfm-0.1.5/cbits/cmark-gfm_export.h 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/cmark-gfm_export.h 2018-10-17 06:02:59.000000000 +0200 @@ -39,4 +39,4 @@ # endif #endif -#endif +#endif /* CMARK_GFM_EXPORT_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/cmark-gfm_version.h new/cmark-gfm-0.1.6/cbits/cmark-gfm_version.h --- old/cmark-gfm-0.1.5/cbits/cmark-gfm_version.h 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/cmark-gfm_version.h 2018-10-17 06:07:24.000000000 +0200 @@ -1,7 +1,7 @@ #ifndef CMARK_GFM_VERSION_H #define CMARK_GFM_VERSION_H -#define CMARK_GFM_VERSION ((0 << 24) | (28 << 16) | (3 << 8) | 14) -#define CMARK_GFM_VERSION_STRING "0.28.3.gfm.14" +#define CMARK_GFM_VERSION ((0 << 24) | (28 << 16) | (3 << 8) | 18) +#define CMARK_GFM_VERSION_STRING "0.28.3.gfm.18" #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/commonmark.c new/cmark-gfm-0.1.6/cbits/commonmark.c --- old/cmark-gfm-0.1.5/cbits/commonmark.c 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/commonmark.c 2018-10-17 06:02:59.000000000 +0200 @@ -168,6 +168,7 @@ int list_number; cmark_delim_type list_delim; int numticks; + bool extra_spaces; int i; bool entering = (ev_type == CMARK_EVENT_ENTER); const char *info, *code, *title; @@ -369,14 +370,17 @@ code = cmark_node_get_literal(node); code_len = strlen(code); numticks = shortest_unused_backtick_sequence(code); + extra_spaces = code_len == 0 || + code[0] == '`' || code[code_len - 1] == '`' || + code[0] == ' ' || code[code_len - 1] == ' '; for (i = 0; i < numticks; i++) { LIT("`"); } - if (code_len == 0 || code[0] == '`') { + if (extra_spaces) { LIT(" "); } OUT(cmark_node_get_literal(node), allow_wrap, LITERAL); - if (code_len == 0 || code[code_len - 1] == '`') { + if (extra_spaces) { LIT(" "); } for (i = 0; i < numticks; i++) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/houdini_href_e.c new/cmark-gfm-0.1.6/cbits/houdini_href_e.c --- old/cmark-gfm-0.1.5/cbits/houdini_href_e.c 2018-08-21 04:13:36.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/houdini_href_e.c 2018-10-17 06:02:59.000000000 +0200 @@ -7,7 +7,7 @@ /* * The following characters will not be escaped: * - * -_.+!*'(),%#@?=;:/,+&$ alphanum + * -_.+!*'(),%#@?=;:/,+&$~ alphanum * * Note that this character set is the addition of: * @@ -35,7 +35,7 @@ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/html.c new/cmark-gfm-0.1.6/cbits/html.c --- old/cmark-gfm-0.1.5/cbits/html.c 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/html.c 2018-10-17 06:02:59.000000000 +0200 @@ -227,7 +227,7 @@ case CMARK_NODE_HTML_BLOCK: cmark_html_render_cr(html); - if (options & CMARK_OPT_SAFE) { + if (!(options & CMARK_OPT_UNSAFE)) { cmark_strbuf_puts(html, "<!-- raw HTML omitted -->"); } else if (renderer->filter_extensions) { filter_html_block(renderer, node->as.literal.data, node->as.literal.len); @@ -305,7 +305,7 @@ break; case CMARK_NODE_HTML_INLINE: - if (options & CMARK_OPT_SAFE) { + if (!(options & CMARK_OPT_UNSAFE)) { cmark_strbuf_puts(html, "<!-- raw HTML omitted -->"); } else { filtered = false; @@ -354,7 +354,7 @@ case CMARK_NODE_LINK: if (entering) { cmark_strbuf_puts(html, "<a href=\""); - if (!((options & CMARK_OPT_SAFE) && + if (!(!(options & CMARK_OPT_UNSAFE) && scan_dangerous_url(&node->as.link.url, 0))) { houdini_escape_href(html, node->as.link.url.data, node->as.link.url.len); @@ -372,7 +372,7 @@ case CMARK_NODE_IMAGE: if (entering) { cmark_strbuf_puts(html, "<img src=\""); - if (!((options & CMARK_OPT_SAFE) && + if (!(!(options & CMARK_OPT_UNSAFE) && scan_dangerous_url(&node->as.link.url, 0))) { houdini_escape_href(html, node->as.link.url.data, node->as.link.url.len); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/inlines.c new/cmark-gfm-0.1.6/cbits/inlines.c --- old/cmark-gfm-0.1.5/cbits/inlines.c 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/inlines.c 2018-10-17 06:02:59.000000000 +0200 @@ -321,6 +321,37 @@ return 0; } +// Destructively modify string, converting newlines to +// spaces, then removing a single leading + trailing space. +static void S_normalize_code(cmark_strbuf *s) { + bufsize_t r, w; + + for (r = 0, w = 0; r < s->size; ++r) { + switch (s->ptr[r]) { + case '\r': + if (s->ptr[r + 1] != '\n') { + s->ptr[w++] = ' '; + } + break; + case '\n': + s->ptr[w++] = ' '; + break; + default: + s->ptr[w++] = s->ptr[r]; + } + } + + // begins and ends with space? + if (s->ptr[0] == ' ' && s->ptr[w - 1] == ' ') { + cmark_strbuf_drop(s, 1); + cmark_strbuf_truncate(s, w - 2); + } else { + cmark_strbuf_truncate(s, w); + } + +} + + // Parse backtick code section or raw backticks, return an inline. // Assumes that the subject has a backtick at the current position. static cmark_node *handle_backticks(subject *subj, int options) { @@ -336,8 +367,7 @@ cmark_strbuf_set(&buf, subj->input.data + startpos, endpos - startpos - openticks.len); - cmark_strbuf_trim(&buf); - cmark_strbuf_normalize_whitespace(&buf); + S_normalize_code(&buf); cmark_node *node = make_code(subj, startpos, endpos - openticks.len - 1, cmark_chunk_buf_detach(&buf)); adjust_subj_node_newlines(subj, node, endpos - startpos, openticks.len, options); @@ -345,6 +375,7 @@ } } + // Scan ***, **, or * and return number scanned, or 0. // Advances position. static int scan_delims(subject *subj, unsigned char c, bool *can_open, @@ -1410,7 +1441,7 @@ // parse optional link_title beforetitle = subj.pos; spnl(&subj); - matchlen = scan_link_title(&subj.input, subj.pos); + matchlen = subj.pos == beforetitle ? 0 : scan_link_title(&subj.input, subj.pos); if (matchlen) { title = cmark_chunk_dup(&subj.input, subj.pos, matchlen); subj.pos += matchlen; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/node.c new/cmark-gfm-0.1.6/cbits/node.c --- old/cmark-gfm-0.1.5/cbits/node.c 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/node.c 2018-10-17 06:02:59.000000000 +0200 @@ -69,10 +69,11 @@ return cmark_node_can_contain_type(node, (cmark_node_type) child->type); } -cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem) { +cmark_node *cmark_node_new_with_mem_and_ext(cmark_node_type type, cmark_mem *mem, cmark_syntax_extension *extension) { cmark_node *node = (cmark_node *)mem->calloc(1, sizeof(*node)); cmark_strbuf_init(mem, &node->content, 0); node->type = (uint16_t)type; + node->extension = extension; switch (node->type) { case CMARK_NODE_HEADING: @@ -91,12 +92,25 @@ break; } + if (node->extension && node->extension->opaque_alloc_func) { + node->extension->opaque_alloc_func(node->extension, mem, node); + } + return node; } -cmark_node *cmark_node_new(cmark_node_type type) { +cmark_node *cmark_node_new_with_ext(cmark_node_type type, cmark_syntax_extension *extension) { extern cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR; - return cmark_node_new_with_mem(type, &CMARK_DEFAULT_MEM_ALLOCATOR); + return cmark_node_new_with_mem_and_ext(type, &CMARK_DEFAULT_MEM_ALLOCATOR, extension); +} + +cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem) +{ + return cmark_node_new_with_mem_and_ext(type, mem, NULL); +} + +cmark_node *cmark_node_new(cmark_node_type type) { + return cmark_node_new_with_ext(type, NULL); } static void free_node_as(cmark_node *node) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/strikethrough.c new/cmark-gfm-0.1.6/cbits/strikethrough.c --- old/cmark-gfm-0.1.5/cbits/strikethrough.c 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/strikethrough.c 2018-10-17 06:02:59.000000000 +0200 @@ -28,7 +28,7 @@ res->start_column = cmark_inline_parser_get_column(inline_parser) - delims; if ((left_flanking || right_flanking) && - (!(parser->options & CMARK_OPT_STRIKETHROUGH_DOUBLE_TILDE) || delims == 2)) { + (delims == 2 || (!(parser->options & CMARK_OPT_STRIKETHROUGH_DOUBLE_TILDE) && delims == 1))) { cmark_inline_parser_push_delimiter(inline_parser, character, left_flanking, right_flanking, res); } @@ -46,6 +46,9 @@ strikethrough = opener->inl_text; + if (opener->inl_text->as.literal.len != closer->inl_text->as.literal.len) + goto done; + if (!cmark_node_set_type(strikethrough, CMARK_NODE_STRIKETHROUGH)) goto done; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/syntax_extension.c new/cmark-gfm-0.1.6/cbits/syntax_extension.c --- old/cmark-gfm-0.1.5/cbits/syntax_extension.c 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/syntax_extension.c 2018-10-17 06:02:59.000000000 +0200 @@ -97,6 +97,11 @@ extension->latex_render_func = func; } +void cmark_syntax_extension_set_xml_attr_func(cmark_syntax_extension *extension, + cmark_xml_attr_func func) { + extension->xml_attr_func = func; +} + void cmark_syntax_extension_set_man_render_func(cmark_syntax_extension *extension, cmark_common_render_func func) { extension->man_render_func = func; @@ -128,6 +133,11 @@ return extension->priv; } +void cmark_syntax_extension_set_opaque_alloc_func(cmark_syntax_extension *extension, + cmark_opaque_alloc_func func) { + extension->opaque_alloc_func = func; +} + void cmark_syntax_extension_set_opaque_free_func(cmark_syntax_extension *extension, cmark_opaque_free_func func) { extension->opaque_free_func = func; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/syntax_extension.h new/cmark-gfm-0.1.6/cbits/syntax_extension.h --- old/cmark-gfm-0.1.5/cbits/syntax_extension.h 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/syntax_extension.h 2018-10-17 06:02:59.000000000 +0200 @@ -21,10 +21,12 @@ cmark_common_render_func commonmark_render_func; cmark_common_render_func plaintext_render_func; cmark_common_render_func latex_render_func; + cmark_xml_attr_func xml_attr_func; cmark_common_render_func man_render_func; cmark_html_render_func html_render_func; cmark_html_filter_func html_filter_func; cmark_postprocess_func postprocess_func; + cmark_opaque_alloc_func opaque_alloc_func; cmark_opaque_free_func opaque_free_func; cmark_commonmark_escape_func commonmark_escape_func; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/table.c new/cmark-gfm-0.1.6/cbits/table.c --- old/cmark-gfm-0.1.5/cbits/table.c 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/table.c 2018-10-17 06:02:59.000000000 +0200 @@ -9,6 +9,7 @@ #include "ext_scanners.h" #include "strikethrough.h" #include "table.h" +#include "cmark-gfm-core-extensions.h" cmark_node_type CMARK_NODE_TABLE, CMARK_NODE_TABLE_ROW, CMARK_NODE_TABLE_CELL; @@ -380,7 +381,8 @@ child_type == CMARK_NODE_EMPH || child_type == CMARK_NODE_STRONG || child_type == CMARK_NODE_LINK || child_type == CMARK_NODE_IMAGE || child_type == CMARK_NODE_STRIKETHROUGH || - child_type == CMARK_NODE_HTML_INLINE; + child_type == CMARK_NODE_HTML_INLINE || + child_type == CMARK_NODE_FOOTNOTE_REFERENCE; } return false; } @@ -487,6 +489,27 @@ } } +static const char *xml_attr(cmark_syntax_extension *extension, + cmark_node *node) { + if (node->type == CMARK_NODE_TABLE_CELL) { + if (cmark_gfm_extensions_get_table_row_is_header(node->parent)) { + uint8_t *alignments = get_table_alignments(node->parent->parent); + int i = 0; + cmark_node *n; + for (n = node->parent->first_child; n; n = n->next, ++i) + if (n == node) + break; + switch (alignments[i]) { + case 'l': return " align=\"left\""; + case 'c': return " align=\"center\""; + case 'r': return " align=\"right\""; + } + } + } + + return NULL; +} + static void man_render(cmark_syntax_extension *extension, cmark_renderer *renderer, cmark_node *node, cmark_event_type ev_type, int options) { @@ -647,6 +670,16 @@ } } +static void opaque_alloc(cmark_syntax_extension *self, cmark_mem *mem, cmark_node *node) { + if (node->type == CMARK_NODE_TABLE) { + node->as.opaque = mem->calloc(1, sizeof(node_table)); + } else if (node->type == CMARK_NODE_TABLE_ROW) { + node->as.opaque = mem->calloc(1, sizeof(node_table_row)); + } else if (node->type == CMARK_NODE_TABLE_CELL) { + node->as.opaque = mem->calloc(1, sizeof(node_cell)); + } +} + static void opaque_free(cmark_syntax_extension *self, cmark_mem *mem, cmark_node *node) { if (node->type == CMARK_NODE_TABLE) { free_node_table(mem, node->as.opaque); @@ -674,8 +707,10 @@ cmark_syntax_extension_set_commonmark_render_func(self, commonmark_render); cmark_syntax_extension_set_plaintext_render_func(self, commonmark_render); cmark_syntax_extension_set_latex_render_func(self, latex_render); + cmark_syntax_extension_set_xml_attr_func(self, xml_attr); cmark_syntax_extension_set_man_render_func(self, man_render); cmark_syntax_extension_set_html_render_func(self, html_render); + cmark_syntax_extension_set_opaque_alloc_func(self, opaque_alloc); cmark_syntax_extension_set_opaque_free_func(self, opaque_free); cmark_syntax_extension_set_commonmark_escape_func(self, escape); CMARK_NODE_TABLE = cmark_syntax_extension_add_node(0); @@ -698,3 +733,30 @@ return ((node_table *)node->as.opaque)->alignments; } + +int cmark_gfm_extensions_set_table_columns(cmark_node *node, uint16_t n_columns) { + return set_n_table_columns(node, n_columns); +} + +int cmark_gfm_extensions_set_table_alignments(cmark_node *node, uint16_t ncols, uint8_t *alignments) { + uint8_t *a = (uint8_t *)cmark_node_mem(node)->calloc(1, ncols); + memcpy(a, alignments, ncols); + return set_table_alignments(node, a); +} + +int cmark_gfm_extensions_get_table_row_is_header(cmark_node *node) +{ + if (!node || node->type != CMARK_NODE_TABLE_ROW) + return 0; + + return ((node_table_row *)node->as.opaque)->is_header; +} + +int cmark_gfm_extensions_set_table_row_is_header(cmark_node *node, int is_header) +{ + if (!node || node->type != CMARK_NODE_TABLE_ROW) + return 0; + + ((node_table_row *)node->as.opaque)->is_header = (is_header != 0); + return 1; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cbits/xml.c new/cmark-gfm-0.1.6/cbits/xml.c --- old/cmark-gfm-0.1.5/cbits/xml.c 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/cbits/xml.c 2018-10-17 06:02:59.000000000 +0200 @@ -8,6 +8,7 @@ #include "node.h" #include "buffer.h" #include "houdini.h" +#include "syntax_extension.h" #define BUFFER_SIZE 100 @@ -50,6 +51,12 @@ cmark_strbuf_puts(xml, buffer); } + if (node->extension && node->extension->xml_attr_func) { + const char* r = node->extension->xml_attr_func(node->extension, node); + if (r != NULL) + cmark_strbuf_puts(xml, r); + } + literal = false; switch (node->type) { @@ -60,7 +67,7 @@ case CMARK_NODE_CODE: case CMARK_NODE_HTML_BLOCK: case CMARK_NODE_HTML_INLINE: - cmark_strbuf_puts(xml, ">"); + cmark_strbuf_puts(xml, " xml:space=\"preserve\">"); escape_xml(xml, node->as.literal.data, node->as.literal.len); cmark_strbuf_puts(xml, "</"); cmark_strbuf_puts(xml, cmark_node_get_type_string(node)); @@ -100,7 +107,7 @@ escape_xml(xml, node->as.code.info.data, node->as.code.info.len); cmark_strbuf_putc(xml, '"'); } - cmark_strbuf_puts(xml, ">"); + cmark_strbuf_puts(xml, " xml:space=\"preserve\">"); escape_xml(xml, node->as.code.literal.data, node->as.code.literal.len); cmark_strbuf_puts(xml, "</"); cmark_strbuf_puts(xml, cmark_node_get_type_string(node)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/changelog new/cmark-gfm-0.1.6/changelog --- old/cmark-gfm-0.1.5/changelog 2018-08-21 05:09:35.000000000 +0200 +++ new/cmark-gfm-0.1.6/changelog 2018-10-17 06:08:07.000000000 +0200 @@ -1,3 +1,8 @@ +cmark-gfm 0.1.6 (17 Oct 2018) + + * Update to cmark-gfm 0.28.3.gfm.18. + * `optUnsafe` is now exposed, instead of `optSafe`. + cmark-gfm 0.1.5 (21 Aug 2018) * Update to cmark-gfm 0.28.3.gfm.15. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/cmark-gfm.cabal new/cmark-gfm-0.1.6/cmark-gfm.cabal --- old/cmark-gfm-0.1.5/cmark-gfm.cabal 2018-08-21 05:06:03.000000000 +0200 +++ new/cmark-gfm-0.1.6/cmark-gfm.cabal 2018-10-17 06:08:14.000000000 +0200 @@ -1,5 +1,5 @@ name: cmark-gfm -version: 0.1.5 +version: 0.1.6 synopsis: Fast, accurate GitHub Flavored Markdown parser and renderer description: This package provides Haskell bindings for @@ -76,7 +76,7 @@ default-language: Haskell2010 ghc-options: -Wall -fno-warn-unused-do-bind if flag(pkgconfig) - Extra-Libraries: cmark-gfm cmark-gfmextensions + Extra-Libraries: cmark-gfm cmark-gfm-extensions else cc-options: -Wall -std=c99 Include-dirs: cbits diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmark-gfm-0.1.5/test/test-cmark.hs new/cmark-gfm-0.1.6/test/test-cmark.hs --- old/cmark-gfm-0.1.5/test/test-cmark.hs 2018-08-21 05:04:38.000000000 +0200 +++ new/cmark-gfm-0.1.6/test/test-cmark.hs 2018-10-17 06:04:51.000000000 +0200 @@ -18,7 +18,7 @@ tests = TestList [ "<h1>Hi</h1>\n" ~=? commonmarkToHtml [] [] "# Hi" , "<p>dog’s</p>\n" ~=? commonmarkToHtml [optSmart] [] "dog's" - , "<p><a href=\"\">trick</a></p>\n" ~=? commonmarkToHtml [optSafe] [] "[trick](javascript:alert('hi'))" + , "<p><a href=\"\">trick</a></p>\n" ~=? commonmarkToHtml [] [] "[trick](javascript:alert('hi'))" , ".RS\n.PP\nquote\n.RE\n" ~=? commonmarkToMan [] [] Nothing "> quote" , (Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 13})) DOCUMENT [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 13})) PARAGRAPH [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 6})) (TEXT "Hello ") [],Node (Just (PosInfo {startLine = 1, startColumn = 7, endLine = 1, endColumn = 13})) EMPH [Node (Just (PosInfo {startLine = 1, startColumn = 8, endLine = 1, endColumn = 12})) (TEXT "world") []]]]) ~=? commonmarkToNode [] [] "Hello *world*" , "> Hello\n> *world*\n" ~=? nodeToCommonmark [] (Just 12) (Node Nothing DOCUMENT [Node Nothing BLOCK_QUOTE [Node Nothing PARAGRAPH [Node Nothing (TEXT "Hello ") [],Node Nothing EMPH [Node Nothing (TEXT "world") []]]]]) @@ -30,6 +30,6 @@ , "<p>| a |\n| --- |\n| b |</p>\n" ~=? commonmarkToHtml [] [] "| a |\n| --- |\n| b |\n" , "<table>\n<thead>\n<tr>\n<th>a</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>b</td>\n</tr>\n</tbody>\n</table>\n" ~=? commonmarkToHtml [] [extTable] "| a |\n| --- |\n| b |\n" , Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 3, endColumn = 17})) DOCUMENT [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 3, endColumn = 17})) (TABLE [LeftAligned,CenterAligned,NoAlignment,RightAligned]) [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 17})) TABLE_ROW [Node (Just (PosInfo {startLine = 1, startColumn = 2, endLine = 1, endColumn = 4})) TABLE_CELL [Node (Just (PosInfo {startLine = 1, startColumn = 3, endLine = 1, endColumn = 3})) (TEXT "a") []],Node (Just (PosInfo {startLine = 1, startColumn = 6, endLine = 1, endColumn = 8})) TABLE_CELL [Node (Just (PosInfo {startLine = 1, startColumn = 7, endLine = 1, endColumn = 7})) (TEXT "b") []],Node (Just (PosInfo {startLine = 1, startColumn = 10, endLine = 1, endColumn = 12})) TABLE_CELL [Node (Just (PosInfo {startLine = 1, startColumn = 11, endLine = 1, endColumn = 11})) (TEXT "c") []],Node (Just (PosInfo {startLine = 1, startColumn = 14, endLine = 1, endColumn = 16})) TABLE_CELL [Node (Just (PosInfo {startLine = 1, startColumn = 15, endLine = 1, endColumn = 15})) (TEXT "d") []]],Node (Just (PosInfo {startLine = 3, startColumn = 1, endLine = 3, endColumn = 17})) TABLE_ROW [Node (Just (PosInfo {startLine = 3, startColumn = 2, endLine = 3, endColumn = 4})) TABLE_CELL [Node (Just (PosInfo {startLine = 3, startColumn = 3, endLine = 3, endColumn = 3})) (TEXT "y") []],Node (Just (PosInfo {startLine = 3, startColumn = 6, endLine = 3, endColumn = 8})) TABLE_CELL [Node (Just (PosInfo {startLine = 3, startColumn = 7, endLine = 3, endColumn = 7})) (TEXT "o") []],Node (Just (PosInfo {startLine = 3, startColumn = 10, endLine = 3, endColumn = 12})) TABLE_CELL [Node (Just (PosInfo {startLine = 3, startColumn = 11, endLine = 3, endColumn = 11})) (TEXT "s") []],Node (Just (PosInfo {startLine = 3, startColumn = 14, endLine = 3, endColumn = 16})) TABLE_CELL [Node (Just (PosInfo {startLine = 3, startColumn = 15, endLine = 3, endColumn = 15})) (TEXT "h") []]]]] ~=? commonmarkToNode [] [extTable] "| a | b | c | d |\n| :-- | :-: | --- | --: |\n| y | o | s | h |" - , "<xmp>\n" ~=? commonmarkToHtml [] [] "<xmp>" - , "<xmp>\n" ~=? commonmarkToHtml [] [extTagfilter] "<xmp>" + , "<xmp>\n" ~=? commonmarkToHtml [optUnsafe] [] "<xmp>" + , "<xmp>\n" ~=? commonmarkToHtml [optUnsafe] [extTagfilter] "<xmp>" ]