package vendor:commonmark
Overview
Bindings for CMark.
Original authors: John MacFarlane, Vicent Marti, Kārlis Gaņģis, Nick Wellnhofer. See LICENSE for license details.
Example:
import cm "vendor:commonmark"
// Parsing - Simple interface
hellope_world :: proc() {
fmt.printf("CMark version: %v\n", cm.version_string())
str := "Hellope *world*!"
root := cm.parse_document(raw_data(str), len(str), cm.DEFAULT_OPTIONS)
defer cm.node_free(root)
html := cm.render_html(root, cm.DEFAULT_OPTIONS)
defer cm.free(html)
fmt.println(html)
}
// Parsing - Streaming interface
streaming :: proc() {
using cm
STR :: "Hellope *world*!\n\n"
N :: 50
STREAM_SIZE :: 42
str_buf: [len(STR) * N]u8
for i in 0..<N {
copy(str_buf[i*len(STR):], STR)
}
parser := parser_new(DEFAULT_OPTIONS)
defer parser_free(parser)
buf := str_buf[:]
for len(buf) > STREAM_SIZE {
parser_feed(parser, raw_data(buf), STREAM_SIZE)
buf = buf[STREAM_SIZE:]
}
if len(buf) > 0 {
parser_feed(parser, raw_data(buf), len(buf))
buf = buf[len(buf):]
}
root := parser_finish(parser)
defer cm.node_free(root)
html := cm.render_html(root, cm.DEFAULT_OPTIONS)
defer cm.free(html)
fmt.println(html)
}
An iterator will walk through a tree of nodes, starting from a root node, returning one node at a time, together with information about whether the node is being entered or exited.
The iterator will first descend to a child node, if there is one.
When there is no child, the iterator will go to the next sibling.
When there is no next sibling, the iterator will return to the parent
(but with an Event_Type.Exit).
The iterator will return .Done when it reaches the root node again.
One natural application is an HTML renderer, where an .Enter event
outputs an open tag and an .Exit event outputs a close tag.
An iterator might also be used to transform an AST in some systematic way, for example, turning all level-3 headings into regular paragraphs.
usage_example(root: ^Node) {
ev_type: Event_Type
iter := iter_new(root)
defer iter_free(iter)
for {
ev_type = iter_next(iter)
if ev_type == .Done do break
cur := iter_get_node(iter)
// Do something with `cur` and `ev_type`
}
}
Iterators will never return .Exit events for leaf nodes,
which are nodes of type:
HTML_Block Thematic_Break Code_Block Text Soft_Break Line_Break Code HTML_Inline
Nodes must only be modified after an .Exit event, or an .Enter event for
leaf nodes.
Index
Types (19)
Constants (3)
Variables (0)
This section is empty.
Procedures (75)
- consolidate_text_nodes
free_… (3)
- get_default_mem_allocator
- get_default_mem_allocator_as_odin
- markdown_to_html
- markdown_to_html_from_string
node_… (44)
- node_append_child
- node_first_child
- node_free
- node_get_end_column
- node_get_end_line
- node_get_fence_info
- node_get_heading_level
- node_get_list_delim
- node_get_list_start
- node_get_list_tight
- node_get_list_type
- node_get_literal
- node_get_on_enter
- node_get_on_exit
- node_get_start_column
- node_get_start_line
- node_get_title
- node_get_type
- node_get_type_string
- node_get_url
- node_get_user_data
- node_insert_after
- node_insert_before
- node_last_child
- node_new
- node_new_with_mem
- node_next
- node_parent
- node_prepend_child
- node_previous
- node_replace
- node_set_fence_info
- node_set_heading_level
- node_set_list_delim
- node_set_list_start
- node_set_list_tight
- node_set_list_type
- node_set_literal
- node_set_on_enter
- node_set_on_exit
- node_set_title
- node_set_url
- node_set_user_data
- node_unlink
render_… (5)
- version
- version_string
Procedure Groups (1)
`#config` values (1)
Types
Allocator ¶
Allocator :: struct { calloc: proc "c" (num: uint, size: uint) -> rawptr, realloc: proc "c" (ptr: rawptr, new_size: uint) -> rawptr, free: proc "c" (ptr: rawptr), }
Custom allocator - Defines the memory allocation functions to be used by CMark when parsing and allocating a document tree
Related Procedures With Parameters
Delim_Type ¶
Delim_Type :: enum i32 { None, Period, Paren, }
List_Type ¶
List_Type :: enum i32 { None, Bullet, Ordered, }
Node ¶
Node :: struct { mem: ^Allocator, next: ^Node, prev: ^Node, parent: ^Node, first_child: ^Node, last_child: ^Node, user_data: rawptr, data: [^]u8, len: bufsize_t, start_line: i32, start_column: i32, end_line: i32, end_column: i32, type: Node_Type, flags: bit_set[Node_Flag; u16], as: struct #raw_union { list: List `raw_union_tag:"type=.List"`, code: Code `raw_union_tag:"type=.Code"`, heading: Heading `raw_union_tag:"type=.Heading"`, link: Link `raw_union_tag:"type=.Link"`, custom: Custom `raw_union_tag:"type=.Custom"`, html_block_type: i32 `raw_union_tag:"type=.HTML_Block"`, }, }
Node creation, destruction, and tree traversal
Related Procedures With Parameters
- consolidate_text_nodes
- iter_new
- iter_reset
- node_append_child
- node_first_child
- node_free
- node_get_end_column
- node_get_end_line
- node_get_fence_info
- node_get_heading_level
- node_get_list_delim
- node_get_list_start
- node_get_list_tight
- node_get_list_type
- node_get_literal
- node_get_on_enter
- node_get_on_exit
- node_get_start_column
- node_get_start_line
- node_get_title
- node_get_type
- node_get_type_string
- node_get_url
- node_get_user_data
- node_insert_after
- node_insert_before
- node_last_child
- node_next
- node_parent
- node_prepend_child
- node_previous
- node_replace
- node_set_fence_info
- node_set_heading_level
- node_set_list_delim
- node_set_list_start
- node_set_list_tight
- node_set_list_type
- node_set_literal
- node_set_on_enter
- node_set_on_exit
- node_set_title
- node_set_url
- node_set_user_data
- node_unlink
- render_commonmark
- render_html
- render_latex
- render_man
- render_xml
Related Procedures With Returns
Node_Flag ¶
Node_Flag :: enum u16 { Open = 0, Last_Line_Blank = 1, Last_Line_Checked = 2, }
Node_Type ¶
Node_Type :: enum u16 { // Error status None = 0, // Block Document, Block_Quote, List, Item, Code_Block, HTML_Block, Custom_Block, Paragraph, Heading, Thematic_Break, // Inline Text, Soft_Break, Line_Break, Code, HTML_Inline, Custom_Inline, Emph, Strong, Link, Image, First_Block = Document, Last_Block = Thematic_Break, First_Inline = Text, Last_Inline = Image, }
Related Procedures With Parameters
Option ¶
Option :: enum i32 { Source_Position = 1, // Include a `data-sourcepos` attribute on all block elements. Hard_Breaks = 2, // Render `softbreak` as hard line breaks. Safe = 3, // Defined for API compatibility, now enabled by default. Unsafe = 17, // Render raw HTML and unsafe links (`javascript:`, `vbscript:`, // `file:`, and `data:`, except for `image/png`, `image/gif`, // `image/jpeg`, or `image/webp` mime types). By default, // raw HTML is replaced by a placeholder HTML comment. Unsafe // links are replaced by empty strings. No_Breaks = 4, // Render `softbreak` elements as spaces. Normalize = 8, // Legacy option, no effect. Validate_UTF8 = 9, // Validate UTF-8 input before parsing, replacing illegal // sequences with the replacement character U+FFFD. Smart = 10, // Convert straight quotes to curly, --- to em dashes, -- to en dashes. }
Parser ¶
Parser :: distinct rawptr
Related Procedures With Parameters
Related Procedures With Returns
bufsize_t ¶
bufsize_t :: distinct i32
Constants
BINDING_VERSION ¶
BINDING_VERSION :: Version_Info{major = 0, minor = 30, patch = 2}
COMMONMARK_SHARED ¶
COMMONMARK_SHARED :: #config(COMMONMARK_SHARED, false)
-define:COMMONMARK_SHARED=false
Variables
This section is empty.
Procedures
consolidate_text_nodes ¶C · cmark_consolidate_text_nodesSource · cmark.odin:412
consolidate_text_nodes :: proc "c" (root: ^Node) ---
Consolidates adjacent text nodes.
free_cstring ¶
free_cstring :: proc "c" (str: cstring) {…}
free_string ¶
free_string :: proc "c" (s: string) {…}
get_default_mem_allocator ¶C · cmark_get_default_mem_allocatorSource · cmark.odin:129
get_default_mem_allocator :: proc "c" () -> (mem: ^Allocator) ---
Returns a pointer to the default memory allocator.
get_default_mem_allocator_as_odin ¶
get_default_mem_allocator_as_odin :: proc() -> runtime.Allocator {…}
iter_free ¶C · cmark_iter_freeSource · cmark.odin:260
iter_free :: proc "c" (iter: ^Iter) ---
Frees the memory allocated for an iterator.
iter_get_event_type ¶C · cmark_iter_get_event_typeSource · cmark.odin:269
iter_get_event_type :: proc "c" (iter: ^Iter) -> (event_type: Event_Type) ---
Returns the current event type.
iter_get_node ¶C · cmark_iter_get_nodeSource · cmark.odin:266
Returns the current node.
iter_get_root ¶C · cmark_iter_get_rootSource · cmark.odin:272
Returns the root node.
iter_new ¶C · cmark_iter_newSource · cmark.odin:257
Creates a new iterator starting at 'root'. The current node and event
type are undefined until iter_next is called for the first time.
The memory allocated for the iterator should be released using
'iter_free' when it is no longer needed.
iter_next ¶C · cmark_iter_nextSource · cmark.odin:263
iter_next :: proc "c" (iter: ^Iter) -> (event_type: Event_Type) ---
Advances to the next node and returns the event type (.Enter, .Exit, .Done)
iter_reset ¶C · cmark_iter_resetSource · cmark.odin:277
iter_reset :: proc "c" (iter: ^Iter, current: ^Node, event_type: Event_Type) ---
Resets the iterator so that the current node is current and
the event type is event_type. The new current node must be a
descendant of the root node or the root node itself.
markdown_to_html ¶C · cmark_markdown_to_htmlSource · cmark.odin:111
markdown_to_html :: proc "c" ( text: cstring, length: uint, options: bit_set[Option; i32], ) -> (html: cstring) ---
Convert 'text' (assumed to be a UTF-8 encoded string with length len) from CommonMark Markdown to HTML
returning a null-terminated, UTF-8-encoded string. It is the caller's responsibility
to free the returned buffer.
node_append_child ¶C · cmark_node_append_childSource · cmark.odin:409
Adds 'child' to the end of the children of node.
Returns true on success, false on failure.
node_first_child ¶C · cmark_node_first_childSource · cmark.odin:235
Returns the first child of node, or nil if node has no children.
node_free ¶C · cmark_node_freeSource · cmark.odin:220
node_free :: proc "c" (node: ^Node) ---
Frees the memory allocated for a node and any children.
node_get_end_column ¶C · cmark_node_get_end_columnSource · cmark.odin:382
Returns the column at which node ends.
node_get_end_line ¶C · cmark_node_get_end_lineSource · cmark.odin:379
Returns the line on which node ends.
node_get_fence_info ¶C · cmark_node_get_fence_infoSource · cmark.odin:334
Returns the info string from a fenced code block.
node_get_heading_level ¶C · cmark_node_get_heading_levelSource · cmark.odin:303
Returns the heading level of node, or 0 if node is not a heading.
node_get_list_delim ¶C · cmark_node_get_list_delimSource · cmark.odin:315
node_get_list_delim :: proc "c" (node: ^Node) -> (delim_type: Delim_Type) ---
Returns the list delimiter type of node, or .No_Delim if not a list.
node_get_list_start ¶C · cmark_node_get_list_startSource · cmark.odin:321
Returns starting number of node, if it is an ordered list, otherwise 0.
node_get_list_tight ¶C · cmark_node_get_list_tightSource · cmark.odin:328
Returns true if node is a tight list, false otherwise.
node_get_list_type ¶C · cmark_node_get_list_typeSource · cmark.odin:309
Returns the list type of node, or .No_List if not a list.
node_get_literal ¶C · cmark_node_get_literalSource · cmark.odin:297
Returns the string contents of node, or an empty string if none is set.
Returns nil if called on a node that does not have string content.
node_get_on_enter ¶C · cmark_node_get_on_enterSource · cmark.odin:355
Returns the literal "on enter" text for a custom node, or an empty string if no on_enter is set.
Returns nil if called on a non-custom node.
node_get_on_exit ¶C · cmark_node_get_on_exitSource · cmark.odin:365
Returns the literal "on exit" text for a custom 'node', or an empty string if no on_exit is set. Returns NULL if called on a non-custom node.
node_get_start_column ¶C · cmark_node_get_start_columnSource · cmark.odin:376
Returns the column at which node begins.
node_get_start_line ¶C · cmark_node_get_start_lineSource · cmark.odin:373
Returns the line on which node begins.
node_get_title ¶C · cmark_node_get_titleSource · cmark.odin:348
Returns the title of a link or image node, or an empty string if no title is set.
Returns nil if called on a node that is not a link or image.
node_get_type ¶C · cmark_node_get_typeSource · cmark.odin:290
Returns the type of node, or .None on error.
node_get_type_string ¶C · cmark_node_get_type_stringSource · cmark.odin:293
Like node_get_type, but returns a string representation of the type, or "<unknown>".
node_get_url ¶C · cmark_node_get_urlSource · cmark.odin:341
Returns the URL of a link or image node, or an empty string if no URL is set.
Returns nil if called on a node that is not a link or image.
node_get_user_data ¶C · cmark_node_get_user_dataSource · cmark.odin:284
Returns the user data of node.
node_insert_after ¶C · cmark_node_insert_afterSource · cmark.odin:396
Inserts 'sibling' after node. Returns true on success, false on failure.
node_insert_before ¶C · cmark_node_insert_beforeSource · cmark.odin:393
Inserts 'sibling' before node. Returns true on success, false on failure.
node_last_child ¶C · cmark_node_last_childSource · cmark.odin:238
Returns the last child of node, or nil if node has no children.
node_new ¶C · cmark_node_newSource · cmark.odin:213
Creates a new node of type 'type'. Note that the node may have other required properties, which it is the caller's responsibility to assign.
node_new_with_mem ¶C · cmark_node_new_with_memSource · cmark.odin:217
Same as node_new, but explicitly listing the memory allocator used to allocate the node.
Note: be sure to use the same allocator for every node in a tree, or bad things can happen.
node_next ¶C · cmark_node_nextSource · cmark.odin:226
Tree Traversal
Returns the next node in the sequence after node, or nil if there is none.
node_parent ¶C · cmark_node_parentSource · cmark.odin:232
Returns the parent of node, or nil if there is none.
node_prepend_child ¶C · cmark_node_prepend_childSource · cmark.odin:405
Adds 'child' to the beginning of the children of node.
Returns true on success, false on failure.
node_previous ¶C · cmark_node_previousSource · cmark.odin:229
Returns the previous node in the sequence after node, or nil if there is none.
node_replace ¶C · cmark_node_replaceSource · cmark.odin:401
Replaces 'oldnode' with 'newnode' and unlinks 'oldnode'
(but does not free its memory).
Returns true on success, false on failure.
node_set_fence_info ¶C · cmark_node_set_fence_infoSource · cmark.odin:337
Sets the info string in a fenced code block, returning true on success and false on failure.
node_set_heading_level ¶C · cmark_node_set_heading_levelSource · cmark.odin:306
Sets the heading level of node. Returns true on success, false on failure.
node_set_list_delim ¶C · cmark_node_set_list_delimSource · cmark.odin:318
node_set_list_delim :: proc "c" (node: ^Node, delim_type: Delim_Type) -> (success: b32) ---
Sets the delimiter type of node. Returns true on success, false on failure.
node_set_list_start ¶C · cmark_node_set_list_startSource · cmark.odin:325
Sets starting number of node, if it is an ordered list.
Returns true on success, false on failure.
node_set_list_tight ¶C · cmark_node_set_list_tightSource · cmark.odin:331
Sets the "tightness" of a list. Returns true on success, false on failure.
node_set_list_type ¶C · cmark_node_set_list_typeSource · cmark.odin:312
Sets the list type of node. Returns true on success, false on failure.
node_set_literal ¶C · cmark_node_set_literalSource · cmark.odin:300
Sets the string contents of node. Returns true on success, false on failure.
node_set_on_enter ¶C · cmark_node_set_on_enterSource · cmark.odin:360
Sets the literal text to render "on enter" for a custom node.
Any children of the node will be rendered after this text.
Returns true on success, falseon failure.
node_set_on_exit ¶C · cmark_node_set_on_exitSource · cmark.odin:370
Sets the literal text to render "on exit" for a custom 'node'. Any children of the node will be rendered before this text. Returns 1 on success 0 on failure.
node_set_title ¶C · cmark_node_set_titleSource · cmark.odin:351
Sets the title of a link or image node. Returns true on success, false on failure.
node_set_url ¶C · cmark_node_set_urlSource · cmark.odin:344
Sets the URL of a link or image node. Returns true on success, false on failure.
node_set_user_data ¶C · cmark_node_set_user_dataSource · cmark.odin:287
Sets arbitrary user data for node. Returns true on success, false on failure.
node_unlink ¶C · cmark_node_unlinkSource · cmark.odin:390
node_unlink :: proc "c" (node: ^Node) ---
Unlinks a node, removing it from the tree, but not freeing its memory.
(Use node_free for that.)
parse_document ¶C · cmark_parse_documentSource · cmark.odin:437
parse_document :: proc "c" ( buffer: [^]u8, len: uint, options: bit_set[Option; i32], ) -> (root: ^Node) ---
Parse a CommonMark document in 'buffer' of length 'len'. Returns a pointer to a tree of nodes. The memory allocated for the node tree should be released using 'node_free' when it is no longer needed.
parser_feed ¶C · cmark_parser_feedSource · cmark.odin:429
Feeds a string of length 'len' to 'parser'.
parser_finish ¶C · cmark_parser_finishSource · cmark.odin:432
Finish parsing and return a pointer to a tree of nodes.
parser_free ¶C · cmark_parser_freeSource · cmark.odin:426
parser_free :: proc "c" (parser: ^Parser) ---
Frees memory allocated for a parser object.
parser_new ¶C · cmark_parser_newSource · cmark.odin:420
Creates a new parser object.
parser_new_with_mem ¶C · cmark_parser_new_with_memSource · cmark.odin:423
parser_new_with_mem :: proc "c" ( options: bit_set[Option; i32], mem: ^Allocator, ) -> (parser: ^Parser) ---
Creates a new parser object with the given memory allocator.
render_commonmark ¶C · cmark_render_commonmarkSource · cmark.odin:474
render_commonmark :: proc "c" ( root: ^Node, options: bit_set[Option; i32], width: i32, ) -> (commonmark: cstring) ---
Render a node tree as a commonmark document.
It is the caller's responsibility to free the returned buffer.
render_html ¶C · cmark_render_htmlSource · cmark.odin:466
Render a node tree as an HTML fragment.
It is up to the user to add an appropriate header and footer.
It is the caller's responsibility to free the returned buffer.
render_latex ¶C · cmark_render_latexSource · cmark.odin:478
render_latex :: proc "c" ( root: ^Node, options: bit_set[Option; i32], width: i32, ) -> (latex: cstring) ---
Render a node tree as a LaTeX document.
It is the caller's responsibility to free the returned buffer.
render_man ¶C · cmark_render_manSource · cmark.odin:470
render_man :: proc "c" ( root: ^Node, options: bit_set[Option; i32], width: i32, ) -> (groff: cstring) ---
Render a node tree as a groff man page, without the header.
It is the caller's responsibility to free the returned buffer.
render_xml ¶C · cmark_render_xmlSource · cmark.odin:461
Render a node tree as XML.
It is the caller's responsibilityto free the returned buffer.
version ¶C · cmark_versionSource · cmark.odin:101
version :: proc "c" () -> (res: Version_Info) ---
version_string ¶C · cmark_version_stringSource · cmark.odin:102
version_string :: proc "c" () -> (res: cstring) ---
Procedure Groups
free ¶
free :: proc{ free_rawptr, free_cstring, }
`#config` values
- COMMONMARK_SHARED
-define:COMMONMARK_SHARED=false
Source Files
Generation Information
Generated with odin version dev-2026-10 (vendor "odin") Windows_amd64 @ 2026-10-20 23:35:00.602299800 +0000 UTC