VOOZH about

URL: https://zenn.dev/niyarin/articles/2b509ada6a351a

⇱ 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

👁 Image