DSSSLという古のSchemeが使えるスタイルシート言語を使ってみよう
Lisp Advent Calendar 1日目の記事です。
本記事は、hello-world程度の内容なので、進んだ内容は別の記事になります(予定)。
DSSSLとは
DSSSLは、SGMLというマークアップ言語向けの古のスタイルシート言語です。Scheme subsetな言語でスタイルを記述することができます。現代で最も有名なスタイルシート言語はCSSですが、複雑なことを抽象化したりできなさそうです。DSSSLはあまり流行らなかったそうですが、おもしろそうに思えます。
DSSSLは、ディッセルと読みます。Document Style Semantics and Specification Languageの略です。
DSSSLを使う
今回の説明では、OpenJadeというソフトウェアを使います。
SGMLファイルとDSSSLファイルを入力し、CSSやリッチテキストなどの文書を出力してくれます。UbuntuやGentoo Linuxの標準パッケージマネージャからインストールできます。
OpenJadeでリッチテキストを作る例は次ように入力します。
スタイル情報であるDSSSL(-d sample.dsl)と文書データであるSGML(sample.sgm)、そして出力形式を指定(-t rtf)し、出力ファイル名を与えます(output.rtf)。
openjade -t rtf -d sample.dsl -o output.rtf sample.sgm
それから、dssslからCSSを出力には次のように入力します。なぜかOpenJadeではHTMLをついでに出力してくれないのですが、SGMLからHTMLは機械的に変換できるのでそれほど問題にはならないでしょう。
openjade -t html -d sample.dsl -o output.css sample.sgm
DSSSLでのScheme
DSSSLは、R4RS Schemeのサブセットでスタイルを記述します。
省かれている機能は、ペアを壊すような操作set-c{a,d}rなどの副作用周りの手続きです。
スタイルの定義では、ptなどの大きさの単位を使うことがありますが、これが含まれていても演算できるような拡張になっています。
DSSSLの簡単な例
まず、スタイルを流し込みたいSGML文書の例です。
実質XMLで、例えば、<some-name>は、HTMLでいるところの<div id="some-name">のようなものです。<sample>は、ページ名を定義していて、<header>、<body>、<footer>はそれぞれの段落名としました。
<sample>
<header> aaaaaaa </header>
<body>bbbbbb</body>
<footer>ccccccc</footer>
</sample>
で、この文書に流し込むDSSSLの例です。
<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN">
<style-sheet>
<style-specification-body>
(element sample
(make simple-page-sequence))
(element head
(make paragraph))
(define (make-rgb-color r g b)
(color (color-space "ISO/IEC 10179:1996//Color-Space Family::Device RGB")
(/ r 255) (/ g 255) (/ b 255)))
(element body
(make paragraph
space-before: (* 240pt 2)
color: (make-rgb-color 255 0 0)
font-size: 12pt
))
(element footer
(make paragraph))
</style-specification-body>
</style-sheet>
DSSSLは、冒頭の!DOCTYPEの宣言とstyle-sheet、style-specification-bodyタグ内に記述する必要があります。<sample>や、<header>など、指定した要素のスタイル定義するには、(element tag-name)とします。
ページの定義は、(make simple-page-sequence)とし、(例では、ヘッダやフッタを入れていますが、simple-page-sequence自体にそれらを定義する機能があったりします)、パラグラフの定義は (make paragraph)とします。
スタイルの内容は、makeの中の第三要素以降に書いていきます。スタイル名(末尾が:のもの)と値の組になっています。
最後に、未定義の部分は適宜補完されていますが、出力の例です。
SPAN.BODY {
font-family: Times New Roman,serif;
font-weight: 500;
font-style: normal;
font-size: 12pt;
color: #ff0000;
}
SPAN.FOOTER, SPAN.HEADER, SPAN.SAMPLE {
font-family: Times New Roman,serif;
font-weight: 500;
font-style: normal;
font-size: 10pt;
color: #000000;
}
DIV { margin-top: 0pt; margin-bottom: 0pt; margin-left: 0pt; margin-right: 0pt }
DIV.FOOTER {
text-align: left;
line-height: 12pt;
text-indent: 0pt;
}
DIV.BODY {
margin-top: 480pt;
text-align: left;
line-height: 12pt;
text-indent: 0pt;
}
おわり
本記事では、DSSSLのコマンドと簡単な例を示しました。
別の機会に進んだ内容を書く予定です。
Discussion