Hatena::ブログ(Diary)

hishidaのblog このページをアンテナに追加 RSSフィード

プロフィール

hishida

hishida

EB series support page 管理人 ブログ

2017-10-19

[][] EBStudio リニューアル計画(3) XMLライブラリ

おさらいすると、EBStudioでは次のようにHTMLからEPWINGへの変換をサポートしている。

辞書系のコンテンツ

EBStudioの設計を行ったのは1999年頃だが、辞書や書籍の入力ソース形式をHTMLにしたのは正解だったと思っている。HTMLなら理解が簡単で、プログラマでなくても記述が容易だ。なによりも辞書コンテンツはすでにSGMLなどの何らかのマークアップ言語で記述されていることが多いはずで、HTMLなら既存のマークアップ言語からの変換が簡単だからである。当時はXML1.0が出たばかりで、利用が広がるかどうかはわからなかった。

さてHTMLXMLを解釈するには構文を解釈するパーサーが必要だが、当時はデファクトといえるパーサーのライブラリがなかった。当時利用できたC言語XMLパーサーのなかで今日も命脈を保っているライブラリとしてはexpatがあるが、結局EBStudioではexpatは使わずにパーサーを自作した。

実はこのパーサーを自作したことが、EBStudioの欠点の一つになった。その後XML関連の技術はXSLTやXPointerを始め大きく発展したが、EBStudioではこれらが使用できない。きちんとしたHTML/XMLパーサーを搭載したいという構想はずっと持っていた。

Libxml2

今回のリニューアルでは、広く使われているXML CパーサーであるLibxml2を採用した。Libxml2はHTML/XMLの両方がパースでき、DOM,SAX,XSLT,XPointerに対応している。

The XML C parser and toolkit of Gnome

Libxml2のライセンスはMIT Licenseなので商用でも利用できる。ただし、Libxml2と同時に使用する文字コード変換ライブラリであるlibiconvはLGPLなので、商用に使うには問題がある。調べたところ、libiconvの代わりにicuが使用出来ることが分かった。

VC++でxmlを扱おう - libxml2の紹介

ただし、従来の自前のHTMLパーサーも残してあって、どちらのパーサーを使うかを選択できる。なぜなら、EBStudioを前提とした変換ツールキットがネット上に多数存在するので、下位互換性を残しておかないといけないからだ。

JepaX,DicX,LeXMLについて

さてXMLが利用できますと言っても、XMLは拡張可能なマークアップ言語に過ぎなくて、マークアップされた要素が見出しなのか、本文なのか、検索キーなのかを指定しなければならない。

実は日本電子出版協会(JEPA)出版データフォーマット標準化研究委員会が定めた出版物交換用XMLフォーマットJepaXというものがあり、Ver0.9で仕様が止まっているが、出版業界内部では利用されていると聞いている。

このJepaXをさらに辞書向けに改良したDicXという仕様案(イースト株式会社)もあったのだが、DicXはすでにメンテナンスがされておらず、サイトも消滅している。

その後DicXの後継規格として株式会社ディジタルアシストが策定したLeXMLが普及し、出版業界ではデファクトになっている。

JEPA|日本電子出版協会 LeXMLとは?

EBStudioのリニューアルにあたっては、一応これらの規格との整合性を考えておかないといけない。

新パーサーの考え方

ではJepaXとLeXMLをサポートすればいいのかということだが、サポートしても恩恵をうけるユーザはほとんどいないという結論に達した(ディジタルアシストさんは確実に喜ぶと思うけど)。

結局、EBStudio2の新パーサーでも、基本はHTML4.0とXHTML1.0を使用することにした。EPWINGは利用できる書式指定が限られており、HTMLでも十分なことが多いのと、利用者もHTMLに慣れているからだ。

ただし部分的にLeXMLの要素を利用したいケースがどうしてもある。具体的には、辞書の検索インデックスを指定したい場合だ。

EBStudioでは <h1>〜<h6>タグと<dt>タグは検索キーになるという仕様だが、それ以外に本文上は現れない検索インデックスをつけたい場合がある。

DicX/LeXMLには<key>という専用の要素が定義されており、従来のEBStudioでも、HTMLに対する独自の拡張仕様として利用できた。だがこれはHTMLとしては文法違反であり、Libxml2を使うならちゃんと整合性をとらないといけない。

そこで次のようにXMLネームスペースを利用して、XHTMLで記述してもらう。これならXMLとして正当だ。

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"
		xmlns:lexml="http://www.d-assist.com/lexml">

<lexml:key type="かな">ああようがん</lexml:key>

既存のXMLへの対応

既存のXMLコンテンツがあった場合に、EBStudioで変換したい場合にどうするかだが、今のところは、「XSLTXHTML に変換してね」、というスタンスだ。

だが、既存のXMLの各要素に対して、個別に [見出し語] [本文] [検索キー] [修飾要素] ... のように意味を割り当てる方法もありえる。これなら既存のXMLをそのまま読ませることが可能なので、たとえばWikipediaXMLを読ませることもできるかもしれない。

こちらも将来の追加開発で検討したい。