aboutsummaryrefslogtreecommitdiffstats
path: root/bin/func
diff options
context:
space:
mode:
Diffstat (limited to 'bin/func')
-rw-r--r--bin/func187
1 files changed, 187 insertions, 0 deletions
diff --git a/bin/func b/bin/func
new file mode 100644
index 0000000..af81d92
--- /dev/null
+++ b/bin/func
@@ -0,0 +1,187 @@
+#!/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
+ <span>
+ $(__get_value_date_human ${2})
+ </span>
+ EOF
+ fi
+
+ cat <<-EOF
+ <a href="$(__get_final_filename ${2})">
+ $(__get_value_title ${2})
+ </a>
+ 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 "<ul class=\"index\">"
+
+ for _file in $(__list_files_date "${_index_dir}"); do
+ [ "${1}" = "${_file}" ] && continue
+ __get_value "${_file}" "draft" >/dev/null && continue
+
+ echo "<li>"
+ __generate_index_line "${1}" "${_file}"
+ echo "</li>"
+ done
+
+ echo "</ul>"
+}
+
+__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
+}
remember that computers suck.