«前の日記(2008-10-21 (火)) 最新 次の日記(2008-10-26 (日))»  

まちゅダイアリー


2008-10-24 (金)

絵日記プラグインから flickr プラグインへのマイグレーションツールを作った

先日から書いていたけど、tDiary の絵日記プラグイン (image.rb) から flickr プラグイン (flickr.rb) へ写真を移行するためのツールを作った。

簡単な説明

ツールがやってくれること
  • 絵日記プラグインでアップロードした写真を flickr へアップロードします
  • tDiary の日記データから、絵日記プラグインの呼び出しを flickr プラグインの呼び出しへ書き換えます
    • image, image_left, image_right の呼び出しに対応
要件
  • tDiary2.3.1以降で、日記データがUTF-8化されている必要があります
  • 日記がWiki記法で書かれている必要があります
ダウンロード

ファイルは CodeRepos にアップしました。

使い方

image2flickr.rb の USAGE をご覧ください。

メモ

古い日記データはバックアップするようにしたし、自分の環境では何度もテストしたけど、やっぱり日記データを書き換えるツールなので少し心配。 なので、Webから簡単に使えるようにはせずに、コマンドラインからの操作にした。 何かあれば、バックアップから日記データを戻すことができるくらいの知識があることを想定してる。 もうひとつの理由は、 flickr に写真をアップするのでCGI経由の起動だとタイムアウトになる可能性があるから。

flickr への写真のアップロードは、こないだの日記に書いたように rflickr ライブラリを使えば簡単にできた。

課題だった tDiary の日記データの書き換えは、こうやってみた。

  # imageプラグインをflickrプラグインへ置き換える
  def convert(yearmonth)
    @parser.each_diary(yearmonth) do |@date, diary|
      # 現在はWiki記法のみ対応
      diary.gsub!(/\{\{(image[^}]+)\}\}/) {|match|
        begin
          "{{#{eval($1)}}}"
        rescue => e
          # 例外が発生したら置換しない
          match
        end
      }
      diary
    end
  end

  def image(index, title = nil)
    replace("flickr", @date, index, title)
  end

  def image_left(index, title = nil)
    replace("flickr_left", @date, index, title)
  end

  def image_right(index, title = nil)
    replace("flickr_right", @date, index, title)
  end

やってることは、以下のとおり。

  1. 日記データから、"{{image...}}"という文字列を検索
  2. eval で image, image_left, image_right を呼び出し
  3. flickr プラグインへの置換文字列を返す

最初は普通に置換しようと思ったけど、プラグイン呼び出しの文字列のパースが面倒だった。 たとえば、スペースの数やシングルクオーテーションとダブルクオーテーションの違いとかね。 だったら、evalを使ってrubyに解釈してもらえばいいじゃん、と気がついて、今の形になった。 自分のスクリプトで、はじめて eval を使ったなぁ。

それから、途中でツールを中断しても再開できるように、気を配った。 日記データはバックアップから元に戻せるけど、flickr にアップした写真まで元に戻すのは大変だからね。

  • flickr にアップした写真ファイル名はYAMLで記録しておき、アップ済みのファイルは2度アップしない

なので、もし日記データの書き換えに失敗しても、YAMLファイルが残っていれば flickr へのアップはやり直す必要がない。

そういえば

久しぶりに Ruby のスクリプトを書いたなぁ。 PHP や Perl のあとに Ruby を書くと、最初は思わず $ や ; を付けそうになっちゃう。

Tags: tDiary Flickr