aboutsummaryrefslogtreecommitdiffstats
path: root/bin
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
parent1b5bfd89244367acf86fcf311dbddacd22bd7b14 (diff)
downloadwebsite-66d48a7a4c98383e5baef20d352a3d2e4e681a6a.tar.gz
bin: Generation scaffold
Diffstat (limited to 'bin')
-rwxr-xr-xbin/ssg113
-rw-r--r--bin/ssg-template166
2 files changed, 279 insertions, 0 deletions
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 <<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
+
+ # 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
+ 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 "<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.