Statische Kommentare in Octopress

Geschrieben von Eric Scheibler am 06.01.2013

Hier möchte ich meine Lösung für statische Kommentare in Octopress beschreiben. Die Idee kommt von Matt Palmer. Ich habe seinen Ansatz genommen und ihn an meine Wünsche angepasst.

Download des Archives: static_comments.zip.

im Ordner source/_includes/custom/ befindet sich die Datei “comment_template.html”. Diese stellt ein einfaches HTML Formular zur Verfügung, in das der Kommentar eingegeben werden kann. Wenn schon Kommentare vorhanden sind, stellt es diese ferner in einer Liste dar.

Das Template muss in die bereits durch das Standardtheme existierende Datei “source/_layouts/post.html” integriert werden und zwar mit dieser Zeile (ohne die “"):

{% include custom/comment_template.html %}

Ich habe sie in Zeile 18 unterhalb der Page sharing Links eingefügt.

Wird nun ein Kommentar erstellt, so wird er von dem PHP Skript unter source/comment-sites/ verarbeitet und an die angegebene E-Mail Adresse geschickt. Das Shell Skript add_blog_comment.sh parst die angekommene E-Mail und erstellt den Kommentar als Textdatei im Ordner source/_comments:

#!/bin/bash

blog_dir="$HOME/Dokumente/octopress"
comments_dir="$blog_dir/source/_comments"
comment=""
copy="no"

if [ -z "$1" ]; then
    tmp_file="/tmp/comment"
else
    tmp_file="$1"
fi

if [ ! -d "$blog_dir" ]; then
    echo "The blog directory does not exist"
    exit 1
fi
if [ ! -d "$comments_dir" ]; then
    echo "The comments directory does not exist"
    exit 2
fi
if [ ! -f "$tmp_file" ]; then
    echo "No temporary comment file to add"
    exit 8
fi

# parse the temp comment file
no_comment="false"
while read line
do
    if [[ $line == post_id* ]]; then
        copy="yes"
        title=$(echo "$line" | cut -d '/' -f6)
    fi
    if [[ $line == date:* && $copy == "yes" ]]; then
        date=$(echo "$line" | cut -d ' ' -f2)
        time=$(echo "$line" | cut -d ' ' -f3 | sed "s/:/-/g")
    fi
    if [[ $line == name:* && $copy == "yes" ]]; then
        author=$(echo "$line" | cut -d ' ' -f2 | sed "s/'//g")
    fi
    if [[ $line == "comment: ''" && $copy == "yes" ]]; then
        no_comment="true"
    fi
    if [[ $copy == "yes" ]]; then
        if [ -z "$comment" ]; then
            comment="$line"
        else
            comment="$comment\n$line"
        fi
    fi
done < "$tmp_file"
file_name=$(echo "$date $time $author" | sed "s/ /-/g")

if [[ "$title" == "" || "$author" == "" || "$date" == "" || "$time" == "" || "$no_comment" == "true" ]]; then
    echo "Comment file is malformed"
    exit 9
fi

# create comment file in the comments directory
if [ ! -d "$comments_dir/$title" ]; then
    mkdir "$comments_dir/$title"
    if [[ $? > 0 ]]; then
        echo "Could not create the folder for the $title posting in the comments folder"
        exit 3
    fi
fi
if [ -f "$comments_dir/$title/$file_name" ]; then
    echo "The comment already exists"
    rm "$tmp_file"
    exit 7
else
    echo -e "$comment" > "$comments_dir/$title/$file_name"
    rm "$tmp_file"
    echo "Comment created successfully"
fi

# generate and deploy blog
cd "$blog_dir"
rake generate
chmod -R 755 "$blog_dir/public"
while :
do
    echo "Deploy? (j/n) "
    read answer
    case $answer in
        j*|J*|y*|Y*) break;;
        n*|N*|q*|Q*) exit 0;;
        *) continue;;
    esac
done
rake deploy
exit 0

Für das abrufen der Mails nutze ich Mutt und dort habe ich als Pager Vim angegeben. Um nun einen Kommentar bewilligen zu Können, öffne ich die Mail im Vim und starte das Shell Skript. Dazu muss die folgende Zeile in die ~/.vimrc:

" call the add blog comment shell script
nmap <silent> <leader>abc :! /path/to/add_blog_comment %<cr>

Der Leader key ist standardmäßig “", ich habe ihn aber auf das Komma umdefiniert:

" change leader key to ,
let mapleader=","

Somit kann ich einen Kommentar mittels ,abc bewilligen.