113 lines
2.8 KiB
Bash
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/&/\&/g' -e 's/</\</g' -e 's/>/\>/g' -e 's/"/\"/g' -e "s/'/\\'/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"
|