#!/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' ~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/