#include #include "bstrlib.h" #include "uthash.h" #define VERSION "0.1" #define CODE_INDENT 4 typedef struct Inline { enum { str, softbreak, linebreak, code, raw_html, entity, emph, strong, link, image } tag; union { bstring literal; struct Inline* inlines; struct { struct Inline* label; bstring url; bstring title; } linkable; } content; struct Inline* next; } inl; typedef struct Reference { bstring label; bstring url; bstring title; UT_hash_handle hh; // used by uthash } reference; typedef struct Subject { bstring buffer; int pos; reference** reference_map; int label_nestlevel; } subject; // Types for blocks struct ListData { enum { bullet, ordered } list_type; int marker_offset; int padding; int start; enum { period, parens } delimiter; unsigned char bullet_char; bool tight; }; struct FencedCodeData { int fence_length; int fence_offset; char fence_char; bstring info; }; typedef struct Block { enum { document, block_quote, list, list_item, fenced_code, indented_code, html_block, paragraph, atx_header, setext_header, hrule, reference_def } tag; int start_line; int start_column; int end_line; bool open; bool last_line_blank; struct Block* children; struct Block* last_child; struct Block* parent; struct Block* top; bstring string_content; inl* inline_content; union { struct ListData list_data; struct FencedCodeData fenced_code_data; int header_level; reference** refmap; } attributes; struct Block * next; struct Block * prev; } block; int parse_inline(subject* subj, inl ** last); inl* parse_inlines(bstring input, reference** refmap); inl* parse_inlines_while(subject* subj, int (*f)(subject*)); void free_inlines(inl* e); int parse_reference(bstring input, reference** refmap); void free_reference(reference *ref); void free_reference_map(reference **refmap); reference* make_reference(bstring label, bstring url, bstring title); reference* lookup_reference(reference** refmap, bstring label); void add_reference(reference** refmap, reference* ref); int unescape(bstring s); extern block* make_document(); extern block* add_child(block* parent, int block_type, int start_line, int start_column); void free_blocks(block* e); // FOR NOW: int process_inlines(block* cur, reference** refmap); int incorporate_line(bstring ln, int line_number, block** curptr); int finalize(block* b, int line_number); void print_inlines(inl* ils, int indent); void print_blocks(block* blk, int indent); int blocks_to_html(block* b, bstring* result, bool tight); int inlines_to_html(inl* b, bstring* result); int bdetab(bstring s, int utf8);