From 66d48a7a4c98383e5baef20d352a3d2e4e681a6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Gon=C3=A7alves?= Date: Sat, 7 Aug 2021 18:20:38 +0200 Subject: bin: Generation scaffold --- bin/ssg | 113 +++++++++++++++++++++++++++++++++++++ bin/ssg-template | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 279 insertions(+) create mode 100755 bin/ssg create mode 100644 bin/ssg-template (limited to 'bin') diff --git a/bin/ssg b/bin/ssg new file mode 100755 index 0000000..f47f819 --- /dev/null +++ b/bin/ssg @@ -0,0 +1,113 @@ +#!/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 <> "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@]* href=\"[/^\"]*/@]* href=\"[/^\"]*/@]* src=\"[/^\"]*/@ ${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 + if [ "${file}" -ot $(_get_out_path "${file}") ]; 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 + m4 templates/default.html > "${TMP_FILE}" + install -D "${TMP_FILE}" $(_get_out_path "${file}") + 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 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 "
    " + for key in ${_ENABLED_METADATA}; do + value=$(lowdown -X "${key}" "${1}" 2>/dev/null) + [ -z "${value}" ] && continue + + echo "
  • ${key}: ${value}
  • " + done + echo "
" +} + +_render_index() { + # 1: filename + # 2: out + # 3: path + local file + local path + local title + + echo "
" +} + +_render_toc() { + local chapter + local chapter_title + + echo "
    " + for chapter in $(_get_chapters "${1}"); do + chapter_title=$(_get_chapter_title "${chapter}") + + cat <<-EOF +
  • + ${chapter_title} +
  • + EOF + done + echo "
" +} -- cgit v1.2.3