1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
#!/bin/sh
# Author: Preston Pan
# Date: 05/10/2022
# Description: Script called from `find` in build.sh. $1 is the file that `find` is currently on.
if [ $# -eq 0 ]; then
printf "Error: This script must be ran from a find command or build.sh!\n"
exit 1
fi
# This function recursively resolves the $$INCLUDE calls
template_replacement()
{
r_templates="$(< "$TEMPLATE_BUILD_DIR/$(basename "$1")" grep "\$\$INCLUDE")" # this is the future built version of our template.
# We are finding the $$INCLUDE lines.
if [ -z "$r_templates" ] # Base case of recursion: there are no more $$INCLUDE calls.
then
return 0
fi
echo "$r_templates" | while read -r i
do
# Escapes special characters from line containing $$INCLUDE call
keyword_regexp="$(printf '%s' "$i" | -e gsed 's/[]\/$*.^|[]/\\&/g' | gsed ':a;N;$!ba;s,\n,\\n,g')"
r_tname="$TEMPLATE_DIR/$(echo "$i" | cut -d ' ' -f 2).html"
# Get contents of file then escapes special characters
f_contents="$(cat "$r_tname")"
replacement_regexp="$(printf '%s' "$f_contents" | gsed -e 's/[\/&]/\\&/g' | gsed ':a;N;$!ba;s,\n,\\n,g')"
#Finally do the sed replace to replace the $$INCLUDE line with the contents of the included template file
gsed -i "s/$keyword_regexp/$replacement_regexp/g" "$TEMPLATE_BUILD_DIR/$(basename "$1")" # BUG: This shit does not work
# Then we do it all again on the same file.
template_replacement "$1"
done
}
fname="$(basename "$1")" # gets the name of file in question
if [ "${fname##*.}" != "html" ] # If it is not an html file, just copy it over to the build directory, the script does nothing.
then
cp "$1" "$BUILD_DIR/$1"
exit 0
fi
# We want the first specified template to be the template
template_name="$(< "$1" grep "\$\$TEMPLATE" | head -1)"
# Location of the template that is to be built from template_replacement
if [ -n "$template_name" ] # We get the path of the template and if no template is specified it uses the default.
then
template="$TEMPLATE_DIR/$(echo "$template_name" | cut -d ' ' -f 2 | tr -d '\n').html"
else
template="$DEFAULT_TEMPLATE"
fi
built_template="$TEMPLATE_BUILD_DIR/$(basename "$template")"
template_replacement "$template" # replace all the $$TEMPLATE calls.
vars="$(< "$1" grep "\$\$START")"
# now we prepare to do the variable substitutions.
cp "$built_template" "$BUILD_DIR/$1"
echo "$vars" | while read -r var;
do
# Get the name of the variable
name="$(echo "$var" | cut -d ' ' -f 2 | tr -d '\n')"
keyword_regexp="$(printf '%s' "$var" | gsed -e 's/[]\/$*.^|[]/\\&/g' | gsed ':a;N;$!ba;s,\n,\\n,g')"
# Get the endpoint of the variable
var_end="\$\$END $name"
end_regexp="$(printf '%s' "$var_end" | gsed -e 's/[\/&]/\\&/g' | gsed ':a;N;$!ba;s,\n,\\n,g')"
# Get the value of the variable
value="$(< "$BUILD_DIR/$1" gsed -n "/$keyword_regexp/,/$end_regexp/p" "$1")"
value_regexp="$(printf '%s' "$value" | gsed -e 's/[]\/$*.^|[]/\\&/g' | gsed ':a;N;$!ba;s,\n,\\n,g')"
# Get the string to replace
replacement="\$\$VAR $name"
replacement_regexp="$(printf '%s' "$replacement" | gsed -e 's/[\/&]/\\&/g' | gsed ':a;N;$!ba;s,\n,\\n,g')"
# Then do the replacement
gsed -i "s/$replacement_regexp/$value_regexp/g" "$BUILD_DIR/$1" # BUG: Doesn't work on openBSD
done
# For some reason I can't trim these inside the loop (i tried) so this works.
sed -i '/\$\$START/d' "$BUILD_DIR/$1"
sed -i '/\$\$END/d' "$BUILD_DIR/$1"
debug="$(< "$BUILD_DIR/$1" grep "\$\$SCRIPT")"
printf "$debug\n"
if [ -n "$debug" ]
then
echo "$debug" | while read -r line;
do
name="$(echo "$line" | cut -d ' ' -f 2 | tr -d '\n')"
output="$(./"$PLUG_DIR/$name" "$1" "$template")"
keyword_regexp="$(printf '%s' "$line" | gsed -e 's/[]\/$*.^|[]/\\&/g' | gsed ':a;N;$!ba;s,\n,\\n,g')"
replacement_regexp="$(printf '%s' "$output" | gsed -e 's/[\/&]/\\&/g' | gsed ':a;N;$!ba;s,\n,\\n,g')"
sed -i "s/$keyword_regexp/$replacement_regexp/g" "$BUILD_DIR/$1" # BUG: doesn't work with openBSD
done
fi
|