summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwrmr2025-05-21 20:42:12 -0500
committerwrmr2025-05-21 20:42:12 -0500
commit75d2d764b74763ee0acfd690ec0fd64360402087 (patch)
treeb9d2da89f67980c158eb5563eedaa0b067c27234
parentd81f9712ebb68a197e8febcbcc2b08af9fc3cdc7 (diff)
add -H -F / --header --footer options
-rw-r--r--main.c42
1 files changed, 39 insertions, 3 deletions
diff --git a/main.c b/main.c
index 27746d6..7830adf 100644
--- a/main.c
+++ b/main.c
@@ -24,6 +24,7 @@ typedef struct {
Str title;
int hvarc;
Str docroot;
+ Str header_file, footer_file;
} Options;
Options opts = { 0 };
@@ -550,12 +551,13 @@ int hvar_calc(Str param, Str *name, Str *val, Str filename) {
void usage(const char *cmd) {
fprintf(stderr, "usage: %s -?\n"
- " %s [-silq] [-L LANG] [-c FILE] [-t TITLE] [-h NAME:ARG1[,ARG2,ARG3...]] [FILES...]\n"
+ " %s [OPTIONS] [FILES...]\n"
"\n"
" -? --help show this help text\n"
" -s --standalone prefix with html metadata\n"
" -h --hvar define a css variable (--name) with a random value,\n"
" selected by a hash of the document's title\n"
+ " (format: NAME:ARG1[,ARG2,ARG3...])\n"
" -c --css embed the given file within a <style> element\n"
" -l --link when combined with --css, link to an external stylehseet\n"
" instead of reading from a file locally\n"
@@ -563,6 +565,8 @@ void usage(const char *cmd) {
" -q --smartq enable smart quotes\n"
" -t --title set the document title (does nothing without --standalone)\n"
" -R --root set a root url prepended to absolute paths\n"
+ " -H --header prepend the given file before the document\n"
+ " -F --footer append the given file after the document\n"
" -L --lang set the document's language\n",
cmd, cmd);
}
@@ -639,6 +643,26 @@ Str html_tail(Arena *m, Arena *l) {
return h;
}
+void put_file(Str filename, Arena *scratch) {
+ Arena t = *scratch;
+ const char *path = str_to_cstr(filename, scratch);
+ FILE *f = fopen(path, "r/o");
+ if (!f) {
+ fprintf(stderr, "failed to open file %s: %s\n", path,
+ strerror(errno));
+ return;
+ }
+ Str buf;
+ if (read_all(f, &buf, scratch)) {
+ fprintf(stderr, "failed to read file %s: %s\n", path,
+ strerror(errno));
+ return;
+ }
+ str_put(buf);
+ fclose(f);
+ *scratch = t;
+}
+
#define countof(x) (sizeof(x) / sizeof(*x))
int main(int argc, const char **argv) {
(void)argc;
@@ -653,7 +677,7 @@ int main(int argc, const char **argv) {
Str param = { 0 };
opts.from_stdin = 1;
- while ((r = arg_get(&a, "?sliqc:h:t:L:R:", &param,
+ while ((r = arg_get(&a, "?sliqc:h:t:L:R:H:F:", &param,
"help", '?',
"standalone", 's',
"smartq", 'q',
@@ -663,7 +687,9 @@ int main(int argc, const char **argv) {
"link", 'l',
"lang", 'L',
"root", 'R',
- ":hvar", 'h')) >= ARG_OK) {
+ ":hvar", 'h',
+ "header", 'H',
+ "footer", 'F')) >= ARG_OK) {
Arena reset = scratch;
FILE *f;
switch (r) {
@@ -701,6 +727,12 @@ int main(int argc, const char **argv) {
}
opts.hvarv[opts.hvarc++] = param;
break;
+ case 'H':
+ opts.header_file = param;
+ break;
+ case 'F':
+ opts.footer_file = param;
+ break;
default:
if (str_eql(param, S("-"))) {
if (wdoc(stdin, &doc, &perm, &scratch)) {
@@ -757,11 +789,15 @@ int main(int argc, const char **argv) {
str_put(S("\n"));
}
+ if (opts.header_file.n) put_file(opts.header_file, &scratch);
+
while (doc) {
str_put(doc->html);
doc = doc->next;
}
+ if (opts.footer_file.n) put_file(opts.footer_file, &scratch);
+
str_put(html_tail(&perm, &scratch));
return 0;