#!/bin/sh media_dir="media" src_dir="src" tmp_dir="tmp" out_dir="out" tmp_file="${tmp_dir}/tmp" __get_value() { # 1: filename # 2: Attribute name # Retrieve and return the key/value of a lowdown source file. lowdown -T ms -X "${2}" "${1}" 2>/dev/null } __get_value_title() { # 1: filename # Get the title of a file and return a safe string. local _title _title="$(__get_value ${1} title || true)" if [ "${_title}" = "" ]; then _title="$(basename ${1} | rev | cut -d "." -f 2 | rev | sed 's/-/ /g')" fi echo "${_title}" } __get_value_date() { # 1: filename # Get the date of a file and return a safe string. local _date _date="$(__get_value ${1} date || true)" if [ "${_date}" = "" ]; then _date="1970-01-01" fi echo "${_date}" } __get_value_date_human() { # 1: filename # Get a human readable date from a file and return a safe string. __get_value_date "${1}" | xargs date -j -f "%Y-%m-%d" +"%B %d, %Y" } __get_out_filename() { # 1: filename # Convert the source filename to its output destination. local _filename _filename="${1}" if $(__get_value "${1}" draft || false); then _filename="$(dirname ${1})/$(basename ${1} | sha256).html" fi echo "${_filename}" | sed 's/.md$/.html/g' | sed "s/${src_dir}/${out_dir}/g" } __get_final_filename() { # 1: filename # Convert the source filename to its final filename for a webserver. __get_out_filename "${1}" | cut -d "/" -f 2- } __list_files() { # 1: directory # List all regular files in a directory and its subdirectories. find "${1}" -type f } __list_files_date() { # 1: directory local _files local _file local _tmp_file _files=$(__list_files "${1}") _tmp_file="${tmp_file}.list_files_date" cp /dev/null "${_tmp_file}" for _file in ${_files}; do echo "$(__get_value_date ${_file})" "${_file}" >> "${_tmp_file}" done sort -r "${_tmp_file}" | cut -d " " -f 2- } __install() { # 1: filename # Copy a file to the output directory. install -D -m 0644 "${1}" "${2}" } __lowdown() { # Output a file to html lowdown --html-no-skiphtml --html-no-escapehtml "${1}" } __apply_template() { # 1: template name or default m4 "templates/${1:-default}" } __generate_index_line() { # 1: filename where index will be displayed # 2: filename contained in line local _show_date _show_date="$(__get_value ${1} index_date || echo false)" if "${_show_date}"; then cat <<-EOF $(__get_value_date_human ${2}) EOF fi cat <<-EOF $(__get_value_title ${2}) EOF } __generate_index() { # 1: filename # Generate and output to stdout the index of a file. local _file local _index_dir _index_dir="${src_dir}/$(__get_value "${1}" index)" [ -f "${_index_dir}" ] && _index_dir=$(dirname "${_index_dir}") [ ! -d "${_index_dir}" ] && return echo "" } __handle_md() { # 1: filename # Handle markdown files. __lowdown "${1}" > "${tmp_file}.body" if [ ! "$(__get_value ${1} index)" = "" ]; then __generate_index "${1}" > "${tmp_file}.index" else [ -f "${tmp_file}.index" ] && rm "${tmp_file}.index" fi __apply_template "$(__get_value ${1} template)" > "${tmp_file}" __install "${tmp_file}" "$(__get_out_filename ${1})" } __handle() { # 1: filename # Handle file depending on its filename and filetype. case "${1}" in *.md) __handle_md "${1}" ;; *) __install "${1}" "$(__get_out_filename ${1})" ;; esac }