#!/usr/bin/env bash
BUILD=.build/
function extract_metadata() {
name=$1
file=$2
val=$(sed -nE "/^--${name}: .+$/s/^--${name}: (.+)$/\1/p" $file)
if [ -z "$val" ]; then
echo ""
return 1
else
echo "$val"
return 0
fi
}
function mktemp_file() {
name=$1
var=$(mktemp -p $BUILD "${name}_XXXXXX")
echo "${var}"
return 0
}
function generate_index() {
base_dir=$1
echo "Generating index for $base_dir"
page_file=$(mktemp_file "index_page")
content_file=$(mktemp_file "index_content")
title=$(basename ${base_dir})
echo "
${title} index
" > $content_file
find $base_dir -type f -iname "*.html" \
-exec echo "{} " \; >> $content_file
echo "
" >> $content_file
sed -i "s,${base_dir},.,g" $content_file
generate_page "index" $content_file $page_file
# strip out the footer
sed -i '1,/<\/footer>/{//,$d}' $page_file
echo "Copying $page_file to $base_dir/index.html"
cp $page_file $base_dir/index.html
echo "Searching for more directories to index"
for dir in $base_dir/*; do
if [ ! -d $dir ]; then
continue;
fi
generate_index $dir
done
}
# generates the base page structure
# any "special" functions can go in their various code_paths
function generate_page() {
type=$1
content_file=$2
page_file=$3
echo "Using $page_file for file"
cat _templates/page.html > $page_file
echo "Using $content_file for content"
sed -i "/^--/d" $content_file
echo "Injecting content from $content_file into $page_file"
sed -i -e "/CONTENT/ {
r ${content_file}
d}" $page_file
echo "Injecting CSS into $page_file"
sed -i -e "/STYLE/ {
r _templates/index.css
d}" $page_file
echo "Extracting page title"
page_title=$(sed -nE "/<\/h1>/s,.*(.+) .*,\1,1p" $content_file)
sed -i -E "s/[{]PAGE_TITLE[}]/$page_title/1" $page_file
echo "Setting type"
if [ -z "$type" ]; then
sed -i -E "s/[{]TYPE[}]//" $page_file
else
sed -i -E "s,[{]TYPE[}],/${type}," $page_file
fi
return 0
}
echo "Clearing build-cache"
rm -rf $BUILD
mkdir $BUILD
echo "Cleaning up prod folders"
echo "Deleting www"
rm -rf www
mkdir www
echo "Deleting gemini"
rm -rf gemini
mkdir gemini
echo "Building html"
# TODO
for post in _posts/*.html; do
post_date=$(extract_metadata "post-date" $post)
if [ -z "$post_date" ]; then
# post is not ready to be posted
# requires a post date
echo "No data"
continue;
fi
updated_at=$(extract_metadata "updated-at" $post)
tags=$(extract_metadata "tags" $post)
type=$(extract_metadata "type" $post)
post_file=$(mktemp_file "post")
content_file=$(mktemp_file "content")
updated_html_file=$(mktemp_file "updated_html")
tags_html_file=$(mktemp_file "tags_html")
echo "Copying $post data into $content_file"
cp $post $content_file
generate_page $type $content_file $post_file
echo "Setting post date"
sed -i -E "s/[{]POST_DATE_ISO[}]/${post_date}/" $post_file
display_date=$(date -d "${post_date}" +"%B %d, %Y")
sed -i -E "s/[{]POST_DATE_DISP[}]/${display_date}/" $post_file
echo "Setting updated at"
if [ -z "$updated_at" ]; then
sed -i -E "s/[{]UPDATED[}]//" $post_file
else
updated_disp=$(date -d "${updated_at}" +"%B %d, %Y")
echo " Updated at: ${updated_disp} " \
> updated_html_file
sed -i -e "/UPDATED/{ r ${updated_html_file} d}" $post_file
fi
echo "Setting tags"
if [ -z "$tags" ]; then
sed -i -E "s/[{]TAGS[}]//" $post_file
else
echo "Using tags file $tags_html_file"
echo " Tags: [ ${tags} ]" > $tags_html_file
sed -i -e "/TAGS/ {
r $tags_html_file
d}" $post_file
fi
echo "Copying temp_file to www/"
filename=$(basename $post)
if [ "$type" == "blog" ]; then
year=$(date -d "$post_date" +%Y)
month=$(date -d "$post_date" +%m)
day=$(date -d "$post_date" +%d)
mkdir -p www/blog/$year/$month/$day
cp $post_file www/blog/$year/$month/$day/$filename
else
cp $post_file www/$filename
fi
done
echo "Copying static-html"
cp -r static-html/* www/
echo "Copying res to www"
cp -r res/ www/media/
echo "Building http rss"
# TODO
./tidy.sh
echo "Generating index files"
dir="www/blog"
generate_index "$dir"
echo "Building gmi"
# TODO
echo "Copying static-gemini"
cp -r static-gemini/ gemini/
echo "Copying res to gemini"
cp -r res/ gemini/media/
echo "Building gemini atom"
# TODO