чување 3ab244557b38726b4c564976a9f919b900278297
родитељ 788b45f7ff6d74dbbe2fe137838dacbef8bae703
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Mon, 25 Jan 2021 21:07:42 +0100
Corrected math special character escaping and handling of Unicode for katex
Signed-off-by: Страхиња Радић <contact@strahinja.org>
Diffstat:
| M | index.html | | | 2 | +- |
| M | slweb.c | | | 94 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------- |
измењених датотека: 2, додавања: 79(+), брисања: 17(-)
diff --git a/index.html b/index.html
@@ -136,7 +136,7 @@ this program. If not, see <<a href="https://www.gnu.org/licenses">https://www
<div id="git-log">
Previous commit:
-index.slw a929ede 2021-01-25 07:01:26 +0100 (Страхиња Радић) (HEAD -> master, origin/master, origin/HEAD)
+index.slw 788b45f 2021-01-25 12:46:17 +0100 (Страхиња Радић) (HEAD -> master, origin/master, origin/HEAD)
</div><!--git-log-->
diff --git a/slweb.c b/slweb.c
@@ -624,8 +624,8 @@ process_include(uint8_t* token, FILE* output, BOOL read_yaml_macros_and_links)
if (!input_filename)
return warning(1, (uint8_t*)"Cannot use 'include' in stdin");
- uint8_t* ptoken = u8_strchr(token, (ucs4_t)' ');
- char* include_filename = NULL;
+ uint8_t* ptoken = u8_strchr(token, (ucs4_t)' ');
+ char* include_filename = NULL;
char* pinclude_filename = NULL;
if (!ptoken)
@@ -784,7 +784,7 @@ filter_slw(const struct dirent* node)
return 0;
size_t node_len = strlen(node->d_name);
- size_t slw_len = strlen(".slw");
+ size_t slw_len = strlen(".slw");
if (slw_len >= node_len)
return 0;
@@ -920,16 +920,16 @@ process_incdir(uint8_t* token, FILE* output, BOOL read_yaml_macros_and_links)
if (read_yaml_macros_and_links)
return 0;
- uint8_t* saveptr = NULL;
+ uint8_t* saveptr = NULL;
/* skipping the first token (incdir) */
- uint8_t* arg = u8_strtok(token, (uint8_t*)" ", &saveptr);
- size_t arg_len = 0;
- long num = 5;
- uint8_t* macro_body = NULL;
+ uint8_t* arg = u8_strtok(token, (uint8_t*)" ", &saveptr);
+ size_t arg_len = 0;
+ long num = 5;
+ uint8_t* macro_body = NULL;
struct dirent** namelist;
struct dirent** pnamelist;
long names_output;
- BOOL details_open = TRUE;
+ BOOL details_open = TRUE;
arg = u8_strtok(NULL, (uint8_t*)" ", &saveptr);
@@ -1464,13 +1464,59 @@ process_text_token(uint8_t* line, BOOL first_line_in_doc,
int
process_formula(FILE* output, uint8_t* token, BOOL display_formula)
{
- uint8_t* command = NULL;
- int result = 0;
+ uint8_t* command = NULL;
+ uint8_t* new_token = NULL;
+ uint8_t* pnew_token = NULL;
+ uint8_t* ptoken = NULL;
+ size_t new_token_size = 0;
+ int result = 0;
+
CALLOC(command, uint8_t, BUFSIZE)
+ new_token_size = BUFSIZE;
+ CALLOC(new_token, uint8_t, new_token_size)
+ ptoken = token;
+ pnew_token = new_token;
- u8_snprintf(command, BUFSIZE-1, "katex %s<<<'%s'",
+ while (ptoken && *ptoken)
+ {
+ switch (*ptoken)
+ {
+ case '\\':
+ if (ptoken - token + 2 > new_token_size)
+ {
+ new_token_size += BUFSIZE;
+ REALLOC(new_token, new_token_size)
+ }
+ *pnew_token++ = '\\';
+ *pnew_token++ = *ptoken++;
+ break;
+
+ case '%':
+ ptoken++;
+ break;
+
+ case '"':
+ if (ptoken - token + 2 > new_token_size)
+ {
+ new_token_size += BUFSIZE;
+ REALLOC(new_token, new_token_size)
+ }
+ *pnew_token = 0;
+ u8_strncat(pnew_token, (uint8_t*)"\\",
+ new_token_size-u8_strlen(new_token)-1);
+ pnew_token++;
+ *pnew_token++ = *ptoken++;
+ break;
+ default:
+ *pnew_token++ = *ptoken++;
+ }
+ }
+
+ *pnew_token = 0;
+
+ snprintf((char*)command, BUFSIZE-1, "katex %s<<<\"%s\"",
display_formula ? "-d " : "",
- token);
+ new_token);
result = print_command(command, output, TRUE);
if (result)
@@ -1479,6 +1525,7 @@ process_formula(FILE* output, uint8_t* token, BOOL display_formula)
token,
display_formula ? "$" : "");
+ free(new_token);
free(command);
return result;
}
@@ -2738,8 +2785,9 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
break;
case '\\':
- if (state & (ST_DISPLAY_FORMULA | ST_FORMULA | ST_HTML_TAG
- | ST_MACRO_BODY))
+ *ptoken = 0;
+ if (state & (ST_DISPLAY_FORMULA | ST_FORMULA
+ | ST_HTML_TAG | ST_MACRO_BODY))
{
CHECKCOPY(token, ptoken, token_size, pline)
colno++;
@@ -2861,7 +2909,21 @@ slweb_parse(uint8_t* buffer, FILE* output, BOOL body_only,
CALLOC(pvars->value, uint8_t, pvars->value_size)
u8_strncpy(pvars->value, token, pvars->value_size-1);
}
- else if (!(state & (ST_DISPLAY_FORMULA | ST_FORMULA)))
+ else if (state & (ST_DISPLAY_FORMULA | ST_FORMULA))
+ {
+ size_t token_len = u8_strlen(token);
+
+ if (ptoken - token + 1 > token_size)
+ {
+ token_size += BUFSIZE;
+ REALLOC(token, token_size)
+ }
+ u8_strncat(token, (uint8_t*)" ",
+ token_size - token_len - 1);
+ ptoken++;
+ *ptoken = 0;
+ }
+ else
{
if (*token)
{