Posted on February 7, 2010 and tagged as programmierung.

... oder "Wenn Designer jetzt PHP Code schreiben, dann muss ich meine Wordpress Installation abdrehen".

Ich war gestern auf den Barcamp Klagenfurt 2010 und nahm zufällig an einer Session zum Thema "Wordpress Themes" teil. Danach hab ich den festen Entschluss gefasst meine Wordpress Installation zu löschen und gegen statische HTML Seiten zu tauschen. Wie ich das gemacht habe möchte ich hier zeigen.

Problemstellung

Da ich nicht auf einer grünen Wiese ohne Inhalt für meinen Blog anfangen wollte, musste ich erst einmal meine bisherigen Seiten in einem vernünftigen Format aus dem Wordpress heraus bekommen. Leider ist das nicht so einfach, es gibt zwar viele Konverter die mir Inhalt ins Wordpress rein bringen, aber heraus bekommen es nur wenige. Ich habe mich dann schlussendlich für das Ruby Tool Jekyll entschieden. Diese Tool, welches selbst ein "static site generator" ist, möchte ich aber nur in der Migration Phase verwenden, danach bzw. jetzt setze ich Hyde für die Generierung meiner Seiten ein.

Wordpress Seiteninhalte auslesen mit Jekyll

Erstmal die nötigen Software installieren. In meinem Fall auf einem Debian Lenny Server.

Das es das Jekyll nicht als Debian Packet gibt, muss man es von hand installieren. Erst einmal Ruby und Compiler ...

apt-get install ruby ruby1.8-dev rubygems build-essential libmysqlclient15-dev

Jetzt Jekyll ...

gem sources -a http://gems.github.com
gem install mojombo-jekyll

Nun weitere Ruby Packete die das Jekyll braucht ...

gem install mysql
gem install sequel
gem install rake-compiler -v 0.5.0

Da im Lenny ein zu altes rubygems vorhanden ist, quick & dirty aus dem unstable installieren ...

wget http://ftp.de.debian.org/debian/pool/main/libg/libgems-ruby/rubygems1.8_1.3.5-2_all.deb
dpkg -i rubygems1.8_1.3.5-2_all.deb

Nun das letzte Ruby Packet ...

gem install hoe

Jetzt kann man mit Jekyll den Wordpress Seiten Inhalt auslesen ...

export DB=my_wordpress_db
export USER=dbuser
export PASS=dbpass

ruby -r '/var/lib/gems/1.8/gems/mojombo-jekyll-__VERS__/lib/jekyll/converters/wordpress' \
     -e 'Jekyll::WordPress.process("#{ENV["DB"]}", "#{ENV["USER"]}", "#{ENV["PASS"]}")'

Nun hat man im Verzeichnis "_posts" alle seine Wordpress Inhalte.

Da ich auf meinen Server keine Ruby installiert haben will und schon garnicht einen Compiler, fliegt alles wieder runter. Zu erste die Debian Packete ...

apt-get --purge remove cpp cpp-4.3 gcc gcc-4.3 libc6-dev libgmp3c2 libgomp1 \
libmpfr1ldbl libruby1.8 linux-libc-dev ruby ruby1.8 ruby1.8-dev apt-file \
libapt-pkg-perl libconfig-file-perl liblist-moreutils-perl menu irb1.8 \
libreadline-ruby1.8 rdoc1.8 rubygems rubygems1.8 build-essential dpkg-dev \
g++ g++-4.3 libstdc++6-4.3-dev libtimedate-perl make libmysqlclient15-dev \
zlib1g-dev

Danach die installierten Rubygems ...

rm -rf /var/lib/gems

Von Dr. Jekyll zu Mr. Hyde

Nun ist der Weg geebnet und ich konnte auf Hyde umsteigen. Ich bin dabei einer Anleitung von Steve Losh gefolgt, der seine Seite ebenfalls mit Hyde betreibt. Da es mit Beispielen immer leichter geht, kann ich noch Steve Losh Git empfehlen, in dem man den kompletten Code seiner Seite sieht.

Hier ist noch ein Script was die umgewandelten Wordpress Postings in die Hyde Verzeichnis Strutur umwandelt. Ich glaub der Code ist selbst erklärend.

#!/usr/bin/env bash

outdir="www.ca-net.org/content/blog/"
indir="_posts"

mkdir -p $outdir

cd $indir
for f in *; do
  # get some metainfo from filename and file content
  year=`echo $f | cut -f1 -d'-'`
  month=`echo $f | cut -f2 -d'-'`
  day=`echo $f | cut -f3 -d'-'`

  # get post title
  title=`grep "title: " $f | cut -f2- -d":"`
  # strip \" from title
  title=${title//\\\"/}
  # strip " from title
  title=${title//\"/}

  # convert url encoded german umlaute
  title=${title//\\xC3\\xBC/ü}; title=${title//\\xC3\\x9C/Ü}; 
  title=${title//\\xC3\\xB6/ö}; title=${title//\\xC3\\x96/Ö}; 
  title=${title//\\xC3\\xA4/ä}; title=${title//\\xC3\\x84/Ä};

  # strip file extension
  fwe=`basename $f .markdown`

  # create output dir
  mkdir -p ../$outdir/$year/$month

  # build output file name
  outfile="../$outdir/$year/$month/`echo $fwe | cut -f4- -d'-' | tr -s '-' '_'`.html"

  # write hyde heady
  cat - << __EOF__ > $outfile
{ % extends "_post.html" %}

{ % hyde
    title: "$title"
    created: $year-$month-$day
    categories: ["private"]
%}

{ % block article %}
__EOF__

  # write content
  tail +7 $f >> $outfile

  # write hyde footer
  echo "{ % endblock %}" >> $outfile
  echo "$outfile created"
done

Achtung: Im Script sind die 2 Zeichen "{" und "%" mit einen Leerzeichen dazwischen, bitte im abgespeicherten Script bei euch ab ändern.