2009-10-03
Common Lispで日常のちょっとした仕事
昔のブログのエントリーを新しくWordPressに移行するためにデータの中のURLを書き換える、というちょっとした仕事があったのですが、最初sedでやってみました。
一緒に仕事をしているWebデザイナーさんに
「やっぱりLISPでやったんですか?」と訊かれたんですが、
「いや、これは別の言語でやりました」
と答えたのが妙に心残りだったのでCLで書いてみました(笑)
やりたいことは、
MovableType形式のバックアップデータのエントリー中の画像リンクのURLの変換です。
"http://example.com/imgs/1/2/3/abcd.jpg"という形式なのですが、
"http://new.example.com/wp-content/uploads/imgs/1_2_3_abcd.jpg"という風に直します。
いざ、書いてみると、sed並に簡単に書けたりするので割と悪くないなと思います。
ただ、ちょっとしたものを書くにはwith-open-fileは長いので、Arc風にw/outfileなどのマクロを定義して置くともっと手軽に書き捨てられるかと。
…というか多少面倒でもCLで書いて行こうと誓いました(笑)
どういう作業形態になるかというと、下記のようなものをSlime上のバッファに書いて、適当に評価するという感じになります。
Emacsのスクラッチと大体似た感覚で、UNIXのシェルで色々やるのとは、ちょっと違った感じですが、慣れるとこれはこれで良い感じです。
;; ファイルを文字列のリストとしてとりこむ
(DEFVAR *OLD-BLOG* (KMRCL:READ-FILE-TO-STRINGS "/home/mc/Desktop/blog-backup.txt"))
;; CL-PPCRE:REGEX-REPLACE-ALLで使う関数("/"を"_"に変換する)
(DEFUN /->_ (MATCH 1ST 2ND)
(DECLARE (IGNORE MATCH 1ST))
(FORMAT NIL "~A" (SUBSTITUTE #\_ #\/ 2ND)))
;; これを評価
(LET ((SCANNER (PPCRE:CREATE-SCANNER "\"\\s*http://(image.)*example.com/imgs/([^\"]*)\""))
(REPLACE (LIST "\"/wp-content/uploads/imgs/" #'/->_ "\"")))
(WITH-OPEN-FILE (OUT "/tmp/result.txt" :DIRECTION :OUTPUT :IF-EXISTS :SUPERSEDE)
(DOLIST (LINE *OLD-BLOG*)
(FORMAT OUT
"~A~%"
(PPCRE:REGEX-REPLACE-ALL SCANNER LINE REPLACE :SIMPLE-CALLS 'T)))))
■