update markup and separate config into header file
This commit is contained in:
parent
d831945f5f
commit
dff5bf47a0
4 changed files with 250 additions and 52 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
inc/
|
inc/
|
||||||
old/
|
old/
|
||||||
|
config.h
|
||||||
|
|
11
build.sh
11
build.sh
|
@ -1,16 +1,21 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
# copy default config if none
|
||||||
|
if [ ! -e config.h ]; then
|
||||||
|
cp config.def.h config.h
|
||||||
|
fi
|
||||||
|
|
||||||
# Lint
|
# Lint
|
||||||
clang-format -i main.c
|
clang-format -i main.c config.h
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
rm -f ./main
|
rm -f ./main
|
||||||
|
|
||||||
# Linux(debug)
|
# Linux(debug)
|
||||||
cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wuninitialized -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined main.c -o main
|
# cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wuninitialized -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined main.c -o main
|
||||||
|
|
||||||
# Linux(fast)
|
# Linux(fast)
|
||||||
# cc main.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -o main
|
cc main.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -o main
|
||||||
|
|
||||||
# RPi
|
# RPi
|
||||||
# tcc -Wall main.c -o main
|
# tcc -Wall main.c -o main
|
||||||
|
|
22
config.def.h
Normal file
22
config.def.h
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#define NAME "nilFM"
|
||||||
|
#define DOMAIN "https://nilfm.cc"
|
||||||
|
#define LOGO "<img src='/img/nilfm_blackHole_96.png' alt='blackHole://server'/>"
|
||||||
|
#define DESC "lair of drkste aka nilix: programmer, artist, philosopher"
|
||||||
|
#define ABOUT "Derek Stevens <"\
|
||||||
|
"<a href='mailto:nilix@nilfm.cc'>nilix@nilfm.cc</a>><br/>"\
|
||||||
|
"artist, programmer, philosopher<br/><br/>"\
|
||||||
|
"verify my signature: <a href='/serv/signingKey.pub'>signing public key</a><br/>"\
|
||||||
|
"send me an encrypted message: <a href='/serv/encryptionKey.pub'>encryption public key</a>"
|
||||||
|
#define CONTACT "contact: <a href='mailto:nilix@nilfm.cc'>nilix@nilfm.cc</a> (<a href='keys.html'>keys</a>)<br/>"
|
||||||
|
#define FOOTER "<a href='/git/'><img "\
|
||||||
|
"src='/img/git.svg' alt='visit the nilFM hack lab.'/></a> "\
|
||||||
|
"<a rel='me' href='https://cafe.nilfm.cc/u/nilix'><img "\
|
||||||
|
"src='/img/honk.svg' alt='visit me on the Fediverse.'/></a> "\
|
||||||
|
"<a href='https://webring.xxiivv.com'><img "\
|
||||||
|
"src='/img/webring.svg' alt='visit the Webring.'/></a><br/>"
|
||||||
|
#define LICENSE "<a rel='license' "\
|
||||||
|
"href='https://creativecommons.org/licenses/by-nc/4.0/"\
|
||||||
|
"legalcode.txt'>CC-BY-NC 4</a>"
|
||||||
|
#define SITEROOT "../www/"
|
||||||
|
#define MAINCSS "/new.css"
|
||||||
|
#define FRONTCSS "/front.css"
|
244
main.c
244
main.c
|
@ -3,6 +3,9 @@
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2021 Derek Stevens
|
Copyright (c) 2021 Derek Stevens
|
||||||
Copyright (c) 2021 Devine Lu Linvega
|
Copyright (c) 2021 Devine Lu Linvega
|
||||||
|
@ -15,33 +18,6 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
WITH REGARD TO THIS SOFTWARE.
|
WITH REGARD TO THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* clang-format off */
|
|
||||||
|
|
||||||
#define NAME "nilFM"
|
|
||||||
#define DOMAIN "https://nilfm.cc"
|
|
||||||
#define LOGO "<img src='/img/nilfm_blackHole_96.png' alt='blackHole://server'/>"
|
|
||||||
#define DESC "lair of drkste aka nilix: programmer, artist, philosopher"
|
|
||||||
#define ABOUT "Derek Stevens <"\
|
|
||||||
"<a href='mailto:nilix@nilfm.cc'>nilix@nilfm.cc</a>><br/>"\
|
|
||||||
"artist, programmer, philosopher<br/><br/>"\
|
|
||||||
"verify my signature: <a href='/serv/signingKey.pub'>signing public key</a><br/>"\
|
|
||||||
"send me an encrypted message: <a href='/serv/encryptionKey.pub'>encryption public key</a>"
|
|
||||||
#define CONTACT "contact: <a href='mailto:nilix@nilfm.cc'>nilix@nilfm.cc</a> (<a href='keys.html'>keys</a>)<br/>"
|
|
||||||
#define FOOTER "<a href='/git/'><img "\
|
|
||||||
"src='/img/git.svg' alt='visit the nilFM hack lab.'/></a> "\
|
|
||||||
"<a rel='me' href='https://cafe.nilfm.cc/u/nilix'><img "\
|
|
||||||
"src='/img/fedi.svg' alt='visit me on the Fediverse.'/></a> "\
|
|
||||||
"<a href='https://webring.xxiivv.com'><img "\
|
|
||||||
"src='/img/webring.svg' alt='visit the Webring.'/></a><br/>"
|
|
||||||
#define LICENSE "<a rel='license' "\
|
|
||||||
"href='https://creativecommons.org/licenses/by-nc/4.0/"\
|
|
||||||
"legalcode.txt'>CC-BY-NC 4</a>"
|
|
||||||
#define SITEROOT "../www/"
|
|
||||||
#define MAINCSS "/new.css"
|
|
||||||
#define FRONTCSS "/front.css"
|
|
||||||
|
|
||||||
/* clang-format on */
|
|
||||||
|
|
||||||
struct dirent* dir;
|
struct dirent* dir;
|
||||||
|
|
||||||
typedef struct Lexicon {
|
typedef struct Lexicon {
|
||||||
|
@ -123,6 +99,7 @@ int gettwtxt(FILE* f) {
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
fclose(twtxt);
|
||||||
scat(buf, "</table><a href='/twtxt.txt'>see all</a>");
|
scat(buf, "</table><a href='/twtxt.txt'>see all</a>");
|
||||||
scat(buf, "</div>");
|
scat(buf, "</div>");
|
||||||
fputs(buf, f);
|
fputs(buf, f);
|
||||||
|
@ -283,22 +260,197 @@ int fpaudio(FILE* f, char* s) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fptemplate(FILE*, Lexicon*, char*);
|
||||||
|
int fpmetatemplate(FILE*, Lexicon*, char*);
|
||||||
|
|
||||||
|
int fppara(FILE* f, Lexicon* l, char* s) {
|
||||||
|
fputs("<p>", f);
|
||||||
|
fpmetatemplate(f, l, s);
|
||||||
|
fputs("</p>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpul(FILE* f, Lexicon* l, char* s) {
|
||||||
|
fputs("<ul>", f);
|
||||||
|
fpmetatemplate(f, l, s);
|
||||||
|
fputs("</ul>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpol(FILE* f, Lexicon* l, char* s) {
|
||||||
|
fputs("<ol>", f);
|
||||||
|
fpmetatemplate(f, l, s);
|
||||||
|
fputs("</ol>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fppublish(FILE* f, char* s) {
|
||||||
|
fputs("<div class='timestamp'>", f);
|
||||||
|
fputs(s, f);
|
||||||
|
fputs("</div>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpli(FILE* f, Lexicon* l, char* s) {
|
||||||
|
fputs("<li>", f);
|
||||||
|
fpmetatemplate(f, l, s);
|
||||||
|
fputs("</li>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fph3(FILE* f, char* s) {
|
||||||
|
fputs("<h3>", f);
|
||||||
|
fputs(s, f);
|
||||||
|
fputs("</h3>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fph4(FILE* f, char* s) {
|
||||||
|
fputs("<h4>", f);
|
||||||
|
fputs(s, f);
|
||||||
|
fputs("</h4>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpcode(FILE* f, char* s) {
|
||||||
|
fputs("<code>", f);
|
||||||
|
fputs(s, f);
|
||||||
|
fputs("</code>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpbold(FILE* f, char* s) {
|
||||||
|
fputs("<b>", f);
|
||||||
|
fputs(s, f);
|
||||||
|
fputs("</b>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpitalic(FILE* f, char* s) {
|
||||||
|
fputs("<i>", f);
|
||||||
|
fputs(s, f);
|
||||||
|
fputs("</i>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpstrike(FILE* f, char* s) {
|
||||||
|
fputs("<s>", f);
|
||||||
|
fputs(s, f);
|
||||||
|
fputs("</s>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fppre(FILE* f, char* s) {
|
||||||
|
fputs("<pre>", f);
|
||||||
|
fputs(s, f);
|
||||||
|
fputs("</pre>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpquote(FILE* f, char* s) {
|
||||||
|
fputs("<q>", f);
|
||||||
|
fputs(s, f);
|
||||||
|
fputs("</q>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpblock(FILE* f, char* s) {
|
||||||
|
fputs("<blockquote>", f);
|
||||||
|
fputs(s, f);
|
||||||
|
fputs("</blockquote>", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpmetatemplate(FILE* f, Lexicon* l, char* s) {
|
||||||
|
int bopen, bclose;
|
||||||
|
char ss[4096];
|
||||||
|
unsigned char t = 0;
|
||||||
|
bopen = 0;
|
||||||
|
bclose = 0;
|
||||||
|
|
||||||
|
while (*s) {
|
||||||
|
if (*s == '}') {
|
||||||
|
bclose++;
|
||||||
|
if (bopen == bclose) {
|
||||||
|
t = 0;
|
||||||
|
bopen = 0;
|
||||||
|
bclose = 0;
|
||||||
|
}
|
||||||
|
if (bopen == bclose) {
|
||||||
|
s++;
|
||||||
|
if (!fptemplate(f, l, ss)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*s == '{') {
|
||||||
|
bopen++;
|
||||||
|
if (bopen == 1) {
|
||||||
|
ss[0] = 0;
|
||||||
|
t = 1;
|
||||||
|
s++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (slen(s) > 4095)
|
||||||
|
return error("Templating error", "text block over 16k");
|
||||||
|
if (t) {
|
||||||
|
ccat(ss, *s);
|
||||||
|
} else
|
||||||
|
fprintf(f, "%c", *s);
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int fptemplate(FILE* f, Lexicon* l, char* s) {
|
int fptemplate(FILE* f, Lexicon* l, char* s) {
|
||||||
int target;
|
int target = 0;
|
||||||
if (s[0] == '/')
|
switch (s[0]) {
|
||||||
|
case '/':
|
||||||
return fpportal(f, l, s + 1, 1);
|
return fpportal(f, l, s + 1, 1);
|
||||||
if (s[0] == '*')
|
case '*':
|
||||||
return fphref(f, s + 1);
|
return fphref(f, s + 1);
|
||||||
if (s[0] == ':')
|
case ':':
|
||||||
return fpimg(f, s + 1);
|
return fpimg(f, s + 1);
|
||||||
if (s[0] == '?')
|
case '?':
|
||||||
return fphimg(f, s + 1);
|
return fphimg(f, s + 1);
|
||||||
if (s[0] == '_')
|
case '_':
|
||||||
return fpaudio(f, s + 1);
|
return fpaudio(f, s + 1);
|
||||||
|
case '`':
|
||||||
|
return fpcode(f, s + 1);
|
||||||
|
case '~':
|
||||||
|
return fpitalic(f, s + 1);
|
||||||
|
case '>':
|
||||||
|
return fpblock(f, s + 1);
|
||||||
|
case '\'':
|
||||||
|
return fpquote(f, s + 1);
|
||||||
|
case '$':
|
||||||
|
return fppre(f, s + 1);
|
||||||
|
case '@':
|
||||||
|
return fpbold(f, s + 1);
|
||||||
|
case '\\':
|
||||||
|
return fpstrike(f, s + 1);
|
||||||
|
case '!':
|
||||||
|
return fph3(f, s + 1);
|
||||||
|
case '.':
|
||||||
|
return fph4(f, s + 1);
|
||||||
|
case '+':
|
||||||
|
return fppublish(f, s + 1);
|
||||||
|
case '#':
|
||||||
|
return fpol(f, l, s + 1);
|
||||||
|
case ',':
|
||||||
|
return fpul(f, l, s + 1);
|
||||||
|
case '-':
|
||||||
|
return fpli(f, l, s + 1);
|
||||||
|
case '&':
|
||||||
|
return fppara(f, l, s + 1);
|
||||||
|
}
|
||||||
|
if (s[0])
|
||||||
target = findf(l, s);
|
target = findf(l, s);
|
||||||
if (target < 0)
|
if (target < 0)
|
||||||
return error("Missing link", s);
|
return error("Missing link", s);
|
||||||
fprintf(f, "<a href='%s.html' class='local'>", scsw(stlc(s), ' ', '_'));
|
fprintf(f, "<a href='./%s.html' class='local'>", scsw(stlc(s), ' ', '_'));
|
||||||
fprintf(f, "%s</a>", scsw(stlc(s), '_', ' '));
|
fprintf(f, "%s</a>", scsw(stlc(s), '_', ' '));
|
||||||
l->refs[target]++;
|
l->refs[target]++;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -306,25 +458,43 @@ int fptemplate(FILE* f, Lexicon* l, char* s) {
|
||||||
|
|
||||||
int fpinject(FILE* f, Lexicon* l, char* filepath) {
|
int fpinject(FILE* f, Lexicon* l, char* filepath) {
|
||||||
FILE* inc;
|
FILE* inc;
|
||||||
char c, s[1024];
|
int bopen, bclose;
|
||||||
|
char c, s[4096];
|
||||||
unsigned char t = 0;
|
unsigned char t = 0;
|
||||||
|
/*fprintf(stderr, "Building: %s\n", filepath);*/
|
||||||
|
bopen = 0;
|
||||||
|
bclose = 0;
|
||||||
scsw(filepath, ' ', '_');
|
scsw(filepath, ' ', '_');
|
||||||
if (!(inc = fopen(filepath, "r")))
|
if (!(inc = fopen(filepath, "r")))
|
||||||
return error("Missing include", filepath);
|
return error("Missing include", filepath);
|
||||||
s[0] = 0;
|
s[0] = 0;
|
||||||
while ((c = fgetc(inc)) != EOF) {
|
while ((c = fgetc(inc)) != EOF) {
|
||||||
if (c == '}') {
|
if (c == '}') {
|
||||||
|
bclose++;
|
||||||
|
if (bopen == bclose) {
|
||||||
t = 0;
|
t = 0;
|
||||||
if (!fptemplate(f, l, s))
|
bopen = 0;
|
||||||
|
bclose = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bopen == bclose) {
|
||||||
|
if (!fptemplate(f, l, s)) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (c == '{') {
|
if (c == '{') {
|
||||||
|
bopen++;
|
||||||
|
if (bopen == 1) {
|
||||||
|
|
||||||
s[0] = 0;
|
s[0] = 0;
|
||||||
t = 1;
|
t = 1;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (slen(s) > 1023)
|
}
|
||||||
|
if (slen(s) > 4095)
|
||||||
return error("Templating error", filepath);
|
return error("Templating error", filepath);
|
||||||
if (t)
|
if (t)
|
||||||
ccat(s, c);
|
ccat(s, c);
|
||||||
|
|
Loading…
Reference in a new issue