чување 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:
| M | defs.h | | | 68 | +++++++++++++++++++++++++++++++++++--------------------------------- |
| M | slw2gmi.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 ')':