Automatically create a jekyll blogpost from a template. An editor is launched to edit the post, after it exits, the current date and time is added to the preamble and it is saved under a filename containing date and mangled article title into _posts. Optionally launches a jekyll server while editing the draft and commits the resulting blogpost.
#!/bin/sh | |
# The file extension to use for the post | |
FMT="markdown" | |
# Maximum length title used in filename | |
MAXLEN=32 | |
# Wether or not to start a jekyll server for the draft | |
START_JEKYLL=true | |
# Wether to automatically commit the post or not | |
AUTOCOMMIT=true | |
# …even when the working tree is dirty | |
FORCE_DIRTY=false | |
# …even with staged changes | |
FORCE_STAGED=true | |
# Commit-message to use. $target will be replaced with the file written, $title | |
# with the shortened title, $fulltitle with the full title. Add more slashes to | |
# escape properly. | |
COMMIT_MSG='Add post $title\\n\\nTitle: $fulltitle' | |
# Automatically push the commit. Requires the repo to be set up, such that „git push“ just works™ | |
AUTOPUSH=false | |
set -e | |
success () { | |
echo $1 | |
exit 0 | |
} | |
fail () { | |
fmt=$1 | |
shift | |
printf "$fmt\n" $@ | |
exit 1 | |
} | |
[ -d _drafts ] || fail "No _drafts directory!" | |
draft=`mktemp --tmpdir=_drafts "XXXXXXXX.$FMT"` | |
cat > $draft <<EOF | |
--- | |
layout: post | |
title: "Sometitle" | |
--- | |
EOF | |
$START_JEKYLL && jekyll serve --drafts -w . > /dev/null 2>&1 & jekyll_pid=$! | |
for ed in $VISUAL $EDITOR vim emacs nano | |
do | |
command -v $ed > /dev/null || continue | |
$ed $draft | |
break | |
done | |
$START_JEKYLL && kill -INT $jekyll_pid | |
end=`tail -n +2 $draft | grep -n -- --- | head -c -5` | |
fulltitle=`head -n $end $draft | grep -o -P '(?<=title: ")[^"]*'` | |
title=`echo -n "$fulltitle" | tr -cd "A-Za-z0-9 " | tr "A-Z " "a-z-" | head -c $MAXLEN` | |
target=`date +"_posts/%Y-%m-%d-$title.$FMT"` | |
head -n $end $draft > $target | |
echo "date:" `date +"%Y-%m-%d %H:%M:%S"` >> $target | |
tail -n +$(($end+1)) $draft >> $target | |
rm -f $draft | |
$AUTOCOMMIT || success $target | |
git diff --quiet || $FORCE_DIRTY || fail "Dirty worktree, won't commit.\nFile written to $target" | |
git diff --staged --quiet || $FORCE_STAGED || fail "Unstaged changes, won't commit.\nFile written to $target" | |
git add $target | |
commitmsg=`mktemp --tmpdir "jekyll-commit-msg-XXXXXXXX"` | |
eval "echo $COMMIT_MSG" > $commitmsg | |
git commit -e -F $commitmsg || git reset HEAD $target || echo $target | |
rm -f $commitmsg | |
$AUTOPUSH || exit 0 | |
git push |
#!/bin/sh | |
TARGET=/var/www/vhosts/merovius.de/subdomains/blog/http | |
tempdir=`mktemp --tmpdir -d jekyll_build-XXXXXXXX` | |
env -i git clone --depth 1 file://`pwd` $tempdir | |
jekyll build -s $tempdir -d $TARGET | |
rm -rf $tempdir |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment