diff --git a/config/master_example.sh b/config/master_example.sh index 8405090..17ede6f 100644 --- a/config/master_example.sh +++ b/config/master_example.sh @@ -21,9 +21,9 @@ cfg[ssl_cert]='' cfg[ssl_key]='' cfg[extension]='shs' -cfg[extra_headers]='server: HTTP.sh/0.94 (devel)' +cfg[extra_headers]='server: HTTP.sh/0.95 (devel)' -cfg[title]='HTTP.sh 0.94' +cfg[title]='HTTP.sh 0.95' cfg[php_enabled]=false # enable PHP script evalutaion (requires PHP) cfg[python_enabled]=false # enable Python script evalutaion (requires Python) diff --git a/http.sh b/http.sh index 3da2573..25f8617 100755 --- a/http.sh +++ b/http.sh @@ -27,9 +27,9 @@ cfg[ssl_cert]='' cfg[ssl_key]='' cfg[extension]='shs' -cfg[extra_headers]='server: HTTP.sh/0.94 (devel)' +cfg[extra_headers]='server: HTTP.sh/0.95 (devel)' -cfg[title]='HTTP.sh 0.94' +cfg[title]='HTTP.sh 0.95' cfg[php_enabled]=false # enable PHP script evalutaion (requires PHP) cfg[python_enabled]=false # enable Python script evalutaion (requires Python) diff --git a/src/template.sh b/src/template.sh index eedee09..492f466 100755 --- a/src/template.sh +++ b/src/template.sh @@ -3,18 +3,46 @@ # render(array, template_file) function render() { - local template="$(cat "$2")" + local template="$(cat "$2" | tr -d $'\01'$'\02' | sed 's/\&/�UwU�/g')" local -n ref=$1 local tmp=$(mktemp) for key in ${!ref[@]}; do - if [[ "${ref[$key]}" != "" ]]; then + if [[ "$key" == "_"* ]]; then # iter mode + local value='' + subtemplate=$(mktemp) + subtemplate_tmp=$(mktemp) + echo "$template" | sed 's/\&/�UwU�/g' | grep "{{start $key}}" -A99999 | grep "{{end $key}}" -B99999 | tr -d $'\01'$'\02' | tr '\n' $'\01' > "$subtemplate" + + echo 's'$'\02''\{\{start '"$key"'\}\}.*\{\{end '"$key"'\}\}'$'\02''\{\{'"$key"'\}\}'$'\02'';' >> "$tmp" + + local -n asdf=${ref[$key]} + + for j in ${!asdf[@]}; do + local -n fdsa=_${asdf[$j]} + + for i in ${!fdsa[@]}; do + echo 's'$'\02''\{\{.'"$i"'\}\}'$'\02'''"${fdsa[$i]}"''$'\02''g;' | tr '\n' $'\01' | sed -E 's/'$'\02'';'$'\01''/'$'\02'';/g;s/'$'\02''g;'$'\01''/'$'\02''g;/g' >> "$subtemplate_tmp" + done + + echo 's'$'\02''\{\{start '"$key"'\}\}'$'\02'$'\02' >> "$subtemplate_tmp" + echo 's'$'\02''\{\{end '"$key"'\}\}'$'\02'$'\02' >> "$subtemplate_tmp" + + value+="$(cat "$subtemplate" | tr '\n' $'\01' | sed -E -f "$subtemplate_tmp" | tr $'\01' '\n')" + rm "$subtemplate_tmp" + done + + echo 's'$'\02''\{\{'"$key"'\}\}'$'\02'''"$value"''$'\02'';' >> "$tmp" + rm "$subtemplate" + elif [[ "${ref[$key]}" != "" ]]; then local value="$(html_encode "${ref[$key]}" | sed -E 's/\&/�UwU�/g')" - echo 's/\{\{\.'"$key"'\}\}/'"$value"'/g' >> "$tmp" + echo 's'$'\02''\{\{\.'"$key"'\}\}'$'\02'''"$value"''$'\02''g;' >> "$tmp" else - echo 's/\{\{\.'"$key"'\}\}//g' >> "$tmp" + echo 's'$'\02''\{\{\.'"$key"'\}\}'$'\02'$'\02''g;' >> "$tmp" fi done - template="$(sed -E -f "$tmp" <<< "$template")" + + cat "$tmp" | tr '\n' $'\01' | sed -E 's/'$'\02'';'$'\01''/'$'\02'';/g;s/'$'\02''g;'$'\01''/'$'\02''g;/g' > "${tmp}_" + template="$(tr '\n' $'\01' <<< "$template" | sed -E -f "${tmp}_" | tr $'\01' '\n')" sed -E 's/�UwU�/\&/g' <<< "$template" rm "$tmp" } @@ -25,10 +53,53 @@ function render_unsafe() { local -n ref=$1 local tmp=$(mktemp) for key in ${!ref[@]}; do - local value="$(xxd -ps <<< "${ref[$key]}" | tr -d '\n' | sed -E 's/.{2}/\\x&/g')" - echo 's/\{\{\.'"$key"'\}\}/'"$value"'/g' >> "$tmp" + if [[ "$key" == "_"* ]]; then # iter mode + # grep "start _test" -A99999 | grep "end _test" -B99999 + local -n item_array=${ref[$key]} + local value + for ((i = 0; i < ${#item_array[@]}; i++)); do + value+="$(xxd -ps <<< "${item_array[$i]}" | tr -d '\n' | sed -E 's/../\\x&/g')" + done + echo 's/\{\{'"$key"'\}\}/'"$value"'/g' >> "$tmp" + else + local value="$(xxd -ps <<< "${ref[$key]}" | tr -d '\n' | sed -E 's/../\\x&/g')" + echo 's/\{\{\.'"$key"'\}\}/'"$value"'/g' >> "$tmp" + fi done sed -E -f "$tmp" <<< "$template" rm "$tmp" } + + +# 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) + declare -n nested_ref=$2 + declare -g -A _$nested_id + + # poor man's array copy + for i in ${!nested_ref[@]}; do + declare -g -A _$nested_id[$i]="${nested_ref[$i]}" + done + + local -n ref=$1 + ref+=("$nested_id") +} + +# nested_get(ref, i) +function nested_get() { + local -n ref=$1 + declare -g -n res=_${ref[$2]} +}