ssg

· mackeye's pastes · raw

expires: never

 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