чување 796d1677fd8cb169387d75d0a5a74dd2b1480cc0
родитељ caba4ac5e3260ae223c0159745e52578d6420118
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Tue, 10 Aug 2021 09:16:12 +0200
Merge branch 'master' of git.sr.ht:~strahinja/slweb
Diffstat:
| M | TODO | | | 8 | ++++++++ |
| M | defs.h | | | 68 | +++++++++++++++++++++++++++++++++++--------------------------------- |
| M | index.html | | | 2 | +- |
| M | slweb.c | | | 102 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- |
измењених датотека: 4, додавања: 143(+), брисања: 37(-)
diff --git a/TODO b/TODO
@@ -1,6 +1,14 @@
TODO
====
+ [x] Add ~text~ -> <s>text</s>
+
+ [x] Add ~~ ->
+
+ [ ] 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 <<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*)" ";
+ 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, " ");
+ }
+
+ 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))