Summary Files Commits Branches @commit @diff @stats
path: root / generate.sh
blob: b3ef0ddfcfceff4ca9e73b3f8b3eccd0c647b63e (plain) (blame)
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/bin/bash

: ${REPO_FOLDER:=.}
: ${GEN_FOLDER:=./website}
: ${GEN_TINY_FOLDER:=./website.tiny}
: ${AWK_FILE:=/tmp/syndamiadotcom-awk}

# 0. Helper functions {{{
	dur=0
	startTimer() {
		dur="$(date +%s%N)"
	}

	endTimer() {
		dur="$(echo "scale=4 ; ($(date +%s%N) - $dur) / 1000000000 - ${2:-0}" | bc -l)"
		printf "%.3fs    $1\n" $dur
	}
# }}}
# 0.5 Fix hardlinks {{{
	startTimer
		for folder in $(find "$REPO_FOLDER/src" -maxdepth 1 -type d); do
			if [ -f "$folder.md" ] && [ ! "$folder.md" -ef "$folder/index.md" ]; then
				rm "$folder/index.md" >/dev/null 2>&1
				ln "$folder.md" "$folder/index.md"
			fi
		done
	endTimer "[Stage 0.5] Fixed folder/index.md hardlinks"
# }}}
# 1. Markdown source to HTML {{{
	[ $# -eq 0 -a "$(id -u -n)" != "www-data" ] && echo "[Warning] Running in \"production\" by a user that isn't www-root!"
	
	[ ! -d "$GEN_FOLDER" ] && mkdir "$GEN_FOLDER"
	[ $# -eq 0 -a "$(stat -c %U "$GEN_FOLDER")" != "www-data" ] && echo "[Warning] Running in \"production\" while $GEN_FOLDER isn't owned by www-data!"
	
	# Remove record of previously generated files
	rm -rf "$GEN_FOLDER"
	mkdir "$GEN_FOLDER"
	startTimer
		ssg "$REPO_FOLDER/src" "$GEN_FOLDER" "Syndamia" "https://syndamia.com" >/dev/null 2>&1
	endTimer "[Stage 1] Converted Markdown to HTML"
# }}}
# 1.5 Custom logic - timestamps.txt {{{
	headc=$(git rev-parse HEAD)
	if [ ! -f 'timestamps.txt' ] || [ "$headc" != "$(head -1 timestamps.txt)" ]; then
		echo "$headc" > timestamps.txt

		startTimer
			for file in $(find "$REPO_FOLDER/src" -type f -regex '.*src/[^/]*/[^/]*/.*md'); do
					dates=($(git log --follow --pretty=format:%ad --date="format:%d %B %Y" -- $file))
					line="./website${file:5:-2}html\t${dates[@]: -3:3}\t${dates[@]:0:3}"
					echo -e $line >> timestamps.txt
			done
		endTimer "[Stage 1.5] Recreated timestamps.txt"
	fi
# }}}
# 2. Editing HTML files with AWK {{{
	createAWKscript() {
		# "librarires"
		find "$REPO_FOLDER/awk-edits" -type f -name "#*.awk"     -exec cat {} +  > "$AWK_FILE"
		# Scripts
		find "$REPO_FOLDER/awk-edits" -type f -name "[A-Z]*.awk" -exec cat {} + >> "$AWK_FILE"
		echo '{if ($0 != 0) print}' >> "$AWK_FILE"
	}
	# $1 - $libs, for devs
	runAWKscript() {
		[ -z "$1" ] && params="-f $AWK_FILE" \
		            || params="$1 -f $AWK_FILE -f /tmp/awk-print $postfile"
		for file in $(find "$GEN_FOLDER" -type f -name "*.html"); do
			awk --posix $params "$file" > tmp && mv -f tmp "$file"
		done
	}

	if [ $# -eq 0 ]; then # Run in "production"
		createAWKscript
		startTimer
			runAWKscript
		endTimer "[Stage 2] Ran $AWK_FILE"


	elif [ "$1" == 'dev' ]; then
		startTimer
			createAWKscript
		endTimer "[Stage 2] Created $AWK_FILE"
		startTimer
			runAWKscript
		endTimer "[Stage 2] Ran $AWK_FILE"


	elif [ "$1" == 'devs' ]; then
		echo '{if ($0 != 0) print}' > /tmp/awk-print
		libs=""
		for l in $(find "$REPO_FOLDER/awk-edits" -type f -name "#*.awk"); do
			libs+=" -f $l "
		done

		# We only care about how long the script itself was executed, without the time it takes to
		# open and close every file, this way we'll subtract this delay
		AWK_FILE="$REPO_FOLDER/awk-edits/empty"
		startTimer
			runAWKscript "$libs"
		fileOpenOffset="$(endTimer "[Stage 2] Subtracted time for file open/close")"
		printf "$fileOpenOffset\n"
		fileOpenOffset="${fileOpenOffset:0:5}"

		for i in $(find "$REPO_FOLDER/awk-edits" -type f -name "[A-Z]*.awk"); do
			AWK_FILE="$i"

			startTimer
				runAWKscript "$libs"
			endTimer "[Stage 2] Ran $i" "$fileOpenOffset"
		done
	fi
# }}}
# 3. Tiny version, strip away styles and other stuff {{{
	[ ! -d "$GEN_TINY_FOLDER" ] && mkdir "$GEN_TINY_FOLDER"
	[ $# -eq 0 -a "$(stat -c %U "$GEN_TINY_FOLDER")" != "www-data" ] && echo "[Warning] Running in \"production\" while $GEN_TINY_FOLDER isn't owned by www-data!"

	# Just take what is already made, no need to regenerate everything
	cp -r "$GEN_FOLDER"/* "$GEN_TINY_FOLDER"

	# Remove unnecessary files
	rm -f  "$GEN_TINY_FOLDER"/*.css
	rm -rf "$GEN_TINY_FOLDER"/fonts/
	rm -f  "$GEN_TINY_FOLDER"/.files

	improveForTINY() {
		for file in $(find "$GEN_TINY_FOLDER" -type f -name "*.html"); do
			# Remove references to stylesheets in all files
			sed -i -E 's/^.*(rel="stylesheet|\<script|btn).*//g' $file
			sed -i 's/<span>Content/<br><span>Content/g' $file
			# Fix svg images being too big (scaling without limit)
			sed -i 's/<\/head>/\t<style>img[src$="svg"] { max-height: 1em; } #index-contents-img { max-width: 7.6em; }<\/style>\n<\/head>/' $file
		done
	}

	if [ $# -eq 0 ]; then
		improveForTINY

	
	else
		startTimer
			improveForTINY
		endTimer "[Stage 3] Tiny website improvements"
	fi
# }}}