VimでiCalendarっぽいものをxmlっぽいものにする。

なんか曖昧なタイトルですいません。
仕様調べてないので(お
もしかしたらvCardとかいうのが正しい名前なのかも。


真夜中にふとicsをいじろうと思って、でもネットワークが無くて、わざわざPHSで繋ぐ程でもないなぁ...
と、いうことでvimでなぜかics to xml変換方法を探ってた。


とりあえず必要そうなのは

  • エスケープ。何をエスケープすればいいかは不明。"<",">","&"ぐらい?
  • 改行を繋ぐ。どうやら72文字あたりで改行しないと行けないらしい。次の行の先頭がスペースなら連結。
  • ヘッダの挿入
  • BEGIN:hogeに。END:hogeに。
  • hoge:fugaをfugaに。
  • hoge;name=value:fugaをfugaに。

ぐらいなのかな?


これくらいならvimでできるべー。ということで、こんなファイルを用意。

:%s#&#&amp;#g
:%s#<#&lt;#g
:%s#>#&gt;#g
:%s#$\n ##
ggO<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>^[:set ft=xml
:%s#^BEGIN:\(.*\)$#<\1>#
:%s#^END:\(.*\)$#</\1>#
:%s#^\([^;:]*\)\(;\([^:=]*\)=\([^:]*\)\)\?:\(.*\)$#<\1 \3="\4">\5</\1>#
:%s# ="">#>#
gg=G:w! %<.xml
:q!

途中にある^[は"Ctrl-v Esc"でエスケープ文字を入力ですじゃ。
このファイルを"ics2xml.vim"の様な名前で保存して、

$ vim -s ics2xml.vim cal.ics

するとcal.icsがxmlに変換されてcal.xmlが発生すると。


まぁ、つなり何が言いたいかというと、vim -s hogehogeを標準入力とみなして(?)vimにマクロ的というかバッチ的な処理ができるよーぐいらいの話。
とことでiCalendarの;name=valueの部分って複数現れないのかな?現れるとアウトなんだよな...これ。
というかそもそも仕様を読まずになるなという話か...。


icsのC/C++向けパーサライブラリってころがってねぇのかなぁ。
むぅ。