aboutsummaryrefslogtreecommitdiffstats
path: root/bin/ssg-template
diff options
context:
space:
mode:
authorRomain Gonçalves <me@rgoncalves.se>2021-08-07 18:20:38 +0200
committerRomain Gonçalves <me@rgoncalves.se>2021-08-07 18:20:38 +0200
commit66d48a7a4c98383e5baef20d352a3d2e4e681a6a (patch)
tree752afac2d229577c71c1859b6c597a89e59dbd2e /bin/ssg-template
parent1b5bfd89244367acf86fcf311dbddacd22bd7b14 (diff)
downloadrgoncalves.se-66d48a7a4c98383e5baef20d352a3d2e4e681a6a.tar.gz
bin: Generation scaffold
Diffstat (limited to 'bin/ssg-template')
-rw-r--r--bin/ssg-template166
1 files changed, 166 insertions, 0 deletions
diff --git a/bin/ssg-template b/bin/ssg-template
new file mode 100644
index 0000000..d246028
--- /dev/null
+++ b/bin/ssg-template
@@ -0,0 +1,166 @@
+#!/bin/sh
+
+SRC_FILE="${1}"
+
+_echo_ifset() {
+ [ ! -z "${1}" ] && echo "${1}"
+}
+
+_get_value() {
+ # 1: filename
+ # 2: key
+ # stdout: value
+ local value=$(lowdown -T ms -X "${2}" "${1}" 2>/dev/null)
+ echo "${value:-${3}}"
+ return "${?}"
+}
+
+_get_value_date() {
+ _get_value "${1}" "${2}" "1970-01-01"
+}
+
+_get_out_path() {
+ # 1: filename
+ # stdout: filename
+ echo "${1}" | sed -e 's/^src/out/g' -e 's/.md$/.html/g' -e 's/_//g'
+}
+
+_get_final_path() {
+ # 1: filename
+ # stdout: filename
+ _get_out_path "${1}" | sed 's/^out\///g'
+}
+
+_get_title() {
+ # 1: filename
+ basename "${1}" | sed 's/\..*//g' | tr - " "
+}
+
+_get_date_human() {
+ # 1: filename
+ date -j -f "%Y-%m-%d" $(_get_value_date ${1} "date") +"%B %d, %Y"
+}
+
+_get_index_files() {
+ # 1: filename
+ local path
+
+ path=$(_get_value "${1}" index)
+ find "src/${path}" -mindepth 1 -maxdepth 1
+}
+
+_sort_index_per_date() {
+ # 1: filename
+ local files
+ local file
+ local date
+
+ for file in $(_get_index_files "${1}"); do
+ date=$(_get_value_date "${file}" "date")
+ files="${files} ${date}@${file}"
+ done
+
+ echo ${files} | tr " " "\n" | sort -rn | cut -d "@" -f 2
+}
+
+_get_filetype() {
+ # 1: filename
+ local filetype
+
+ filetype=$(ls -ld "${1}" | cut -c 1)
+
+ case "${filetype}" in
+ -)
+ filetype="file"
+ ;;
+ d)
+ filetype="directory"
+ ;;
+ esac
+
+ echo "${filetype}"
+}
+
+_get_chapters() {
+ # 1: filename
+ grep "^#" "${1}" | sed 's/# /#_/g'
+}
+
+_get_chapter_title() {
+ # 1: chapter
+ echo "${1}" | sed -e 's/#_//' -e 's/#//g'
+}
+
+_parse_option() {
+ # 1: metadata
+ # 2: key
+ echo "${metadata}" | grep "^${2}"
+}
+
+_cleanup_tmp_file() {
+ [ -f "${1}" ] && rm "${1}"
+}
+
+_parse_metadata() {
+ # 1: filename
+ sed -n '/^$/q;p' "${file}" | grep "^.*: .*$"
+}
+
+_render_metadata() {
+ # 1: filename
+ # 2: output
+ _ENABLED_METADATA="date author"
+ local key
+ local value
+
+ echo "<ul class=\"metadata\">"
+ for key in ${_ENABLED_METADATA}; do
+ value=$(lowdown -X "${key}" "${1}" 2>/dev/null)
+ [ -z "${value}" ] && continue
+
+ echo "<li>${key}: ${value}</li>"
+ done
+ echo "</ul>"
+}
+
+_render_index() {
+ # 1: filename
+ # 2: out
+ # 3: path
+ local file
+ local path
+ local title
+
+ echo "<ul class=\"index\">"
+ for file in $(_sort_index_per_date "${1}"); do
+ path=$(_get_final_path "${file}")
+ [ "${path}" = "$(_get_final_path ${1})" ] && continue
+
+ title=$(_get_value "${file}" "title" "$(_get_title ${file})")
+
+ cat <<-EOF
+ <li>
+ <a href="${path}">${title}</a>
+ <span>$(_get_date_human "${file}")</span>
+ </li>
+ EOF
+ done
+ echo "</ul>"
+}
+
+_render_toc() {
+ local chapter
+ local chapter_title
+
+ echo "<ul class=\"toc\">"
+ for chapter in $(_get_chapters "${1}"); do
+ chapter_title=$(_get_chapter_title "${chapter}")
+
+ cat <<-EOF
+ <li>
+ <a href=#${chapter_title}>${chapter_title}</a>
+ </li>
+ EOF
+ done
+ echo "</ul>"
+}
remember that computers suck.