summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/main.c b/main.c
index cf9cc97..e65eb9d 100644
--- a/main.c
+++ b/main.c
@@ -23,6 +23,7 @@ typedef struct {
Str hvarv[1024];
Str title;
int hvarc;
+ Str docroot;
} Options;
Options opts = { 0 };
@@ -65,8 +66,7 @@ char to_xdigit(int x) {
}
}
-void str_cat_uri(Str *s, Str uri, Arena *a) {
- str_catc(s, '\'', a);
+void str_cat_uri_internal(Str *s, Str uri, Arena *a) {
for (isize i = 0; i < uri.n; i++) {
char c = uri.s[i];
if (c == '\'' || c == '%') {
@@ -77,6 +77,13 @@ void str_cat_uri(Str *s, Str uri, Arena *a) {
str_catc(s, c, a);
}
}
+}
+
+void str_cat_uri(Str *s, Str uri, Arena *a) {
+ str_catc(s, '\'', a);
+ if (str_starts(uri, S("/")) && opts.docroot.n > 0)
+ str_cat_uri_internal(s, opts.docroot, a);
+ str_cat_uri_internal(s, uri, a);
str_catc(s, '\'', a);
}
@@ -499,8 +506,7 @@ int hvar_calc(Str param, Str *name, Str *val, Str filename) {
usize n = 0;
for (Str h = c.tail; h.n > 0; h = str_cut(h, ',').tail) n++;
if (!n) return -1;
- srand(str_hash(filename));
- usize j = rand() % n;
+ usize j = str_hash(filename) % n;
usize i = 0;
for (Str h = c.tail; h.n > 0; h = str_cut(h, ',').tail) {
if (i == j) {
@@ -526,6 +532,7 @@ void usage(const char *cmd) {
" -i --inline enable inline formatting (*italics*, `code`, ---dashes, [[links]])\n"
" -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"
" -L --lang set the document's language\n",
cmd, cmd);
}
@@ -551,8 +558,8 @@ Str html_head(Arena *m, Arena *l) {
}
if (opts.hvarc > 0) {
- str_cat(&h, S("<style>\n"), m);
- str_cat(&h, S(":root {"), m);
+ str_cat(&h, S("<style>"), m);
+ str_cat(&h, S(":root{"), m);
for (int i = 0; i < opts.hvarc; i++) {
Str name, val;
if (hvar_calc(opts.hvarv[i], &name, &val, opts.title)) {
@@ -565,7 +572,7 @@ Str html_head(Arena *m, Arena *l) {
str_cat(&h, val, m);
str_catc(&h, ';', m);
}
- str_cat(&h, S("}\n"), m);
+ str_cat(&h, S("}"), m);
str_cat(&h, S("</style>\n"), m);
}
@@ -616,7 +623,7 @@ int main(int argc, const char **argv) {
Str param = { 0 };
opts.from_stdin = 1;
- while ((r = arg_get(&a, "?sliqc:h:t:L:", &param,
+ while ((r = arg_get(&a, "?sliqc:h:t:L:R:", &param,
"help", '?',
"standalone", 's',
"smartq", 'q',
@@ -625,6 +632,7 @@ int main(int argc, const char **argv) {
":css", 'c',
"link", 'l',
"lang", 'L',
+ "root", 'R',
":hvar", 'h')) >= ARG_OK) {
Arena reset = scratch;
FILE *f;
@@ -650,6 +658,9 @@ int main(int argc, const char **argv) {
case 'L':
opts.language = param;
break;
+ case 'R':
+ opts.docroot = param;
+ break;
case 't':
opts.title = param;
break;