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;
+ }
}
}