slw2gmi

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

чување c1578ad94181345aee4454ea8a2338690d1c134d
родитељ 368c8bbba07fc774b3e459324054f3e67ed93431
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Tue, 10 Aug 2021 09:38:26 +0200

Reflecting changes in slweb: added ~ and ~~ processing, distinguish [(Some text)](link) from [Some (text)](link)

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

Diffstat:
Mdefs.h | 68+++++++++++++++++++++++++++++++++++---------------------------------
Mslw2gmi.c | 120++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
измењених датотека: 2, додавања: 136(+), брисања: 52(-)

diff --git a/defs.h b/defs.h @@ -62,8 +62,9 @@ typedef enum TRUE = 1 } BOOL; -typedef unsigned char UBYTE; -typedef unsigned long ULONG; +typedef unsigned char UBYTE; +typedef unsigned long ULONG; +typedef unsigned long long ULLONG; typedef enum { @@ -94,37 +95,38 @@ typedef int (*csv_callback_t)(FILE* output, uint8_t** csv_header, uint8_t** csv_ #define ST_NONE 0 #define ST_YAML 1 -#define ST_YAML_VAL (1 << 1) -#define ST_PARA_OPEN (1 << 2) -#define ST_TAG (1 << 3) -#define ST_HEADING (1 << 4) -#define ST_HEADING_TEXT (1 << 5) -#define ST_BOLD (1 << 6) -#define ST_ITALIC (1 << 7) -#define ST_PRE (1 << 8) -#define ST_CODE (1 << 9) -#define ST_BLOCKQUOTE (1 << 10) -#define ST_LINK (1 << 11) -#define ST_LINK_SECOND_ARG (1 << 12) -#define ST_LINK_SECOND_ARG_END (1 << 13) -#define ST_LINK_SPAN (1 << 14) -#define ST_LINK_MACRO (1 << 15) -#define ST_IMAGE (1 << 16) -#define ST_IMAGE_SECOND_ARG (1 << 17) -#define ST_MACRO_BODY (1 << 18) -#define ST_CSV_BODY (1 << 19) -#define ST_HTML_TAG (1 << 20) -#define ST_KBD (1 << 21) -#define ST_LIST (1 << 22) -#define ST_NUMLIST (1 << 23) -#define ST_FOOTNOTE (1 << 24) -#define ST_FOOTNOTE_TEXT (1 << 25) -#define ST_INLINE_FOOTNOTE (1 << 26) -#define ST_FORMULA (1 << 27) -#define ST_DISPLAY_FORMULA (1 << 28) -#define ST_TABLE_HEADER (1 << 29) -#define ST_TABLE_LINE (1 << 30) -#define ST_TABLE (1 << 31) +#define ST_YAML_VAL ((ULLONG)1 << 1) +#define ST_PARA_OPEN ((ULLONG)1 << 2) +#define ST_TAG ((ULLONG)1 << 3) +#define ST_HEADING ((ULLONG)1 << 4) +#define ST_HEADING_TEXT ((ULLONG)1 << 5) +#define ST_BOLD ((ULLONG)1 << 6) +#define ST_ITALIC ((ULLONG)1 << 7) +#define ST_PRE ((ULLONG)1 << 8) +#define ST_CODE ((ULLONG)1 << 9) +#define ST_BLOCKQUOTE ((ULLONG)1 << 10) +#define ST_LINK ((ULLONG)1 << 11) +#define ST_LINK_SECOND_ARG ((ULLONG)1 << 12) +#define ST_LINK_SECOND_ARG_END ((ULLONG)1 << 13) +#define ST_LINK_SPAN ((ULLONG)1 << 14) +#define ST_LINK_MACRO ((ULLONG)1 << 15) +#define ST_IMAGE ((ULLONG)1 << 16) +#define ST_IMAGE_SECOND_ARG ((ULLONG)1 << 17) +#define ST_MACRO_BODY ((ULLONG)1 << 18) +#define ST_CSV_BODY ((ULLONG)1 << 19) +#define ST_HTML_TAG ((ULLONG)1 << 20) +#define ST_KBD ((ULLONG)1 << 21) +#define ST_LIST ((ULLONG)1 << 22) +#define ST_NUMLIST ((ULLONG)1 << 23) +#define ST_FOOTNOTE ((ULLONG)1 << 24) +#define ST_FOOTNOTE_TEXT ((ULLONG)1 << 25) +#define ST_INLINE_FOOTNOTE ((ULLONG)1 << 26) +#define ST_FORMULA ((ULLONG)1 << 27) +#define ST_DISPLAY_FORMULA ((ULLONG)1 << 28) +#define ST_TABLE_HEADER ((ULLONG)1 << 29) +#define ST_TABLE_LINE ((ULLONG)1 << 30) +#define ST_TABLE ((ULLONG)1 << 31) +#define ST_STRIKE ((ULLONG)1 << 32) #define ST_CS_NONE 0 #define ST_CS_HEADER 1 diff --git a/slw2gmi.c b/slw2gmi.c @@ -1500,6 +1500,13 @@ process_kbd(FILE* output, BOOL end_tag) } int +process_strike(FILE* output, BOOL end_tag) +{ + print_output(output, "~"); + return 0; +} + +int process_table_start(FILE* output) { return 0; @@ -2158,6 +2165,94 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL read_yaml_macros_and_links) } break; + case '~': + if (ANY(state, ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA + | ST_HTML_TAG | ST_IMAGE | ST_LINK_SECOND_ARG + | ST_LINK_SECOND_ARG_END | ST_MACRO_BODY + | ST_PRE | ST_TAG | ST_YAML)) + { + CHECKCOPY(token, ptoken, token_size, pline) + colno++; + break; + } + + if (u8_strlen(pline) > 1 && *(pline+1) == '~') + { + /* Handle ~~ within footnotes, headings and link text specially */ + if (ANY(state, ST_INLINE_FOOTNOTE | ST_HEADING + | ST_FOOTNOTE_TEXT | ST_LINK)) + { + uint8_t* entity = (uint8_t*)" "; + size_t entity_len = u8_strlen(entity); + size_t token_len = 0; + + *ptoken = 0; + token_len = u8_strlen(token); + + if (token_len + entity_len < BUFSIZE) + { + u8_strncat(token, entity, BUFSIZE-token_len-1); + ptoken += entity_len; + } + } + else + { + /* Output existing text up to ~~ */ + process_text_token(line, link_prefix, first_line_in_doc, + previous_line_blank, processed_start_of_line, + skip_eol, read_yaml_macros_and_links, list_para, + output, &token, &ptoken, &token_size, TRUE); + processed_start_of_line = TRUE; + + if (!read_yaml_macros_and_links + && !(ANY(state, ST_PRE | ST_CODE | ST_HEADING))) + print_output(output, " "); + } + + pline += 2; + colno += 2; + } + else + { + /* Handle ~ within footnotes, headings and link text specially */ + if (ANY(state, ST_INLINE_FOOTNOTE | ST_HEADING + | ST_FOOTNOTE_TEXT | ST_LINK)) + { + uint8_t* tag = state & ST_STRIKE + ? (uint8_t*)"~" + : (uint8_t*)"~"; + size_t tag_len = u8_strlen(tag); + size_t token_len = 0; + + *ptoken = 0; + token_len = u8_strlen(token); + + if (token_len + tag_len < BUFSIZE) + { + u8_strncat(token, tag, BUFSIZE-token_len-1); + ptoken += tag_len; + } + } + else + { + /* Output existing text up to ~ */ + process_text_token(line, link_prefix, first_line_in_doc, + previous_line_blank, processed_start_of_line, + skip_eol, read_yaml_macros_and_links, list_para, + output, &token, &ptoken, &token_size, TRUE); + processed_start_of_line = TRUE; + + if (!read_yaml_macros_and_links + && !(ANY(state, ST_PRE | ST_CODE | ST_HEADING))) + process_strike(output, state & ST_STRIKE); + } + + state ^= ST_STRIKE; + pline++; + colno++; + } + break; + case '`': if (ANY(state, ST_DISPLAY_FORMULA | ST_FORMULA | ST_IMAGE | ST_MACRO_BODY)) @@ -3033,28 +3128,15 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL read_yaml_macros_and_links) *link_macro = 0; pline++; colno++; - break; - case '(': - if (ANY(state, ST_CODE | ST_DISPLAY_FORMULA | ST_FORMULA - | ST_FOOTNOTE_TEXT | ST_HEADING - | ST_INLINE_FOOTNOTE | ST_LINK_SECOND_ARG_END - | ST_MACRO_BODY | ST_PRE)) - CHECKCOPY(token, ptoken, token_size, pline) - else if (state & ST_HTML_TAG) - { - pline++; - colno++; - break; - } - else if (state & ST_LINK) - { + if (*pline == '(') + { + *ptoken = 0; state |= ST_LINK_SPAN; pline++; - } - else - CHECKCOPY(token, ptoken, token_size, pline) - colno++; + colno++; + } + break; case ')':