#!/bin/sh
source ./config.sh # Read the variables from a local config file
# Start clean (this is mirrored at the bottom)
rm -fr ~postbody.tmp ~rawpostbody.tmp ~fixedpostbody.tmp ~sqlcommand.sql ~subarticle.tmp ~subfeed.tmp $DBFILE $BUILDDIR
#########################
### CREATE A DATABASE ###
#########################
# Make a vanilla database
echo "Creating database"
sqlite3 $DBFILE "CREATE TABLE 'Posts' ('PostID' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 'PostTitle' TEXT NOT NULL, 'PostSlug' TEXT NOT NULL, 'PostDate' TEXT NOT NULL, 'PostBody' TEXT)"
# Insert posts into database
echo "Inserting posts into database"
for POST in $CONTENTDIR/*.md
do
# Get variables from post
POST_SLUG=$(basename "$POST")
POST_SLUG="${POST_SLUG%.md}"
POST_TITLE="$(sed '1q;d' $POST | sed ""s/\'/\'\'/g"")" # fixes single quote
POST_DATE="$(sed '2q;d' $POST)"
tail +6 $POST > ~postbody.tmp # The post body can be too long for a variable
# Fix post date to ISO8601 format
POST_DATE="$(date -jf '%Y-%m-%d %H:%M:%S' "$POST_DATE":00"" +'%Y-%m-%dT%H:%M:%SZ')"
# Generate a new body with double-single quotes (SQL-friendy)
cat ~postbody.tmp | sed "s/\'/\'\'/g" > ~fixedpostbody.tmp
echo "INSERT INTO ""Posts"" (""PostID"",""PostTitle"",""PostSlug"",""PostDate"",""PostBody"") VALUES (NULL,'$POST_TITLE','$POST_SLUG','$POST_DATE','" > ~sqlcommand.sql
cat ~fixedpostbody.tmp >> ~sqlcommand.sql
echo "');" >> ~sqlcommand.sql
sqlite3 $DBFILE < ~sqlcommand.sql
done
# Build HTML
echo "Building HTML"
# Copy template assets
mkdir -p $BUILDDIR/assets
cp -r $TEMPLATEDIR/assets $BUILDDIR
########################
### CREATE POST PAGE ###
########################
for POST_ID in $(sqlite3 $DBFILE "SELECT PostID FROM Posts;")
do
# Get the date
POST_DATE=$(sqlite3 $DBFILE "SELECT PostDate FROM Posts WHERE PostID IS $POST_ID;")
POST_YEAR=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE" +"%Y")
POST_MONTH=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE" +"%m")
POST_DAY=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE" +"%d")
POST_HOUR=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE" +"%H")
POST_MIN=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE" +"%M")
PRETTYDATE="$(date -jf '%Y-%m-%dT%H:%M:%SZ' $POST_DATE +'%A, %b %e, %Y, %I:%M%p')"
# Get the slug line
SLUG=$(sqlite3 $DBFILE "SELECT PostSlug FROM Posts WHERE PostID IS $POST_ID;")
# Get the post title
POST_TITLE=$(sqlite3 $DBFILE "SELECT PostTitle FROM Posts WHERE PostID IS $POST_ID;")
POST_TITLELINK=""$POST_TITLE""
# Get the post body (in HTML)
sqlite3 $DBFILE "SELECT PostBody FROM Posts WHERE PostID IS $POST_ID;" > ~rawpostbody.tmp
cat ~rawpostbody.tmp | markdown > ~postbody.tmp
# Create a post's file path
POSTDIR="$BUILDDIR/$POST_YEAR/$POST_MONTH/$POST_DAY/$SLUG"
mkdir -p $POSTDIR/
cp $TEMPLATEDIR/post.html $POSTDIR/index.html
# Replace template items
sed -i "" "s/\[\[\[!POST_TITLE!\]\]\]/$POST_TITLE/g" $POSTDIR/index.html
sed -i "" "s#\[\[\[!POST_TITLELINK!\]\]\]#$POST_TITLELINK#g" $POSTDIR/index.html
sed -i "" "s/\[\[\[!AUTHOR!\]\]\]/$AUTHOR/g" $POSTDIR/index.html
sed -i "" "s/\[\[\[!COPYRIGHT!\]\]\]/$COPYRIGHT/g" $POSTDIR/index.html
sed -i "" "s/\[\[\[!DATE!\]\]\]/$POST_YEAR-$POST_MONTH-$POST_DAY/g" $POSTDIR/index.html
sed -i "" "s/\[\[\[!PRETTYDATE!\]\]\]/$PRETTYDATE/g" $POSTDIR/index.html
sed -i "" "/\[\[\[!POST_BODY!\]\]\]/r ~postbody.tmp" $POSTDIR/index.html
sed -i "" "s/\[\[\[!POST_BODY!\]\]\]//g" $POSTDIR/index.html
# Detect images in the post body and copy them into the post's directory
for ATTACHMENT in $(cat ~rawpostbody.tmp | awk '/\[.+\] *\(.+\)/ {split($0, a, /\] *\(/);split(a[1], b, /\[/);split(a[2], b, /\)/);print b[1];}' | awk '{print $1}' | grep -v '\/')
do
cp $CONTENTDIR/$ATTACHMENT $POSTDIR
done
done
#########################
### CREATE INDEX PAGE ###
#########################
cp $TEMPLATEDIR/index.html $BUILDDIR
POST_ID1=$(sqlite3 $DBFILE "SELECT PostID FROM Posts ORDER BY PostDate;" | tail -rn 3 | sed '1q;d')
POST_ID2=$(sqlite3 $DBFILE "SELECT PostID FROM Posts ORDER BY PostDate;" | tail -rn 3 | sed '2q;d')
POST_ID3=$(sqlite3 $DBFILE "SELECT PostID FROM Posts ORDER BY PostDate;" | tail -rn 3 | sed '3q;d')
POST_TITLE1=$(sqlite3 $DBFILE "SELECT PostTitle FROM Posts WHERE PostID IS $POST_ID1;")
POST_TITLE2=$(sqlite3 $DBFILE "SELECT PostTitle FROM Posts WHERE PostID IS $POST_ID2;")
POST_TITLE3=$(sqlite3 $DBFILE "SELECT PostTitle FROM Posts WHERE PostID IS $POST_ID3;")
POST_SLUG1=$(sqlite3 $DBFILE "SELECT PostSlug FROM Posts WHERE PostID IS $POST_ID1;")
POST_DATE1=$(sqlite3 $DBFILE "SELECT PostDate FROM Posts WHERE PostID IS $POST_ID1;")
POST_YEAR1=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE1" +"%Y")
POST_MONTH1=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE1" +"%m")
POST_DAY1=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE1" +"%d")
POST_URL1="$POST_YEAR1/$POST_MONTH1/$POST_DAY1/$POST_SLUG1/"
POST_SLUG2=$(sqlite3 $DBFILE "SELECT PostSlug FROM Posts WHERE PostID IS $POST_ID2;")
POST_DATE2=$(sqlite3 $DBFILE "SELECT PostDate FROM Posts WHERE PostID IS $POST_ID2;")
POST_YEAR2=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE2" +"%Y")
POST_MONTH2=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE2" +"%m")
POST_DAY2=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE2" +"%d")
POST_URL2="$POST_YEAR2/$POST_MONTH2/$POST_DAY2/$POST_SLUG2/"
POST_SLUG3=$(sqlite3 $DBFILE "SELECT PostSlug FROM Posts WHERE PostID IS $POST_ID3;")
POST_DATE3=$(sqlite3 $DBFILE "SELECT PostDate FROM Posts WHERE PostID IS $POST_ID3;")
POST_YEAR3=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE3" +"%Y")
POST_MONTH3=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE3" +"%m")
POST_DAY3=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE3" +"%d")
POST_URL3="$POST_YEAR3/$POST_MONTH3/$POST_DAY3/$POST_SLUG3/"
# Reform the titles using the new post URLs
POST_TITLE1=""$POST_TITLE1""
POST_TITLE2=""$POST_TITLE2""
POST_TITLE3=""$POST_TITLE3""
PRETTYDATE1=$(sqlite3 $DBFILE "SELECT PostDate FROM Posts WHERE PostID IS $POST_ID1;")
PRETTYDATE1="$(date -jf '%Y-%m-%dT%H:%M:%SZ' $PRETTYDATE1 +'%A, %b %e, %Y, %I:%M%p')"
PRETTYDATE2=$(sqlite3 $DBFILE "SELECT PostDate FROM Posts WHERE PostID IS $POST_ID2;")
PRETTYDATE2="$(date -jf '%Y-%m-%dT%H:%M:%SZ' $PRETTYDATE2 +'%A, %b %e, %Y, %I:%M%p')"
PRETTYDATE3=$(sqlite3 $DBFILE "SELECT PostDate FROM Posts WHERE PostID IS $POST_ID3;")
PRETTYDATE3="$(date -jf '%Y-%m-%dT%H:%M:%SZ' $PRETTYDATE3 +'%A, %b %e, %Y, %I:%M%p')"
sqlite3 $DBFILE "SELECT PostBody FROM Posts WHERE PostID IS $POST_ID1;" > ~rawpostbody.tmp
cat ~rawpostbody.tmp | markdown > ~postbody.tmp
sed -i "" "s#\[\[\[!POST_TITLE1!\]\]\]#$POST_TITLE1#g" $BUILDDIR/index.html
sed -i "" "s#\[\[\[!POST_TITLE2!\]\]\]#$POST_TITLE2#g" $BUILDDIR/index.html
sed -i "" "s#\[\[\[!POST_TITLE3!\]\]\]#$POST_TITLE3#g" $BUILDDIR/index.html
sed -i "" "s/\[\[\[!PRETTYDATE1!\]\]\]/$PRETTYDATE1/g" $BUILDDIR/index.html
sed -i "" "s/\[\[\[!PRETTYDATE2!\]\]\]/$PRETTYDATE2/g" $BUILDDIR/index.html
sed -i "" "s/\[\[\[!PRETTYDATE3!\]\]\]/$PRETTYDATE3/g" $BUILDDIR/index.html
sed -i "" "/\[\[\[!BODY1!\]\]\]/r ~postbody.tmp" $BUILDDIR/index.html # Leftover from previous loop
sed -i "" "s/\[\[\[!BODY1!\]\]\]//g" $BUILDDIR/index.html
###########################
### CREATE ARCHIVE PAGE ###
###########################
mkdir $BUILDDIR/archive
cp $TEMPLATEDIR/archive.html $BUILDDIR/archive/index.html
# Run through all posts and get the url, title, and date
for POST_ID in $(sqlite3 $DBFILE "SELECT PostID FROM Posts ORDER BY PostDate;")
do
POST_TITLE=$(sqlite3 $DBFILE "SELECT PostTitle FROM Posts WHERE PostID IS $POST_ID;")
POST_SLUG=$(sqlite3 $DBFILE "SELECT PostSlug FROM Posts WHERE PostID IS $POST_ID;")
POST_DATE=$(sqlite3 $DBFILE "SELECT PostDate FROM Posts WHERE PostID IS $POST_ID;")
POST_YEAR=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE" +"%Y")
POST_MONTH=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE" +"%m")
POST_DAY=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE" +"%d")
POST_URL="$POST_YEAR/$POST_MONTH/$POST_DAY/$POST_SLUG/"
PRETTYDATE="$(date -jf '%Y-%m-%dT%H:%M:%SZ' $POST_DATE +'%A, %b %e, %Y, %I:%M%p')"
# Reform the titles using the new post URLs
POST_TITLE=""$POST_TITLE""
echo "
$POST_TITLE
$PRETTYDATE" > ~subarticle.tmp
sed -i "" "/\[\[\[!ARTICLE!\]\]\]/r ~subarticle.tmp" $BUILDDIR/archive/index.html
done
sed -i "" "s/\[\[\[!ARTICLE!\]\]\]//g" $BUILDDIR/archive/index.html # Get rid of placeholder
###################
### CREATE FEED ###
###################
cp $TEMPLATEDIR/feed.atom $BUILDDIR/$FEED
# Run through all posts and get the url, title, and date
for POST_ID in $(sqlite3 $DBFILE "SELECT PostID FROM Posts ORDER BY PostDate DESC LIMIT $FEEDITEMS;")
do
POST_TITLE=$(sqlite3 $DBFILE "SELECT PostTitle FROM Posts WHERE PostID IS $POST_ID;")
POST_SLUG=$(sqlite3 $DBFILE "SELECT PostSlug FROM Posts WHERE PostID IS $POST_ID;")
POST_DATE=$(sqlite3 $DBFILE "SELECT PostDate FROM Posts WHERE PostID IS $POST_ID;")
POST_YEAR=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE" +"%Y")
POST_MONTH=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE" +"%m")
POST_DAY=$(date -jf '%Y-%m-%dT%H:%M:%SZ' "$POST_DATE" +"%d")
POST_URL="$POST_YEAR/$POST_MONTH/$POST_DAY/$POST_SLUG/"
# Get the post body (in HTML)
sqlite3 $DBFILE "SELECT PostBody FROM Posts WHERE PostID IS $POST_ID;" > ~rawpostbody.tmp
cat ~rawpostbody.tmp | markdown > ~postbody.tmp
# Escape HTML in post body
sed -i "" 's/&/\&/g; s/\</g; s/>/\>/g; s/"/\"/g; s/'"'"'/\'/g' ~postbody.tmp
POST_BODY=$(cat ~postbody.tmp)
echo "$POST_TITLEhttp://$DOMAIN/$POST_URL$POST_DATE$AUTHORNAME$AUTHOREMAIL$POST_BODY" > ~subfeed.tmp
sed -i "" "/\[\[\[!ENTRY!\]\]\]/r ~subfeed.tmp" $BUILDDIR/$FEED
done
sed -i "" "s/\[\[\[!ENTRY!\]\]\]//g" $BUILDDIR/$FEED # Get rid of placeholder
UPDATETIME="$(date +'%Y-%m-%dT%H:%M:%SZ')"
sed -i "" "s/\[\[\[!UPDATETIME!\]\]\]/$UPDATETIME/g" $BUILDDIR/$FEED
# Cleaning up
echo "Cleaning up"
find $BUILDDIR/. -name '.*' -type f -delete
rm -f ~postbody.tmp ~rawpostbody.tmp ~fixedpostbody.tmp ~sqlcommand.sql ~subarticle.tmp ~subfeed.tmp $DBFILE
# Upload to S3
echo "Uploading to S3"
s3cmd sync --delete-removed -P $BUILDDIR/ s3://$S3BUCKET/