65 lines
1.2 KiB
C
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
|