thoughts/src/post2html

97 lines
2.6 KiB
Bash
Executable File

#!/bin/bash
# Generate HTML from post Markdown source
#
# Copyright (C) 2019 Mike Gerwitz
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# This script accepts the file name rather than data on stdin because the
# filename encodes the post date.
#
# Note that the `pagetitle' is set to "ignoreme"---it is not used, but is
# needed to suppress the warning pandoc produces without suppressing all
# warnings.
#
# Pandoc is used to generate the HTML and includes a (mostly) static header
# and footer. Note that this duplicates the date logic in `post2meta',
# because that must be run on this output, but the post must also contain
# the date, and we want to do all HTML processing now.
##
set -euo pipefail
# Pandoc output format and extensions.
declare -ra ext=(
markdown
smart
footnotes
gfm_auto_identifiers
fancy_lists
startnum
tex_math_dollars
)
# Convert extensions to `+'-delimited string.
pexts()
{
local IFS=+
echo "${ext[*]}"
}
# Wrap h1 in an hgroup along with the post date.
#
# Sometimes this script is used on things that aren't posts (e.g. normal
# pages), in which case a date will be unavailable and the output will be
# unchanged.
hgroup-wrap()
{
local -r date=${1?Missing date}
# Abort if this is not a date prefix
[[ $date =~ [0-9]{4}-[0-9]{2}-[0-9]{2} ]] || {
cat
return
}
sed '/^<h1/{
i<hgroup>
a<h2 class="date">'"$date"'</h2></hgroup>
}'
}
# Generate HTML from post. Note that `pagetitle' is set just to suppress
# Pandoc warnings about it missing; it is unused.
main()
{
local -r file=${1?Missing file name}
local -r base=$( basename "$file" .md )
local -r date=${base:0:10}
pandoc -f"$( pexts )" -thtml5 \
--standalone --template src/pandoc.tpl \
--metadata pagetitle:ignoreme \
--base-header-level=1 \
-B <( src/mkheader post @__PAGE_TITLE__@ ) \
-A src/footer.tpl.htm \
< "$file" \
| src/h12title @__PAGE_TITLE__@ \
| hgroup-wrap "$date"
}
main "$@"