xfy technology についての備忘録です。
やっと自宅のネットワーク環境が復活しました。 xfy Basic Edition 1.3 がリリースされてから少し経ってしまいましたが、 Unknown XVCD を xfy Basic Edition 1.3 用に改訂しました。
h:html 要素のスタイル指定 (height プロパティ) を削除しました。xfy Basic Edition 1.3 Beta までは、未知の XML ボキャブラリ (でマークアップされた部分) のレンダリング領域が間延びしてしまうのを防ぐために、 h:html 要素のスタイル指定 (height プロパティ) が必要でした。 xfy Basic Edition 1.3 からは、その必要がなくなった模様です。
xvcd:plain-text) を明示しました。xfy Basic Edition 1.3 Beta までは、テキストノードの値をプレーンテキストとして扱えなかった (?) ので、空白類文字だけから成るテキストノードが正しく出力されませんでした (filler 属性値または xvcd:filler 要素の内容が出力されてしまう)。 xfy Basic Edition 1.3 からは、データ型としてプレーンテキスト型 (xvcd:plain-text) を明示できるようになったので、空白類文字だけから成るテキストノードが正しく出力されるようになりました。
XVCD の理解を深めるために、 (DocBook の勉強も兼ねて) DocBook 用のボキャブラリコンポーネントを XVCD で作ってみようと思います。といっても、いきなり DocBook の仕様すべてをサポートするようなボキャブラリコンポーネントを作るのは大変なので、まずは DocBook のサブセットとなる簡易的な XML ボキャブラリを想定し、それをサポートすることを目指します。
今までは〜用の XVCD を作るという表現を用いてきましたが、今後は〜用のボキャブラリコンポーネントを XVCD で作るという表現を用います。これは、 2 種類のボキャブラリコンポーネント (「VC デスティネーション用のボキャブラリコンポーネント」と「ボキャブラリコネクションで実現したボキャブラリコンポーネント」) の違いを明確にするためです。
DocBook のサブセットとして、下記の XML ボキャブラリを想定します。
XML 文書の構造は、単一かつ単階層のセクション構造とする。複数階層 (章、節、項など) のセクション構造は持たない。
セクションは、タイトル、パラグラフ、プログラムリスト (特殊なパラグラフ) で構成される。リストや図、表などは含まない。
タイトル、パラグラフ、プログラムリストは、内容としてテキストだけを持つ。インライン要素はいっさい持たない。
メタ情報用の要素はいっさい考慮しない。属性も、 DocBook のバージョンを示すためのものだけとする。
名前空間 URI は、 DocBook V5.0 (2006-08-24 現在、ワーキングドラフト) のものを使う。
<?xml version="1.0" encoding="utf-8"?> <article xmlns="http://docbook.org/ns/docbook" version="5.0"> <title>文書のタイトル (title)</title> <para>パラグラフ (paragraph)</para> <programlisting>プログラムリスト (program listing)</programlisting> </article>
この XML ボキャブラリに対し、下記の機能を実装します。
各要素が表示される。
各要素の内容 (テキストノード) を編集できる。
まず、各要素を表示するために、ルートテンプレートと要素ノード用のテンプレート (4 種類) とを定義します。要素ノード用のテンプレートでは、次のように DocBook の各要素を XHTML の各要素にマッピングしています。
db:article → h:html + h:body
db:title → h:h1
db:para → h:p
db:programlisting → h:pre
<?xml version="1.0" encoding="utf-8"?>
<xvcd:xvcd version="1.0"
xmlns:xvcd = "http://xmlns.xfy.com/xvcd"
xmlns:db = "http://docbook.org/ns/docbook"
xmlns:h = "http://www.w3.org/1999/xhtml">
<xvcd:vocabulary match="db:article" call-template="root" name="db:article"/>
<xvcd:template name="root">
<xvcd:apply-templates select="."/>
</xvcd:template>
<xvcd:template match="db:article">
<h:html>
<h:body>
<xvcd:apply-templates select="child::db:*"/>
</h:body>
</h:html>
</xvcd:template>
<xvcd:template match="db:title">
<h:h1>
<xvcd:apply-templates/>
</h:h1>
</xvcd:template>
<xvcd:template match="db:para">
<h:p>
<xvcd:apply-templates/>
</h:p>
</xvcd:template>
<xvcd:template match="db:programlisting">
<h:pre>
<xvcd:apply-templates/>
</h:pre>
</xvcd:template>
</xvcd:xvcd>
この XVCD スクリプトを前述の XML 文書に適用すると、次のようになります。
次に、各要素の内容 (テキストノード) を編集できるようにするために、テキストノード用のテンプレートを追加します。
:
<xvcd:template match="text()">
<xvcd:text-of select="."/>
</xvcd:template>
:
また、見栄えを整えるためにスタイル定義 (下記) を追加します。
行間: 1/3 行分
段落前の余白: 1 行分
段落後の余白: 1/2 行分
下ボーダー: 1/10 文字分、 60% のグレー、実線
文字サイズ: 本文の 1.73 倍 (= 1.2 倍 * 1.2 倍 * 1.2 倍)
文字位置: 右寄せ
段落前の余白: なし
段落後の余白: 1 行分
段落前の余白: なし
段落後の余白: 1 行分
上下のパディング: 1/4 行分
左右のパディング: 3/4 文字分
左ボーダー: 1/4 文字分、 60% のグレー、実線
背景色: 93% のグレー
この XVCD スクリプトを前述の XML 文書に適用すると、次のようになります。
現時点での XVCD スクリプトです。
引き続き、 DocBook 用のボキャブラリコンポーネントに手を加えていきます。
DocBook 用のボキャブラリコンポーネントとして、下記の機能を実装します。
各要素が表示される (実装済み)。
各要素の内容 (テキストノード) を編集できる (実装済み)。
要素が空要素用の場合 → プレースホルダを示す文字列が表示される。
空要素用のプレースホルダを表示するために、各 xvcd:apply-templates 要素内に xvcd:filler 要素を記述します。プレースホルダには、下記の文字列を表示します。
文書のタイトル (db:title 要素): タイトル
パラグラフ (db:para 要素): パラグラフ
プログラムリスト (db:programlisting 要素): プログラムリスト
:
<xvcd:template match="db:title">
<h:h1>
<xvcd:apply-templates>
<xvcd:filler>
<h:var class=" xvcd:filler ">
<xvcd:text-of select="." filler="タイトル"/>
</h:var>
</xvcd:filler>
</xvcd:apply-templates>
</h:h1>
</xvcd:template>
<xvcd:template match="db:para">
<h:p>
<xvcd:apply-templates>
<xvcd:filler>
<h:var class=" xvcd:filler ">
<xvcd:text-of select="." filler="パラグラフ"/>
</h:var>
</xvcd:filler>
</xvcd:apply-templates>
</h:p>
</xvcd:template>
<xvcd:template match="db:programlisting">
<h:pre>
<xvcd:apply-templates>
<xvcd:filler>
<h:var class=" xvcd:filler ">
<xvcd:text-of select="." filler="プログラムリスト"/>
</h:var>
</xvcd:filler>
</xvcd:apply-templates>
</h:pre>
</xvcd:template>
:
また、プレースホルダ用のスタイル定義 (下記) を追加します。
文字色: 78% のグレー
背景色: 99% のグレー
この XVCD スクリプトを前述の XML 文書に適用すると、次のようになります。
上記で xvcd:filler 要素を追加した xvcd:apply-templates 要素群は、 (xvcd:text-of 要素の filler 属性値を除いて) すべて同じ構造をしています。記述の重複を避けるために、これらの xvcd:apply-templates 要素を名前付きテンプレート (テンプレート名: apply-templates.with-filler) として切り出します。
:
<xvcd:template name="apply-templates.with-filler">
<xvcd:param name="filler"/>
<xvcd:apply-templates>
<xvcd:filler>
<h:var class=" xvcd:filler ">
<xvcd:text-of select=".">
<xvcd:filler>
<xvcd:value-of select="$filler"/>
</xvcd:filler>
</xvcd:text-of>
</h:var>
</xvcd:filler>
</xvcd:apply-templates>
</xvcd:template>
:
apply-templates.with-filler テンプレートにはパラメータが一つ備わっています (パラメータ名: filler)。このテンプレートを呼び出す際は、プレースホルダに表示したい文字列を filler パラメータに指定して呼び出します。
:
<xvcd:template match="db:title">
<h:h1>
<xvcd:call-template name="apply-templates.with-filler">
<xvcd:with-param name="filler" select="'タイトル'"/>
</xvcd:call-template>
</h:h1>
</xvcd:template>
<xvcd:template match="db:para">
<h:p>
<xvcd:call-template name="apply-templates.with-filler">
<xvcd:with-param name="filler" select="'パラグラフ'"/>
</xvcd:call-template>
</h:p>
</xvcd:template>
<xvcd:template match="db:programlisting">
<h:pre>
<xvcd:call-template name="apply-templates.with-filler">
<xvcd:with-param name="filler" select="'プログラムリスト'"/>
</xvcd:call-template>
</h:pre>
</xvcd:template>
:
現時点での XVCD スクリプトです。