From 1c8e5f1ca9bf0eb6dad8a62bc87428610d96c350 Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Wed, 3 Aug 2022 23:36:07 -0500 Subject: Begin anew I think this might really be something! --- ht.sh | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100755 ht.sh (limited to 'ht.sh') diff --git a/ht.sh b/ht.sh new file mode 100755 index 0000000..cc0d0ba --- /dev/null +++ b/ht.sh @@ -0,0 +1,62 @@ +#!/bin/sh +# ht.sh +# *.ht -> *html + +# config +header_file=header.htm +footer_file=footer.htm +meta_file=meta.sh + +# state +HTDAT="$(date +%s)" +HT_TMPL_COUNT=0 + +print() { + printf '%s\n' "$*" +} + +htt() { # htt FILE + # Like `cat`, but with templating. + ht_end="ht_main_${HTDAT}_${HT_TMPL_COUNT}" # be extra double sure + eval "$( + print "cat <<$ht_end" + cat "$@" + print + print "$ht_end" + )" + HT_TMPL_COUNT=$((HT_TMPL_COUNT + 1)) +} + +htmeta_clear() { + # Generate metadata-clearing commands from $meta_file. + while read -r line; do + case "$line" in + *'()'*) # function + unset -f "${line%()*}" + ;; + *=*) # variable assignment + unset -v "${line%=*}" + ;; + *) # other -- XXX: Don't know what to do + ;; + esac + done <"$meta_file" +} + +htmeta() { # htmeta FILE + # Collect metadata from FILE. + # Metadata looks like this: `;;@` + sed -n 's/^;;@//p' "$1" | tee "$meta_file" +} + +main() { + # Make two passes over each input file, collecting metadata and content. + : + # Of course, this isn't safe, but you trust yourself, right? + for file; do + eval "$(htmeta_clear)" + eval "$(htmeta "$file")" + + ./ht.awk <"$file" | htt "$header_file" - "$footer_file" >"${file}ml" + done +} -- cgit 1.4.1-21-gabe81