summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMalfurious <m@lfurio.us>2023-10-28 08:02:18 -0400
committerMalfurious <m@lfurio.us>2023-11-15 23:11:08 -0500
commit453c2a4f37bdf6b061f54a075e7ff4b80d805fe8 (patch)
treee2ccb5855cd7073f7a47347669d09a872819d375
parent79bf10217325dcad4a974aa2c34207f64863f96d (diff)
downloadcychedelic-453c2a4f37bdf6b061f54a075e7ff4b80d805fe8.tar.gz
cychedelic-453c2a4f37bdf6b061f54a075e7ff4b80d805fe8.zip
dmt: Add server-side templating functionality
This file is taken from the "werc" web "anti-framework" project, which is made available as Public Domain as well as MIT code. It is an awk script that implements a simple templating markup syntax. When run on an input file, it translates the content into equivalent shell syntax which can then be executed to produce the desired result. Therefore, the script should be invoked as `template.awk FILE | bash`, and the output can be streamed to the client. An overview of the template syntax follows: Lines beginning with '%' (no leading whitespace allowed) are taken as shell commands. Inline %{ ... %} gives the inner content taken as a shell command. Inline %( ... %) gives the inner content taken as a shell expression (which is substituted). All other text is echoed as-is. Signed-off-by: Malfurious <m@lfurio.us>
-rwxr-xr-xdmt/template.awk55
1 files changed, 55 insertions, 0 deletions
diff --git a/dmt/template.awk b/dmt/template.awk
new file mode 100755
index 0000000..4274484
--- /dev/null
+++ b/dmt/template.awk
@@ -0,0 +1,55 @@
+#!/usr/bin/awk -f
+function pr(str) {
+ if(lastc !~ "[{(]")
+ gsub(/'/, "''", str)
+ printf "%s", str
+}
+function trans(c) {
+ printf "%s", end
+
+ lastc = c
+ end = "\n"
+ if(c == "%")
+ end = ""
+ else if(c == "(")
+ printf "echo -n "
+ else if(c ~ "[})]") {
+ end = "'\n"
+ printf "echo -n '"
+ }
+}
+
+BEGIN {
+ lastc = "{"
+ trans("}")
+}
+END {
+ print end
+}
+
+/^%/ && $0 !~ /^%[{()}%]/ && lastc !~ /[({]/ {
+ trans("%")
+ print substr($0, 2)
+ next
+}
+{
+ if(lastc == "%")
+ trans("}")
+ n = split($0, a, "%")
+ pr(a[1])
+ for(i=2; i<=n; i++) {
+ c = substr(a[i], 1, 1)
+ rest = substr(a[i], 2)
+
+ if((lastc !~ "[({]" && c ~ "[({]") ||
+ (lastc == "{" && c == "}") ||
+ (lastc == "(" && c == ")"))
+ trans(c)
+ else if(c == "%")
+ pr("%")
+ else
+ pr("%" c)
+ pr(rest)
+ }
+ pr("\n")
+}