X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=markdown.c;h=3cbdf0db789ee9a93e48ec42ed329e24ee5f178e;hb=76cedc9066d3fd65788f86ea5d0b71db98bb6e24;hp=62aca6f9b3a881e5613060b3ab484c3ba97a3b7a;hpb=ab8e567cda085c6cc575082d175790617a3f9fa6;p=smdp.git diff --git a/markdown.c b/markdown.c index 62aca6f..3cbdf0d 100644 --- a/markdown.c +++ b/markdown.c @@ -1,132 +1,35 @@ -// needed by tmp.c to process markdown - #include +#include +#include "include/cstring.h" #include "include/markdown.h" -document_t * markdown_load(FILE *input) { - - int c, i, bits; - - document_t *doc; - page_t *page; - line_t *line; - cstring_t *text; - - doc = new_document(); - page = new_page(); - doc->page = page; - text = cstring_init(); - - while ((c = fgetc(input)) != EOF) { - if(c == '\n') { - - // markdown analyse - bits = markdown_analyse(text); - - // if text is markdown hr - if(CHECK_BIT(bits, IS_HR)) { - - // clear text - (text->reset)(text); - // create next page - page = next_page(page); - - } else { - - // if page ! has line - if(!page->line) { - - // create new line - line = new_line(); - page->line = line; - - } else { - - // create next line - line = next_line(line); - - } - - // add text to line - line->text = text; - - // add bits to line - line->bits = bits; - - // calc offset - line->offset = next_nonblank(text, 0); - } - - } else if('\t') { - - // expand tab to spaces - for (i = 0; i <= 4; i++) - (text->expand)(text, ' '); - - } else if(isprint(c) || isspace(c) || is_utf8(c)) { - - // add char to line - (text->expand)(text, c); - } - } - - //TODO detect header - - return doc; +line_t *new_line() { + line_t *x = malloc(sizeof(line_t)); + return x; } -int markdown_analyse(cstring_t *text) { - int c, i, bits, - offset, eol, - equals, hashes, stars, minus, plus, - spaces, other; - - // count leading spaces - offset = next_nonblank(text, 0); - - // IS_CODE - if(offset >= 4) { - SET_BIT(bits, IS_CODE); - return bits; - } - - // strip trailing spaces - for(eol = text->size; eol > offset && isspace(text->text[eol - 1]); eol--); - - for(i = offset; i < eol; i++) { - - switch(text->text[i]) { - case '=': equals++; break; - case '#': hashes++; break; - case '*': stars++; break; - case '-': minus++; break; - case '+': plus++; break; - case ' ': spaces++; break; - default: other++; break; - } - } - - // IS_HR - if((minus >= 3 && equals + hashes + stars + plus == 0) || - (stars >= 3 && equals + hashes + minus + plus == 0)) { - - SET_BIT(bits, IS_HR); - return bits; - } - - //TODO all the other markdown tags +line_t *next_line(line_t *prev) { + line_t *x = new_line(); + x->prev = prev; + prev->next = x; + return x; +} - return bits; +page_t *new_page() { + page_t *x = malloc(sizeof(page_t)); + return x; } -int is_utf8(char ch) { - return (ch & 0x80); +page_t *next_page(page_t *prev) { + page_t *x = new_page(); + x->prev = prev; + prev->next = x; + return x; } -int next_nonblank(cstring_t *text, int i) { - while ((i < text->size) && isspace((text->text)[i])) - ++i; - return i; -}; +document_t *new_document() { + document_t *x = malloc(sizeof(document_t)); + return x; +}