1#!/usr/bin/env -S sh -eu
2
3# Builds a static site via the passed <input> tree. The following
4# transformation is performed.
5#
6# <input> <output>
7# ├── *.md ├── *.html
8# │ ├── <posts>.html
9# ├── <posts> ├── <posts>
10# │ └── *.md -> │ └── *.html
11# ├── <styles> ├── <styles>
12# │ └── *.css │ └── *.css
13# └── <assets> └── <assets>
14# ├── <favicon> ├── <favicon>
15# └── * └── *
16#
17# '<>'-delimited paths are configured below.
18
19if ! which pulldown-cmark > /dev/null; then
20 printf "program 'pulldown-cmark' missing\n" >&2
21 exit 1
22fi
23
24root="${0%/*}"
25
26# start config
27input="$root/input"
28output="$root/output"
29posts="$input/posts"
30styles="$input/styles"
31assets="$input/assets"
32favicon="$assets/favicon.svg"
33# end config
34
35rm -rf "$output"
36mkdir -p "$output/${posts#$input/}"
37
38for folder in "$styles" "$assets"; do
39 if [ -e "$folder" ]; then cp -r "$folder" "$output/${folder#$input/}"; fi
40done; unset folder
41
42for page in "$input/"*.md "$posts"; do
43 if ! [ -e "$page" ]; then break; fi
44 stem="${page%.md}"
45 stem="${stem#$input/}"
46 element='<a href="'"/$stem.html"'">'"$stem"'</a>'
47 if [ "$page" = "$input/index.md" ]; then
48 navbar="$element${navbar+ | }${navbar-}"
49 else
50 navbar="${navbar-}${navbar+ | }$element"
51 fi
52done; unset element page stem
53
54for style in "$styles/"*.css; do
55 if ! [ -e "$style" ]; then break; fi
56 style_href="${style_href-}"'<link href="'"${style#$input}"'" rel="stylesheet" type="text/css" media="all">'"${style_href+\n}"
57done; unset style
58
59for page in "$input/"*.md "$posts/"*.md "$posts"; do
60 if ! [ -e "$page" ]; then break; fi
61 stem="${page%.md}"
62 stem="${stem#$input/}"
63 cat > "$output/$stem.html" <<- EOF
64 <!DOCTYPE html>
65 <html lang="en">
66 <head>
67 <meta name="viewport" content="width=device-width, initial-scale=1"/>
68 ${style_href-}
69 <link href="${favicon#$input}" rel="icon" type="image/svg+xml">
70 <title>${input#$root/}::$stem</title>
71 </head>
72 <body>
73 <nav>${navbar-}</nav>
74 <hr>
75 $(if [ "$page" = "$posts" ]; then
76 for post in "$posts/"*.md; do
77 if ! [ -e "$post" ]; then break; fi
78 stem="${post%.md}"
79 stem="${stem#$input/}"
80 contents="${contents-}"'<h2><a href="'"/$stem.html"'">'"title="$(printf %s "$stem" | sed "s/-/ /g")""'</a></h2>'
81 done; unset post stem
82 printf %s "${contents-}"
83 else
84 pulldown-cmark "$page"
85 fi)
86 </body>
87 </html>
88 EOF
89done; unset page stem