2021-09-22 14:52:03 +02:00
|
|
|
|
#!/usr/bin/env bash
|
2021-02-28 03:33:58 +01:00
|
|
|
|
# template.sh - basic templating engine
|
|
|
|
|
|
2022-11-29 12:46:50 +01:00
|
|
|
|
# nightmare fuel
|
2022-11-29 17:06:45 +01:00
|
|
|
|
# render(array, template_file, recurse)
|
2021-02-28 03:33:58 +01:00
|
|
|
|
function render() {
|
2022-11-29 17:06:45 +01:00
|
|
|
|
if [[ "$3" != true ]]; then
|
|
|
|
|
local template="$(cat "$2" | tr -d $'\01'$'\02' | sed 's/\&/<2F>UwU<77>/g')"
|
|
|
|
|
else
|
|
|
|
|
local template="$(cat "$2")"
|
|
|
|
|
fi
|
2021-02-28 03:33:58 +01:00
|
|
|
|
local -n ref=$1
|
2021-02-28 18:27:06 +01:00
|
|
|
|
local tmp=$(mktemp)
|
2022-11-29 17:06:45 +01:00
|
|
|
|
|
|
|
|
|
local key
|
2021-02-28 03:33:58 +01:00
|
|
|
|
for key in ${!ref[@]}; do
|
2022-06-20 04:56:54 +02:00
|
|
|
|
if [[ "$key" == "_"* ]]; then # iter mode
|
2022-11-29 17:06:45 +01:00
|
|
|
|
local subtemplate=$(mktemp)
|
|
|
|
|
local subtemplate_tmp=$(mktemp)
|
|
|
|
|
echo "$template" | grep "{{start $key}}" -A99999 | grep "{{end $key}}" -B99999 | tr '\n' $'\01' > "$subtemplate"
|
2022-06-21 04:00:17 +02:00
|
|
|
|
|
|
|
|
|
echo 's'$'\02''\{\{start '"$key"'\}\}.*\{\{end '"$key"'\}\}'$'\02''\{\{'"$key"'\}\}'$'\02'';' >> "$tmp"
|
|
|
|
|
|
|
|
|
|
local -n asdf=${ref[$key]}
|
2022-11-29 17:06:45 +01:00
|
|
|
|
|
|
|
|
|
local j
|
|
|
|
|
local value=''
|
2022-06-21 04:00:17 +02:00
|
|
|
|
for j in ${!asdf[@]}; do
|
|
|
|
|
local -n fdsa=_${asdf[$j]}
|
|
|
|
|
|
2022-11-29 17:06:45 +01:00
|
|
|
|
value+="$(render fdsa "$subtemplate" true | sed -E 's'$'\02''\{\{start '"$key"'\}\}'$'\02'$'\02'';s'$'\02''\{\{end '"$key"'\}\}'$'\02'$'\02')"
|
2022-06-21 04:00:17 +02:00
|
|
|
|
|
2022-06-28 09:34:04 +02:00
|
|
|
|
rm "$subtemplate_tmp"
|
2022-06-20 04:56:54 +02:00
|
|
|
|
done
|
2022-11-29 17:06:45 +01:00
|
|
|
|
|
2022-06-21 04:00:17 +02:00
|
|
|
|
|
|
|
|
|
echo 's'$'\02''\{\{'"$key"'\}\}'$'\02'''"$value"''$'\02'';' >> "$tmp"
|
2022-06-28 09:34:04 +02:00
|
|
|
|
rm "$subtemplate"
|
2022-11-29 12:46:50 +01:00
|
|
|
|
elif [[ "$key" == "@"* && "${ref[$key]}" != '' ]]; then
|
|
|
|
|
local value="$(sed -E 's/\&/<2F>UwU<77>/g' <<< "${ref[$key]}")"
|
|
|
|
|
echo 's'$'\02''\{\{\'"$key"'\}\}'$'\02'''"$value"''$'\02''g;' >> "$tmp"
|
|
|
|
|
elif [[ "$key" == '?'* ]]; then
|
2022-11-29 17:06:45 +01:00
|
|
|
|
local _key="\\?${key/?/}"
|
2022-11-29 12:46:50 +01:00
|
|
|
|
|
2022-11-29 17:06:45 +01:00
|
|
|
|
local subtemplate=$(mktemp)
|
|
|
|
|
echo 's'$'\02''\{\{start '"$_key"'\}\}(.*)\{\{end '"$_key"'\}\}'$'\02''\1'$'\02'';' >> "$subtemplate"
|
2022-11-29 12:46:50 +01:00
|
|
|
|
cat <<< $(cat "$subtemplate" "$tmp") > "$tmp" # call that cat abuse
|
|
|
|
|
|
2022-06-20 04:56:54 +02:00
|
|
|
|
elif [[ "${ref[$key]}" != "" ]]; then
|
2022-11-29 17:06:45 +01:00
|
|
|
|
echo "VALUE: ${ref[$key]}" > /dev/stderr
|
|
|
|
|
if [[ "$3" != true ]]; then
|
|
|
|
|
local value="$(echo "${ref[$key]}" | html_encode | sed -E 's/\&/<2F>UwU<77>/g')"
|
|
|
|
|
else
|
|
|
|
|
local value="$(echo "${ref[$key]}" | sed -E 's/\\\\/<2F>OwO<77>/g;s/\\//g;s/<2F>OwO<77>/\\/g' | html_encode | sed -E 's/\&/<2F>UwU<77>/g')"
|
|
|
|
|
fi
|
2022-06-25 11:32:20 +02:00
|
|
|
|
echo 's'$'\02''\{\{\.'"$key"'\}\}'$'\02'''"$value"''$'\02''g;' >> "$tmp"
|
2021-06-23 00:40:35 +02:00
|
|
|
|
else
|
2022-06-25 11:32:20 +02:00
|
|
|
|
echo 's'$'\02''\{\{\.'"$key"'\}\}'$'\02'$'\02''g;' >> "$tmp"
|
2021-06-23 00:40:35 +02:00
|
|
|
|
fi
|
2021-02-28 03:33:58 +01:00
|
|
|
|
done
|
2022-06-21 04:00:17 +02:00
|
|
|
|
|
2022-11-29 17:06:45 +01:00
|
|
|
|
if [[ "$3" != true ]]; then # are we recursing?
|
|
|
|
|
cat "$tmp" | tr '\n' $'\01' | sed -E 's/'$'\02'';'$'\01''/'$'\02'';/g;s/'$'\02''g;'$'\01''/'$'\02''g;/g' > "${tmp}_"
|
2022-11-29 12:46:50 +01:00
|
|
|
|
|
2022-11-29 17:06:45 +01:00
|
|
|
|
echo 's/\{\{start \?([a-zA-Z0-9_-]*[^}])\}\}.*\{\{end \?(\1)\}\}//g' >> "${tmp}_"
|
|
|
|
|
template="$(tr '\n' $'\01' <<< "$template" | sed -E -f "${tmp}_" | tr $'\01' '\n')"
|
|
|
|
|
sed -E 's/<2F>UwU<77>/\&/g' <<< "$template"
|
|
|
|
|
rm "$tmp" "${tmp}_"
|
|
|
|
|
else
|
|
|
|
|
tr '\n' $'\01' <<< "$template" | sed -E -f "$tmp" | tr $'\01' '\n'
|
|
|
|
|
rm "$tmp"
|
|
|
|
|
fi
|
2021-02-28 03:33:58 +01:00
|
|
|
|
}
|
2021-02-28 12:39:46 +01:00
|
|
|
|
|
|
|
|
|
# render_unsafe(array, template_file)
|
|
|
|
|
function render_unsafe() {
|
|
|
|
|
local template="$(cat "$2")"
|
|
|
|
|
local -n ref=$1
|
2021-02-28 18:27:06 +01:00
|
|
|
|
local tmp=$(mktemp)
|
2021-02-28 12:39:46 +01:00
|
|
|
|
for key in ${!ref[@]}; do
|
2022-06-20 04:56:54 +02:00
|
|
|
|
if [[ "$key" == "_"* ]]; then # iter mode
|
|
|
|
|
# grep "start _test" -A99999 | grep "end _test" -B99999
|
|
|
|
|
local -n item_array=${ref[$key]}
|
|
|
|
|
local value
|
2022-11-29 12:46:50 +01:00
|
|
|
|
for ((_i = 0; _i < ${#item_array[@]}; _i++)); do
|
|
|
|
|
value+="$(xxd -p <<< "${item_array[$_i]}" | tr -d '\n' | sed -E 's/../\\x&/g')"
|
2022-06-20 04:56:54 +02:00
|
|
|
|
done
|
|
|
|
|
echo 's/\{\{'"$key"'\}\}/'"$value"'/g' >> "$tmp"
|
|
|
|
|
else
|
2022-11-29 12:46:50 +01:00
|
|
|
|
local value="$(xxd -p <<< "${ref[$key]}" | tr -d '\n' | sed -E 's/../\\x&/g')"
|
2022-06-20 04:56:54 +02:00
|
|
|
|
echo 's/\{\{\.'"$key"'\}\}/'"$value"'/g' >> "$tmp"
|
2022-06-21 04:00:17 +02:00
|
|
|
|
fi
|
2021-02-28 12:39:46 +01:00
|
|
|
|
done
|
|
|
|
|
|
2021-02-28 18:27:06 +01:00
|
|
|
|
sed -E -f "$tmp" <<< "$template"
|
|
|
|
|
rm "$tmp"
|
2021-02-28 12:39:46 +01:00
|
|
|
|
}
|
2022-06-20 04:56:54 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# mmmm this should be a library because i am so much copying those later
|
|
|
|
|
# _nested_random
|
|
|
|
|
function _nested_random() {
|
|
|
|
|
dd if=/dev/urandom bs=1 count=16 status=none | xxd -p
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# nested_declare(ref)
|
|
|
|
|
function nested_declare() {
|
|
|
|
|
declare -g -a $1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# nested_add(ref, array)
|
|
|
|
|
function nested_add() {
|
|
|
|
|
local nested_id=$(_nested_random)
|
2022-06-25 09:00:25 +02:00
|
|
|
|
declare -n nested_ref=$2
|
|
|
|
|
declare -g -A _$nested_id
|
|
|
|
|
|
|
|
|
|
# poor man's array copy
|
2022-11-29 12:46:50 +01:00
|
|
|
|
for k in ${!nested_ref[@]}; do
|
|
|
|
|
declare -g -A _$nested_id[$k]="${nested_ref[$k]}"
|
2022-06-25 09:00:25 +02:00
|
|
|
|
done
|
|
|
|
|
|
2022-06-20 04:56:54 +02:00
|
|
|
|
local -n ref=$1
|
|
|
|
|
ref+=("$nested_id")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# nested_get(ref, i)
|
|
|
|
|
function nested_get() {
|
|
|
|
|
local -n ref=$1
|
|
|
|
|
declare -g -n res=_${ref[$2]}
|
|
|
|
|
}
|