電書部の技術班。今年はこればっかりやっていた気がする。
gihyo.jpで、電書部の技術解説の記事「電書部技術班,電子書籍配信サーバーに挑む」がはじまっています。その中でEPUB変換まわりの原稿書きました。
第4回 電書用マークアップYDMLを使った原稿作成と,YDMLパーサ
第5回 電書原稿からEPUBをつくりだす
何気ないふうを装いつつも、少しどきどきしながらYDMLという言葉を出しました。でもどこからも何の突っ込みもなくてそれはそれでちょっとさみしいものです。
YDMLパーサ記事について「なんでXMLパーサでやらないの?」という趣旨のつっこみがtwitterで入りました。思い起こすとそもそもパーサジェネレータ作った理由は

  • YDMLとは違うマークアップを目論んでいた
  • DSLぽいものをRubyで作ってみたかった
  • とにかく作ってみたかった

そんなことでした。が、何をぼけていたのか、テキスト混合ノードはXML的にはwell-formedじゃないからという恥ずかしい説明をしてしまいました。恥ずかしいのでその経緯はリンクしません。(tweet消してはいないので探せばみつかります)
XMLでのvalidateくらいやってみるかと思い立ってやってみましたら、RelaxNGの勉強からはじめたのに1時間くらいで出来てしまい愕然としました。
YDMLを少しだけ改変(ルートのエレメント定義して、書式が変なタグを修正)してwell-formed XMLにしたものにたいして、RelaxNG compact syntaxでスキーマを定義し、それをcompactじゃないsyntaxに変換したうえでNokogiri::XML::RelaxNGに喰わせています。
ちゃんとvalidateはできるのですが、validじゃなかったときのエラーメッセージが分かりづらい。場合によっては分かりづらいを通り越して意味不明なので実用性低めです。でもせっかく作ったのでgithubにあげました。
https://github.com/skoji/ydml_simple_validator