aboutsummaryrefslogblamecommitdiffstats
path: root/bin/ssg-template
blob: d2460284450f2da472a134240c2f8db3344c25e2 (plain) (tree)





































































































































































                                                                             
#!/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.