website/build.sh

113 lines
2.8 KiB
Bash

#!/bin/sh
BASE="$PWD"
export _INCDIR="${_INCDIR:-"${BASE}/include"}"
export _BUILDDIR="${_BUILDDIR:-"${BASE}/build"}"
export _SRCDIR="${_SRCDIR:-"${BASE}/src"}"
__NL="
"
__cleanup() {
[ -f "${__FILE_TMP:-}" ] && rm "$__FILE_TMP"
true
}
# process an html formatted file from stdin and output to stdout
__process_shp() {
__SHLVL=$((__SHLVL + 1))
eval '__SH_FLAG'$__SHLVL'=""
__LINE_EXEC_'$__SHLVL'=""
while read -r __LINE'$__SHLVL'; do
if [ -z "$__SH_FLAG'$__SHLVL'" ]; then
case "$__LINE'$__SHLVL'" in
*"<?shp"*)
printf "%s" "${__LINE'$__SHLVL'%%<\?shp*}"
__LINE'$__SHLVL'="${__LINE'$__SHLVL'#*<\?shp}"
__SH_FLAG'$__SHLVL'=1
;;
*) echo "$__LINE'$__SHLVL'" ;;
esac
fi
if [ -n "$__SH_FLAG'$__SHLVL'" ]; then
__LINE_EXEC_'$__SHLVL'="$__LINE_EXEC_'$__SHLVL'$__NL$__LINE'$__SHLVL'"
case "$__LINE'$__SHLVL'" in
*"?>"*)
eval "${__LINE_EXEC_'$__SHLVL'%%\?>*}"
printf "%s" "${__LINE'$__SHLVL'##*\?>}"
__SH_FLAG'$__SHLVL'=""
__LINE_EXEC_'$__SHLVL'=""
;;
*) ;;
esac
fi
done
[ $__SH_FLAG'$__SHLVL' ] && eval "$__LINE_EXEC_'$__SHLVL'"'
__SHLVL=$((__SHLVL - 1))
}
__lowdown() { lowdown --html-no-num-ent --html-no-skiphtml --html-no-escapehtml "$@"; }
# process a pure markdown file
# uses a special file in _INCDIR, `markdown-template.sh` to create the html
__process_md() {
[ -f mdmeta ] && set_md_metadata "$1"
. "$_INCDIR"/_markdown-template.sh <<-EOF
$(__lowdown "$1")
EOF
}
trap '__cleanup' INT HUP QUIT EXIT
__FILE_TMP="$(mktemp -u)"
find "$_SRCDIR" -type d -exec sh -c 'for d; do mkdir -p "$_BUILDDIR"/"${d#"$_SRCDIR"}"; done' sh {} +
# standard library
include() {
# if the path contains a slash, then treat it as-is
# else, try getting it from $_INCDIR
case "$1" in
*/*.md) __lowdown "$1" ;;
*.md) __lowdown "$_INCDIR"/"$1" ;;
*/*) __process_shp < "$1" ;;
*) __process_shp < "$_INCDIR"/"$1" ;;
esac
}
set_md_metadata() {
__MD_BASE="${1##*/}"
while read -r __MD_LINE; do
case "$__MD_LINE" in
"$__MD_BASE") __MD_FLAG="1" ;;
"" ) [ -n "$__MD_FLAG" ] && break ;;
*) [ -n "$__MD_FLAG" ] && __MD_EXEC="$__MD_EXEC$__NL$__MD_LINE" ;;
esac
done < mdmeta
__MD_FLAG=""
eval "$__MD_EXEC"
}
escape() {
sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g' -e 's/"/\&quot;/g' -e "s/'/\\&#39/g" <<-EOF
$*
EOF
}
__SHLVL=0
while read -r __FILE; do
cd "${__FILE%/*}"
__OUTFILE="$_BUILDDIR/${__FILE#"$_SRCDIR"}"
case "${__FILE##*/}" in
*.[hH][tT][mM][lL]) ( __process_shp ) < "$__FILE" > "$__FILE_TMP" ;;
*.[mM][dD]) ( __process_md "$__FILE" ) > "$__FILE_TMP"; __OUTFILE="${__OUTFILE%.*}.html" ;;
mdmeta) continue ;;
*) cp -p "$__FILE" "$__FILE_TMP" ;;
esac
if ! cmp -s "$__FILE_TMP" "$__OUTFILE"; then
mv "$__FILE_TMP" "$__OUTFILE"
fi
done <<-EOF
$(find "$_SRCDIR" -type f)
EOF
[ -f "$_INCDIR/_postbuild.sh" ] && . "$_INCDIR/_postbuild.sh"