simple markdown-like syntax - grimoire - dark wiki & knowledge base
 (HTM) git clone git@git.drkhsh.at/codex.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 5a1657f9c588c47e0f9b4e02e22d2bbd6fbd93e7
 (DIR) parent 85551851d320c48668458cbef2783785bfd031c0
 (HTM) Author: drkhsh <me@drkhsh.at>
       Date:   Thu, 24 Jul 2025 01:32:12 +0200
       
       simple markdown-like syntax
       
       Diffstat:
         M src/main.c                          |     100 ++++++++++++++++++++++++++++++-
       
       1 file changed, 97 insertions(+), 3 deletions(-)
       ---
 (DIR) diff --git a/src/main.c b/src/main.c
       @@ -508,13 +508,107 @@ fptemplate(FILE *f, Glossary *glo, Lexicon *lex, Term *t, char *s)
                }
        }
        
       +void fptag(FILE *f, Glossary *glo, Lexicon *lex, Term *t, char *string) {
       +        int i = 0, len, split = 0;
       +        char s[2048], buf[2048 * 2], before[512], text[512], after[512], row[1024], cell[512];
       +        sprintf(s, "%s", string);
       +        len = slen(s);
       +        for(i = 0; i < len; i++) {
       +                char c = s[i];
       +                if(c == '*' || c == '~' || c == '`') {
       +                        if((i < len && buf[i + 1] == '`') || (i > 0 && buf[i - 1] == '`')) continue;
       +                        sstr(s, before, 0, i);
       +                        sstr(s, buf, i + 1, len - i + 1);
       +                        split = scin(buf, c);
       +                        if(split == -1) continue;
       +                        sstr(buf, text, 0, split);
       +                        sstr(buf, after, split + 1, slen(buf) - split - 1);
       +                        if(c == '*') sprintf(s, "%s<b>%s</b>%s", before, text, after);
       +                        if(c == '~') sprintf(s, "%s<i>%s</i>%s", before, text, after);
       +                        if(c == '`') sprintf(s, "%s<code>%s</code>%s", before, text, after);
       +                        len = slen(s);
       +                }
       +        }
       +        if(s[0] == '#') {
       +                buf[0] = '\0';
       +                i = 0;
       +                while(s[i] == '#') i++;
       +                if(s[i] == ' ') sprintf(buf, "<h%d id=\"%s\">%s</h%d>\n", i, sstr(s, s, i + 1, len), s, i);
       +        } else if(s[0] == '"') {
       +                sprintf(buf, "<p><quote>%s</quote></p>\n", s);
       +        } else if(s[0] == '|' && s[len - 1] == '|') {
       +                row[0] = '\0';
       +                sstr(s, s, 1, slen(s) - 1);
       +                split = scin(s, '|');
       +                while(split != -1) {
       +                        sprintf(cell, "\t<td>%s</td>\n", strm(sstr(s, buf, 1, split - 2)));
       +                        scat(row, cell);
       +                        sstr(s, s, split + 1, slen(s) - 2);
       +                        split = scin(s, '|');
       +                }
       +                sprintf(buf, "<tr>\n%s</tr>\n", row);
       +        } else if(s[0] == '-' && s[1] == ' ') {
       +                sprintf(buf, "<cite>%s</cite>\n", s);
       +        } else if(s[0] == '+' && s[1] == ' ') {
       +                sprintf(buf, "<li>%s</li>\n", sstr(s, s, 2, len - 1));
       +        } else if(s[0] == '>' && s[1] == ' ') {
       +                sprintf(buf, "<pre>%s</pre>\n", sstr(s, s, 2, len - 1));
       +        } else if(s[0] != '{' && s[0] != '<') {
       +                sprintf(buf, "<p>%s</p>\n", s);
       +        } else {
       +                sprintf(buf, "%s\n", s);
       +        }
       +        fptemplate(f, glo, lex, t, buf);
       +}
       +
        static void
        fpbodypart(FILE *f, Glossary *glo, Lexicon *lex, Term *t)
        {
       -        int i;
       +        int i, list = 0, table = 0, code = 0, formatcode = 1, len;
                for(i = 0; i < t->body_len; ++i) {
       -                fptemplate(f, glo, lex, t, t->body[i]);
       -                fprintf(f, "\n");
       +                char *line = t->body[i];
       +                len = slen(line);
       +                if(line[0] == '+' && line[1] == ' ' && f && formatcode) {
       +                        if(!list) {
       +                                fputs("<ul>\n", f);
       +                                list = 1;
       +                        }
       +                } else if(list) {
       +                        fputs("</ul>\n", f);
       +                        list = 0;
       +                }
       +                if(line[0] == '|' && line[len - 1] == '|' && f && formatcode) {
       +                        if(!table) {
       +                                fputs("<table>\n", f);
       +                                table = 1;
       +                        }
       +                } else if(table) {
       +                        fputs("</table>\n", f);
       +                        table = 0;
       +                }
       +                if(line[0] == '`' && line[1] == '`' && f && len < 4) {
       +                        if(line[2] == '`')
       +                                formatcode = !formatcode;
       +                        if(!code) {
       +                                fputs("<pre>\n", f);
       +                                code = 1;
       +                        } else {
       +                                fputs("</pre>\n", f);
       +                                code = 0;
       +                        }
       +                        continue;
       +                }
       +                if(formatcode) fptag(f, glo, lex, t, line);
       +                else {
       +                        fptemplate(f, glo, lex, t, line);
       +                        fputs("\n", f);
       +                }
       +                if(i == t->body_len - 1 && list && f) fputs("</ul>\n", f);
       +                if(i == t->body_len - 1 && table && f) fputs("</table>\n", f);
       +                if(i == t->body_len - 1 && code && f) {
       +                        fputs("</pre>\n", f);
       +                        continue;
       +                }
                }
        }