mrk/include/mrk/ast.h

65 lines
1.2 KiB
C

#ifndef MRK_AST
#define MRK_AST
#include <stdbool.h>
#include <stdlib.h>
#include "mrk/common.h"
typedef enum mrk_ast_node_type {
mrk_ast_node_type_none = 0,
mrk_ast_node_type_header,
mrk_ast_node_type_text,
mrk_ast_node_type_space,
mrk_ast_node_type_link,
mrk_ast_node_type_paragraph,
mrk_ast_node_type_list,
mrk_ast_node_type_list_item,
mrk_ast_node_type_code,
} mrk_ast_node_type;
typedef struct mrk_ast_node {
struct {
struct mrk_ast_node **arr;
size_t len;
} children;
mrk_ast_node_type type;
union {
struct {
size_t depth;
} header;
struct {
size_t start;
size_t end;
} text;
struct {
size_t url_start;
size_t url_end;
} link;
struct {
bool ordered;
} list;
struct {
bool checkbox;
bool checked;
} list_item;
} d;
} mrk_ast_node;
/**
* Initialize a new AST node struct.
*/
mrk_err mrk_ast_node_init(mrk_ast_node **out);
/**
* Allocate a new empty child node and return a pointer to it.
*/
mrk_err mrk_ast_node_child_append(mrk_ast_node **out, mrk_ast_node *parent);
/**
* Output the AST as valid HTML
*/
mrk_err mrk_ast_to_html(char **out, const char *orig, mrk_ast_node *root);
#endif