slweb

Једноставни генератор статичких веб страна
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 796d1677fd8cb169387d75d0a5a74dd2b1480cc0
родитељ caba4ac5e3260ae223c0159745e52578d6420118
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Tue, 10 Aug 2021 09:16:12 +0200

Merge branch 'master' of git.sr.ht:~strahinja/slweb

Diffstat:
MTODO | 8++++++++
Mdefs.h | 68+++++++++++++++++++++++++++++++++++---------------------------------
Mindex.html | 2+-
Mslweb.c | 102++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
измењених датотека: 4, додавања: 143(+), брисања: 37(-)

diff --git a/TODO b/TODO @@ -1,6 +1,14 @@ TODO ==== + [x] Add ~text~ -> <s>text</s> + + [x] Add ~~ -> &nbsp; + + [ ] Distinguish between [(Some text)][somelink] and + [Some (text)][somelink] - the latter should not output + <span></span>, just retain the parentheses instead + [ ] Remove libunistring as a dependency < > Remove realpath as a dependency? diff --git a/defs.h b/defs.h @@ -66,8 +66,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 { @@ -98,37 +99,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/index.html b/index.html @@ -153,7 +153,7 @@ this program. If not, see &lt;<a href="https://www.gnu.org/licenses">https://www <div id="git-log"> Previous commit: -index.slw 8766243 2021-07-19 15:05:51 +0200 (Страхиња Радић) (HEAD -> master, origin/master, origin/HEAD) +index.slw 0e0f560 2021-08-09 21:54:48 +0200 (Страхиња Радић) (HEAD -> master, origin/master, origin/HEAD) </div><!--git-log--> diff --git a/slweb.c b/slweb.c @@ -49,7 +49,7 @@ static uint8_t* csv_template = NULL; static size_t csv_template_size = 0; static char* csv_filename = NULL; static long csv_iter = 0; -static ULONG state = ST_NONE; +static ULLONG state = ST_NONE; #define CHECKEXITNOMEM(ptr) { if (!ptr) exit(error(ENOMEM, \ (uint8_t*)"Memory allocation failed (out of memory?)")); } @@ -903,7 +903,7 @@ process_include(uint8_t* token, FILE* output, BOOL read_yaml_macros_and_links) uint8_t* buffer = NULL; size_t buffer_size = 0; int result = 0; - ULONG saved_state = ST_NONE; + ULLONG saved_state = ST_NONE; read_file_into_buffer(&buffer, &buffer_size, input_filename, &input_dirname, &input); @@ -1121,7 +1121,7 @@ process_incdir_subdir(const char* subdirname, const uint8_t* link_prefix, uint8_t* buffer = NULL; size_t buffer_size = 0; int result = 0; - ULONG saved_state = ST_NONE; + ULLONG saved_state = ST_NONE; read_file_into_buffer(&buffer, &buffer_size, input_filename, &input_dirname, &input); @@ -1559,6 +1559,13 @@ process_kbd(FILE* output, BOOL end_tag) } int +process_strike(FILE* output, BOOL end_tag) +{ + print_output(output, "<%ss>", end_tag ? "/" : ""); + return 0; +} + +int process_table_start(FILE* output) { print_output(output, "<table>\n" @@ -2353,6 +2360,95 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only, } 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* tag = (uint8_t*)"&nbsp;"; + 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, + 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, "&nbsp;"); + } + + 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*)"</s>" + : (uint8_t*)"<s>"; + 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, + 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))