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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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