Ich habe hier schon über meine ersten Umstiegsschritte nach Octopress berichtet. Dabei habe ich es versäumt euch mein Exportskript mit an die Hand zu geben, mit dem ich meine Wordpress Artikel nach Octopress Markdown exportiert habe. Das will ich nun nachholen.

Zunächst müsst ihr eure Wordpress-Daten im Wordpress Interface nach XML exportieren. Diese Datei müsst ihr dann diesem Skript zum Fraß vorwerfen. Aber Vorsicht: Das Skript bekommt Probleme mit der XML Syntax, wenn ihr eure Seite flattrbar gemacht habt. Diesen globalen “Flattr this Page” RSS-Link solltet ihr also vorher entfernen.

Hier dann mal mein Skript:

require 'fileutils'
require 'date'
require 'yaml'
require 'rexml/document'
include REXML

doc = Document.new File.new(ARGV[0])

FileUtils.mkdir_p "_posts"

doc.elements.each("rss/channel/item[wp:status = 'publish' and wp:post_type = 'post']") do |e|
    post = e.elements
    slug = post['wp:post_name'].text
    date = DateTime.parse(post['wp:post_date'].text)
    name = "%02d-%02d-%02d-%s.markdown" % [date.year, date.month, date.day, slug]
    date_string = date.year.to_s + "-" + date.month.to_s + '-' + date.day.to_s

    categories = []
    post.each('category') do |cat|
        categories << cat.text
    end

    content_text = post['content:encoded'].text
    content = content_text.encode("UTF-8")

    content = content.gsub(/<code>/, '{% codeblock %}')
    content = content.gsub(/<\/code>/, '{% endcodeblock %}')
    content = content.gsub(/\[c\]/, '{% codeblock %}')
    content = content.gsub(/\[\/c\]/, '{% endcodeblock %}')
    content = content.gsub(/\[xml\]/, '{% codeblock %}')
    content = content.gsub(/\[\/xml\]/, '{% endcodeblock %}')    
    content = content.gsub(/\[plain\]/, '{% codeblock %}')
    content = content.gsub(/\[\/plain\]/, '{% endcodeblock %}')      
    content = content.gsub(/<pre>/, '{% codeblock %}')
    content = content.gsub(/<pre lang="([^"]*)">/, '{% codeblock %}')
    content = content.gsub(/<\/pre>/m, '{% endcodeblock %}')

    # replace image urls
    content = content.gsub(/http:\/\/funkenstrahlen.de\/wp-content\/uploads/,'../../../../../content')
    
    (1..3).each do |i|
        content = content.gsub(/<h#{i}>([^<]*)<\/h#{i}>/, ('#'*i) + ' \1')
    end

    puts "Converting: #{name}"

    data = {
        'layout' => 'post',
        'title' => post['title'].text,
        'date' => date_string,
        'comments' => true,
        'categories' => categories
     }.delete_if { |k,v| v.nil? || v == ''}.to_yaml

     File.open("_posts/#{name}", "w") do |f|
         f.puts data
         f.puts "---"
         f.puts content
     end
 
end

Weitere Artikel