website/build.sh

119 lines
3.1 KiB
Bash

#!/bin/sh
__BASE="$PWD"
export _INCDIR="${_INCDIR:-"${__BASE}/include"}"
export _BUILDDIR="${_BUILDDIR:-"${__BASE}/build"}"
export _SRCDIR="${_SRCDIR:-"${__BASE}/src"}"
__NL="
"
# process an html formatted file either given or from stdin and output to stdout
# if a file is given, stdin is free to be used by any shp files it encounters
__process_shp() {
__SHLVL=$((__SHLVL + 1))
eval '__SH_FLAG'$__SHLVL'=""
__LINE_EXEC_'$__SHLVL'=""
__TMP_FILE'$__SHLVL'="${1:-/dev/stdin}"
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 < "$__TMP_FILE'$__SHLVL'"
[ $__SH_FLAG'$__SHLVL' ] && eval "$__LINE_EXEC_'$__SHLVL'"'
__SHLVL=$((__SHLVL - 1))
}
__SHLVL=0
__lowdown() { lowdown --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"
__process_shp "$_INCDIR"/_markdown-template.shp <<-EOF
$(__lowdown "$1")
EOF
}
# 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() {
if [ -n "$*" ]; then
sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g' -e 's/"/\&quot;/g' -e "s/'/\\&#39/g" <<-EOF
$*
EOF
else
sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g' -e 's/"/\&quot;/g' -e "s/'/\\&#39/g"
fi
}
__cleanup() {
[ -f "${__FILE_TMP:-}" ] && rm "$__FILE_TMP"
true
}
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 {} +
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"