Tested on OpenBSD 6.3, 6.4, and macOS 10.14 with lowdown and Markdown.pl
ssg is a static site generator written in shell. Optionally it converts Markdown files to HTML with lowdown(1) or Markdown.pl.
Unless a page has <HTML>
tag ssg5 extracts its title from <H1>
tag, wraps the page with _header.html
, _footer.html
.
Then copies everything (excluding .*
or paths listed in
src/.ssgignore
) from src
to dst
directory.
180 LoC. Enlarge, enhance, zoom!
On OpenBSD:
$ mkdir -p bin $ ftp -Vo bin/ssg5 https://rgz.ee/bin/ssg5 ssg5 100% |*********************| 4916 00:00 $ chmod +x bin/ssg5 $ doas pkg_add lowdown quirks-2.414 signed on 2018-03-28T14:24:37Z lowdown-0.3.1: ok $
Or on macOS:
$ mkdir -p bin $ curl -s https://rgz.ee/bin/ssg5 > bin/ssg5 $ curl -s https://rgz.ee/bin/Markdown.pl > bin/Markdown.pl $ chmod +x bin/ssg5 bin/Markdown.pl $
lowdown(1) and Markdown.pl are optional. They are required only if
there are any *.md
files.
Make sure ssg5
and lowdown
or Markdown.pl
are in your $PATH
:
$ PATH="$HOME/bin:$PATH" $ mkdir src dst $ echo '# Hello, World!' > src/index.md $ echo '<html><title></title>' > src/_header.html $ bin/ssg5 src dst 'Test' 'http://www' ./index.md [ssg] 1 files, 1 url $ find dst dst dst/.files dst/index.html dst/sitemap.xml $ open dst/index.html
HTML files from src
have greater priority than Markdown ones.
ssg5 converts Markdown files from src
to HTML in dst
and then
copies HTML files from src
to dst
. In the following example
src/a.html
wins:
src/a.md -> dst/a.html
src/a.html -> dst/a.html
Make sure you have /favicon.png
in place.
Some browsers fetch /favicon.ico
despite what you specified in
the <LINK>
tag, so you can use an empty one (180
bytes) as a placeholder.
ssg5 generates sitemap.xml
with the list of all pages. Don't forget
to add the absolute URL of the sitemap to your robot.txt
.
For example:
user-agent: *
sitemap: https://rgz.ee/sitemap.xml
To generate RSS feeds use rssg, then add their URLs
to _header.html
.
For example:
<link rel="alternate" type="application/atom+xml" href="/rss.xml">
On every run ssg5 saves a list of files in dst/.files
and updates
only newer files. If no files were modified after that, ssg5 does
nothing.
$ bin/ssg5 src dst 'Test' 'https://www' [ssg] no files, 1 url $
To force the update delete dst/.files
and re-run ssg5.
$ rm dst/.files $ bin/ssg5 src dst 'Test' 'https://www' index.md [ssg] 1 file, 1 url $
Save this helper to ~/bin/sssg
. It re-runs ssg5 with
entr(1) on every file change.
$ cat $HOME/bin/sssg #!/bin/sh while : do find . -type f ! -path '*/.*' | entr -d "$HOME/bin/ssg5" . "$1" "$(date)" '//www' done $
Install entr(1):
$ doas pkg_add entr quirks-2.414 signed on 2018-03-28T14:24:37Z entr-4.0: ok $
Start the helper and keep it running:
$ ~/bin/s /var/www/htdocs/www [ssg] 1 file, 1 url
blog.solobsd.org
bloguslibrus.fr
cryogenix.net
dethronedemperor.com
dev.levlaz.org
grosu.nl
h3artbl33d.nl
high5.nl
matthewgraybosch.com
mvidal.net
ols.wtf
openbsd.amsterdam
openbsd.space
philstjacques.com
romanzolotarev.com — obviously ;)
runbsd.info
stockersolutions.com
why-vi.rocks
Thanks to Devin Teske for helping with awk(1), Kristaps Dzonsons for lowdown(1), and Eric Radman for entr(1).