📖

DSSSLという古のSchemeが使えるスタイルシート言語を使ってみよう

2021/12/19に公開

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