diff options
author | Romain Gonçalves <me@rgoncalves.se> | 2021-08-07 18:20:38 +0200 |
---|---|---|
committer | Romain Gonçalves <me@rgoncalves.se> | 2021-08-07 18:20:38 +0200 |
commit | 66d48a7a4c98383e5baef20d352a3d2e4e681a6a (patch) | |
tree | 752afac2d229577c71c1859b6c597a89e59dbd2e /bin/ssg-template | |
parent | 1b5bfd89244367acf86fcf311dbddacd22bd7b14 (diff) | |
download | rgoncalves.se-66d48a7a4c98383e5baef20d352a3d2e4e681a6a.tar.gz |
bin: Generation scaffold
Diffstat (limited to 'bin/ssg-template')
-rw-r--r-- | bin/ssg-template | 166 |
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>" +} |