From 64c2fb9e47c1857a0d6c8a24ca56e7e99be4ddd4 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Wed, 6 May 2015 14:43:48 -0700 Subject: Revised luajit wrapper. --- wrappers/wrapper.lua | 326 ++++++++++++++++++++++++++++----------------------- 1 file changed, 182 insertions(+), 144 deletions(-) diff --git a/wrappers/wrapper.lua b/wrappers/wrapper.lua index 11c5183..023e0b3 100755 --- a/wrappers/wrapper.lua +++ b/wrappers/wrapper.lua @@ -5,197 +5,235 @@ local ffi = require("ffi") cmark = ffi.load("libcmark") ffi.cdef[[ +char *cmark_markdown_to_html(const char *text, int len, int options); - char *cmark_markdown_to_html(const char *text, int len); - typedef enum { - /* Block */ - CMARK_NODE_DOCUMENT, - CMARK_NODE_BLOCK_QUOTE, - CMARK_NODE_LIST, - CMARK_NODE_LIST_ITEM, - CMARK_NODE_CODE_BLOCK, - CMARK_NODE_HTML, - CMARK_NODE_PARAGRAPH, - CMARK_NODE_HEADER, - CMARK_NODE_HRULE, - CMARK_NODE_REFERENCE_DEF, +typedef enum { + /* Error status */ + CMARK_NODE_NONE, - CMARK_NODE_FIRST_BLOCK = CMARK_NODE_DOCUMENT, - CMARK_NODE_LAST_BLOCK = CMARK_NODE_REFERENCE_DEF, + /* Block */ + CMARK_NODE_DOCUMENT, + CMARK_NODE_BLOCK_QUOTE, + CMARK_NODE_LIST, + CMARK_NODE_ITEM, + CMARK_NODE_CODE_BLOCK, + CMARK_NODE_HTML, + CMARK_NODE_PARAGRAPH, + CMARK_NODE_HEADER, + CMARK_NODE_HRULE, - /* Inline */ - CMARK_NODE_TEXT, - CMARK_NODE_SOFTBREAK, - CMARK_NODE_LINEBREAK, - CMARK_NODE_INLINE_CODE, - CMARK_NODE_INLINE_HTML, - CMARK_NODE_EMPH, - CMARK_NODE_STRONG, - CMARK_NODE_LINK, - CMARK_NODE_IMAGE, + CMARK_NODE_FIRST_BLOCK = CMARK_NODE_DOCUMENT, + CMARK_NODE_LAST_BLOCK = CMARK_NODE_HRULE, - CMARK_NODE_FIRST_INLINE = CMARK_NODE_TEXT, - CMARK_NODE_LAST_INLINE = CMARK_NODE_IMAGE, - } cmark_node_type; + /* Inline */ + CMARK_NODE_TEXT, + CMARK_NODE_SOFTBREAK, + CMARK_NODE_LINEBREAK, + CMARK_NODE_CODE, + CMARK_NODE_INLINE_HTML, + CMARK_NODE_EMPH, + CMARK_NODE_STRONG, + CMARK_NODE_LINK, + CMARK_NODE_IMAGE, - typedef enum { - CMARK_NO_LIST, - CMARK_BULLET_LIST, - CMARK_ORDERED_LIST - } cmark_list_type; + CMARK_NODE_FIRST_INLINE = CMARK_NODE_TEXT, + CMARK_NODE_LAST_INLINE = CMARK_NODE_IMAGE, +} cmark_node_type; - typedef enum { - CMARK_PERIOD_DELIM, - CMARK_PAREN_DELIM - } cmark_delim_type; - typedef struct cmark_node cmark_node; - typedef struct cmark_parser cmark_parser; +typedef enum { + CMARK_NO_LIST, + CMARK_BULLET_LIST, + CMARK_ORDERED_LIST +} cmark_list_type; - cmark_node* cmark_node_new(cmark_node_type type); +typedef enum { + CMARK_NO_DELIM, + CMARK_PERIOD_DELIM, + CMARK_PAREN_DELIM +} cmark_delim_type; - void - cmark_node_free(cmark_node *node); +typedef struct cmark_node cmark_node; +typedef struct cmark_parser cmark_parser; +typedef struct cmark_iter cmark_iter; - cmark_node* cmark_node_next(cmark_node *node); +typedef enum { + CMARK_EVENT_NONE, + CMARK_EVENT_DONE, + CMARK_EVENT_ENTER, + CMARK_EVENT_EXIT +} cmark_event_type; - cmark_node* cmark_node_previous(cmark_node *node); +cmark_node* +cmark_node_new(cmark_node_type type); - cmark_node* cmark_node_parent(cmark_node *node); +void +cmark_node_free(cmark_node *node); - cmark_node* cmark_node_first_child(cmark_node *node); +cmark_node* +cmark_node_next(cmark_node *node); - cmark_node* cmark_node_last_child(cmark_node *node); +cmark_node* +cmark_node_previous(cmark_node *node); - cmark_node_type cmark_node_get_type(cmark_node *node); +cmark_node* +cmark_node_parent(cmark_node *node); - const char* cmark_node_get_string_content(cmark_node *node); +cmark_node* +cmark_node_first_child(cmark_node *node); - int cmark_node_set_string_content(cmark_node *node, const char *content); +cmark_node* +cmark_node_last_child(cmark_node *node); - int cmark_node_get_header_level(cmark_node *node); +cmark_iter* +cmark_iter_new(cmark_node *root); - int cmark_node_set_header_level(cmark_node *node, int level); +void +cmark_iter_free(cmark_iter *iter); - cmark_list_type cmark_node_get_list_type(cmark_node *node); +cmark_event_type +cmark_iter_next(cmark_iter *iter); - int cmark_node_set_list_type(cmark_node *node, cmark_list_type type); +cmark_node* +cmark_iter_get_node(cmark_iter *iter); - int cmark_node_get_list_start(cmark_node *node); +cmark_event_type +cmark_iter_get_event_type(cmark_iter *iter); - int cmark_node_set_list_start(cmark_node *node, int start); +cmark_node* +cmark_iter_get_root(cmark_iter *iter); - int cmark_node_get_list_tight(cmark_node *node); +void +cmark_iter_reset(cmark_iter *iter, cmark_node *current, + cmark_event_type event_type); - int cmark_node_set_list_tight(cmark_node *node, int tight); +void* +cmark_node_get_user_data(cmark_node *node); - const char* cmark_node_get_fence_info(cmark_node *node); +int +cmark_node_set_user_data(cmark_node *node, void *user_data); - int cmark_node_set_fence_info(cmark_node *node, const char *info); +cmark_node_type +cmark_node_get_type(cmark_node *node); - const char* cmark_node_get_url(cmark_node *node); +const char* +cmark_node_get_type_string(cmark_node *node); - int cmark_node_set_url(cmark_node *node, const char *url); +const char* +cmark_node_get_literal(cmark_node *node); - const char* cmark_node_get_title(cmark_node *node); +int +cmark_node_set_literal(cmark_node *node, const char *content); - int cmark_node_set_title(cmark_node *node, const char *title); +int +cmark_node_get_header_level(cmark_node *node); - int cmark_node_get_start_line(cmark_node *node); +int +cmark_node_set_header_level(cmark_node *node, int level); - int cmark_node_get_start_column(cmark_node *node); +cmark_list_type +cmark_node_get_list_type(cmark_node *node); - int cmark_node_get_end_line(cmark_node *node); +int +cmark_node_set_list_type(cmark_node *node, cmark_list_type type); - void cmark_node_unlink(cmark_node *node); +cmark_delim_type +cmark_node_get_list_delim(cmark_node *node); - int cmark_node_insert_before(cmark_node *node, cmark_node *sibling); +int +cmark_node_set_list_delim(cmark_node *node, cmark_delim_type delim); - int cmark_node_insert_after(cmark_node *node, cmark_node *sibling); +int +cmark_node_get_list_start(cmark_node *node); - int cmark_node_prepend_child(cmark_node *node, cmark_node *child); +int +cmark_node_set_list_start(cmark_node *node, int start); - int cmark_node_append_child(cmark_node *node, cmark_node *child); +int +cmark_node_get_list_tight(cmark_node *node); - cmark_parser *cmark_parser_new(); +int +cmark_node_set_list_tight(cmark_node *node, int tight); - void cmark_parser_free(cmark_parser *parser); +const char* +cmark_node_get_fence_info(cmark_node *node); - cmark_node *cmark_parser_finish(cmark_parser *parser); +int +cmark_node_set_fence_info(cmark_node *node, const char *info); - void cmark_parser_feed(cmark_parser *parser, const char *buffer, size_t len); +const char* +cmark_node_get_url(cmark_node *node); - cmark_node *cmark_parse_document(const char *buffer, size_t len); +int +cmark_node_set_url(cmark_node *node, const char *url); - char *cmark_render_ast(cmark_node *root); +const char* +cmark_node_get_title(cmark_node *node); - char *cmark_render_html(cmark_node *root); +int +cmark_node_set_title(cmark_node *node, const char *title); + +int +cmark_node_get_start_line(cmark_node *node); + +int +cmark_node_get_start_column(cmark_node *node); + +int +cmark_node_get_end_line(cmark_node *node); + +int +cmark_node_get_end_column(cmark_node *node); + +void +cmark_node_unlink(cmark_node *node); + +int +cmark_node_insert_before(cmark_node *node, cmark_node *sibling); + +int +cmark_node_insert_after(cmark_node *node, cmark_node *sibling); + +int +cmark_node_prepend_child(cmark_node *node, cmark_node *child); + +int +cmark_node_append_child(cmark_node *node, cmark_node *child); + +void +cmark_consolidate_text_nodes(cmark_node *root); + +cmark_parser *cmark_parser_new(int options); + +void cmark_parser_free(cmark_parser *parser); + +void cmark_parser_feed(cmark_parser *parser, const char *buffer, size_t len); + +cmark_node *cmark_parser_finish(cmark_parser *parser); + +cmark_node *cmark_parse_document(const char *buffer, size_t len, int options); + +char *cmark_render_xml(cmark_node *root, int options); + +char *cmark_render_html(cmark_node *root, int options); + +char *cmark_render_man(cmark_node *root, int options); + +char *cmark_render_commonmark(cmark_node *root, int options, int width); + +extern const int cmark_version; + +extern const char cmark_version_string[]; ]] +CMARK_OPT_DEFAULT = 0 +CMARK_OPT_SOURCEPOS = 1 +CMARK_OPT_HARDBREAKS = 2 +CMARK_OPT_NORMALIZE = 4 +CMARK_OPT_SMART = 8 + local inp = io.read("*all") -local doc = cmark.cmark_parse_document(inp, string.len(inp)) - -local cur = doc -local next -local child - -local walk = function(action) - level = 0 - while cur ~= nil do - action(cur, level) - child = cmark.cmark_node_first_child(cur) - if child == nil then - next = cmark.cmark_node_next(cur) - while next == nil do - cur = cmark.cmark_node_parent(cur) - level = level - 1 - if cur == nil then - break - else - next = cmark.cmark_node_next(cur) - end - end - cur = next - else - level = level + 1 - cur = child - end - end -end - -local type_table = { - 'BLOCK_QUOTE', - 'LIST', - 'LIST_ITEM', - 'CODE_BLOCK', - 'HTML', - 'PARAGRAPH', - 'HEADER', - 'HRULE', - 'REFERENCE_DEF', - 'TEXT', - 'SOFTBREAK', - 'LINEBREAK', - 'INLINE_CODE', - 'INLINE_HTML', - 'EMPH', - 'STRONG', - 'LINK', - 'IMAGE', -} -type_table[0] = 'DOCUMENT' - -local function print_type(node, level) - local t = tonumber(cmark.cmark_node_get_type(node)) - io.write(string.rep(' ', level) .. type_table[t]) - if t == cmark.CMARK_NODE_TEXT then - io.write(' ' .. ffi.string(cmark.cmark_node_get_string_content(node))) - end - io.write('\n') -end - -walk(print_type) - --- local html = ffi.string(cmark.cmark_render_html(doc)) --- print(html) +local doc = cmark.cmark_parse_document(inp, string.len(inp), CMARK_OPT_SMART) +local html = ffi.string(cmark.cmark_render_html(doc, CMARK_OPT_DEFAULT)) +print(html) -- cgit v1.2.3