97 lines
2.6 KiB
Bash
Executable File
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 "$@"
|