slw2gmi

Конвертор из slweb-а у Џемини
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 383adb0e3d58423c7e24aa0733920f9088f04417
родитељ 3f1b48893dc479c11b4d2777647f962874e68a53
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Mon, 22 Mar 2021 20:34:28 +0100

Various fixes

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
Mslw2gmi.c | 174++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
измењених датотека: 1, додавања: 119(+), брисања: 55(-)

diff --git a/slw2gmi.c b/slw2gmi.c @@ -412,7 +412,8 @@ read_csv(FILE* output, const char* filename, csv_callback_t callback); int process_heading_start(FILE* output, UBYTE heading_level) { - print_output(output, "\n"); + if (!output_firstcol) + print_output(output, "\n"); for (size_t i = 0; i < heading_level; i++) print_output(output, "#"); print_output(output, " "); @@ -426,7 +427,7 @@ process_heading(const uint8_t* token, FILE* output) if (!token || u8_strlen(token) < 1) warning(1, (uint8_t*)"Empty heading"); - print_output(output, "%s\n\n", token ? (char*)token : ""); + print_output(output, "%s\n", token ? (char*)token : ""); output_firstcol = TRUE; return 0; @@ -1600,18 +1601,9 @@ process_inline_link(uint8_t* link_text, uint8_t* link_macro_body, * link_text); */ - paralinks_count++; - if (paralinks_count > 1) - { - REALLOCARRAY(paralinks, KeyValue, paralinks_count) - pparalinks = paralinks + paralinks_count - 1; - } - pparalinks->key = u8_strdup(link_url); - pparalinks->value_size = u8_strlen(link_text)+1; - pparalinks->value = u8_strdup(link_text); - print_output(output, "%s", link_text); - output_firstcol = FALSE; + if (*link_text) + output_firstcol = FALSE; return 0; } @@ -1633,20 +1625,9 @@ process_inline_image(uint8_t* image_text, uint8_t* image_url, FILE* output, * image_url ? (char*)image_url : "", * image_text); */ - paralinks_count++; - if (paralinks_count > 1) - { - REALLOCARRAY(paralinks, KeyValue, paralinks_count) - pparalinks = paralinks + paralinks_count - 1; - } - pparalinks->key = u8_strdup(image_url); - pparalinks->value_size = u8_strlen(image_text)+1; - pparalinks->value = u8_strdup(image_text); - print_output(output, "%s ", image_text); - if (!*image_text) + if (*image_text) output_firstcol = FALSE; - return 0; } @@ -1677,7 +1658,10 @@ process_paralinks(const uint8_t* link_prefix, FILE* output) pparalink++; } if (paralinks_count > 0) + { print_output(output, "\n"); + output_firstcol = TRUE; + } free_keyvalue(&paralinks, paralinks_count); free(paralinks); @@ -1735,6 +1719,10 @@ process_line_start(uint8_t* line, const uint8_t* link_prefix, } if (!ANY(state, ST_TABLE | ST_TABLE_HEADER | ST_TABLE_LINE)) { + if (!read_yaml_macros_and_links) + print_output(output, "%s", + output_firstcol && !previous_line_blank ? "" : "\n"); + output_firstcol = TRUE; state |= ST_PARA_OPEN; } } @@ -1836,7 +1824,9 @@ process_horizontal_rule(FILE* output) /* Temporarily break paragraph as hr is para-level */ if (state & ST_PARA_OPEN) print_output(output, "\n\n"); - print_output(output, "————————————————————\n\n"); + print_output(output, "————————————————————\n"); + if (state & ST_PARA_OPEN) + print_output(output, "\n"); output_firstcol = TRUE; return 0; } @@ -2196,11 +2186,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL read_yaml_macros_and_links) if (!read_yaml_macros_and_links) { - if (state & ST_PRE) - print_output(output, "\n```\n"); - else - print_output(output, "\n```\n\n"); - output_firstcol = TRUE; + print_output(output, "```%s", (state & ST_PRE) ? "" : "\n"); + output_firstcol = !(state & ST_PRE); } /* Skip the rest of the line (language) */ @@ -3170,19 +3157,41 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL read_yaml_macros_and_links) *ptoken = 0; if (!read_yaml_macros_and_links) { - if (state & ST_LINK_SECOND_ARG) - process_inline_link(link_text, - get_value(macros, macros_count, - link_macro, NULL), - token, output); + paralinks_count++; + if (paralinks_count > 1) + { + REALLOCARRAY(paralinks, KeyValue, paralinks_count) + pparalinks = paralinks + paralinks_count - 1; + } + pparalinks->key = u8_strdup(token); + pparalinks->value_size = u8_strlen(link_text)+1; + pparalinks->value = u8_strdup(link_text); + + line_len = u8_strlen(line); + if (output_firstcol + && ((*(line+line_len-1) == ']') + || *(line+line_len-1) == ')')) + { + skip_eol = TRUE; + pline = NULL; + } else - process_inline_image(link_text, token, output, - add_image_links, add_figcaption); + { + if (state & ST_LINK_SECOND_ARG) + process_inline_link(link_text, + get_value(macros, macros_count, + link_macro, NULL), + token, output); + else + process_inline_image(link_text, token, output, + add_image_links, add_figcaption); + } } RESET_TOKEN(token, ptoken, token_size) state &= ~(ST_LINK | ST_LINK_SECOND_ARG | ST_IMAGE | ST_IMAGE_SECOND_ARG); - pline++; + if (pline) + pline++; } else CHECKCOPY(token, ptoken, token_size, pline) @@ -3246,24 +3255,74 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL read_yaml_macros_and_links) else if (state & ST_LINK_SECOND_ARG) { if (!read_yaml_macros_and_links) - process_link(link_text, - get_value(macros, macros_count, - link_macro, NULL), - token, output); + { + uint8_t* url = get_value(links, links_count, token, NULL); + paralinks_count++; + if (paralinks_count > 1) + { + REALLOCARRAY(paralinks, KeyValue, paralinks_count) + pparalinks = paralinks + paralinks_count - 1; + } + pparalinks->key = u8_strdup(url); + pparalinks->value_size = u8_strlen(link_text)+1; + pparalinks->value = u8_strdup(link_text); + + line_len = u8_strlen(line); + if (output_firstcol + && ((*(line+line_len-1) == ']') + || *(line+line_len-1) == ')')) + { + skip_eol = TRUE; + pline = NULL; + } + else + process_link(link_text, + get_value(macros, macros_count, + link_macro, NULL), + token, output); + } RESET_TOKEN(token, ptoken, token_size) state &= ~(ST_LINK | ST_LINK_SECOND_ARG); - pline++; - colno++; + if (pline) + { + pline++; + colno++; + } } else if (state & ST_IMAGE_SECOND_ARG) { if (!read_yaml_macros_and_links) - process_image(link_text, token, output, - add_image_links, add_figcaption); + { + uint8_t* url = get_value(links, links_count, token, NULL); + paralinks_count++; + if (paralinks_count > 1) + { + REALLOCARRAY(paralinks, KeyValue, paralinks_count) + pparalinks = paralinks + paralinks_count - 1; + } + pparalinks->key = u8_strdup(url); + pparalinks->value_size = u8_strlen(link_text)+1; + pparalinks->value = u8_strdup(link_text); + + line_len = u8_strlen(line); + if (output_firstcol + && ((*(line+line_len-1) == ']') + || *(line+line_len-1) == ')')) + { + skip_eol = TRUE; + pline = NULL; + } + else + process_image(link_text, token, output, + add_image_links, add_figcaption); + } RESET_TOKEN(token, ptoken, token_size) state &= ~(ST_IMAGE | ST_IMAGE_SECOND_ARG); - pline++; - colno++; + if (pline) + { + pline++; + colno++; + } } else if (u8_strlen(pline) > 1) { @@ -3682,8 +3741,8 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL read_yaml_macros_and_links) if (!read_yaml_macros_and_links) { print_output(output, "%s\n", - (line_len == 0) || output_firstcol - || previous_line_blank + ((line_len == 0) || previous_line_blank) + && output_firstcol ? "" : "\n"); output_firstcol = TRUE; process_paralinks(link_prefix, output); @@ -3774,13 +3833,14 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL read_yaml_macros_and_links) } if (!skip_eol && !keep_token && !read_yaml_macros_and_links - && line_len > 0 - && !output_firstcol + /*&& line_len > 0*/ + /*&& !output_firstcol*/ && !ANY(state, ST_YAML | ST_YAML_VAL | ST_LINK_SECOND_ARG | ST_LINK_SECOND_ARG_END)) { - print_output(output, "%s", state & ST_PRE ? "\n" : " "); - output_firstcol = state & ST_PRE; + print_output(output, "%s", state & ST_PRE ? "\n" + : (output_firstcol ? "" : " ")); + output_firstcol = (state & ST_PRE) || output_firstcol; } if (!keep_token) @@ -3792,7 +3852,11 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL read_yaml_macros_and_links) skip_change_first_line_in_doc = FALSE; if (line_len == 0) + { + process_paralinks(link_prefix, output); + output_firstcol = TRUE; previous_line_blank = TRUE; + } /* Lasts until the end of line */ state &= ~(ST_YAML_VAL | ST_IMAGE_SECOND_ARG | ST_LINK_SECOND_ARG