aboutsummaryrefslogtreecommitdiffstats
path: root/bin/ssg
blob: 28eeea07701e126798c18dfe04485b8246f52055 (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
#!/bin/sh

TEMPLATE="templates/default.html"
STATIC_DIRS="style img"
TMP_FILE=".tmp"
SRC="src"
OUT="out"
#BASE_URL=""

. ./bin/ssg-template

_log() {
	echo [${0}] "$@"
}

_to_html() {
	# 1: filename
	# stdout: content
	lowdown --html-no-skiphtml --html-no-escapehtml "${1}"
}

_install() {
	# 1: filename
	install -D "${TMP_FILE}" $(_get_out_path "${1}")
}

_template_heredoc() {
	echo ". ${PWD}/bin/ssg-template" > "tmp/heredoc"
	echo "cat <<EOF_TEMPLATE" >> "tmp/heredoc"
	cat "${1}" >> "tmp/heredoc"
	echo EOF_TEMPLATE >> "tmp/heredoc"

	sh "tmp/heredoc" "${1}" > "${TMP_FILE}"
	_to_html "${TMP_FILE}" > "${2}"
}

_convert_urls() {
	# file url
	if ! echo "${2}" | grep "^http" >/dev/null; then
		sed -i "s@href=/@href=$2/@g" "${1}"
	fi
	sed -i "s@<a[^>]* href=\"[/^\"]*/@<a href=\"$2/@g" "${1}"
	sed -i "s@<link[^>]* href=\"[/^\"]*/@<link href=\"$2/@g" "${1}"
	sed -i "s@<img[^>]* src=\"[/^\"]*/@<img src=\"$2/@g" "${1}"
}

main() {
	local file
	local out_path

	# template files
	for template in header footer; do
		_log "> ${template}"
		_to_html "templates/${template}.md" > "${TMP_FILE}"
		install -D "${TMP_FILE}" "tmp/${template}.html"
	done

	# markdown files
	for file in $(find "${SRC}" -iname "*.md"); do
		out_path=$(_get_out_path "${file}")

		if [ "${file}" -ot "${out_path}" ]; then
			_log "! ${file}"
			continue
		fi

		_log "> ${file}"

		# Metadata
		_cleanup_tmp_file "tmp/metadata.html"
		_render_metadata "${file}" > "tmp/metadata.html"

		# Table of content
		_cleanup_tmp_file "tmp/toc.html"
		if [ $(_get_value "${file}" "toc") ]; then
			_render_toc "${file}" > "tmp/toc.html"
		fi

		# Index of directory
		_cleanup_tmp_file "tmp/index.html"
		if [ $(_get_value "${file}" "index") ]; then
			_render_index "${file}" > "tmp/index.html"
		fi

		# Render body content
		_to_html "${file}" > "tmp/body.html"

		# Erase body content with templating
		if basename "${file}" | grep "^_"; then
			_template_heredoc "${file}" "tmp/body.html"
		fi

		# Concatenate temporary files to final page
		template=$(_get_value "${file}" "template")
		template="${template:-default}"
		m4 "templates/${template}.html" > "${TMP_FILE}"
		install -D "${TMP_FILE}" "${out_path}"
	done

	# html files
	for file in $(find "${SRC}" -iname "*.html"); do
		_log "> ${file}"
		_install "${file}"
	done

	# convert urls
	for file in $(find "${OUT}" -iname "*.html"); do
		_convert_urls "${file}" "${BASE_URL}"
	done

	for dir in ${STATIC_DIRS}; do
		_log "> ${dir}/"
		cp -R "src/${dir}" "out/${dir}"
	done
}

main
remember that computers suck.