そもそも何故 XML を使いたかったかというと、独自のスキーマ (および検証) と独自の変換 (XML → HTML) を柔軟に用意したかったからなんだよな
もっといえば、データ構造の定義とその変換自体をデータとして記述できることが望ましかった。
よーするにプログラムみたいなもんだ
XML 技術スタックであれば XML, XSLT, RelaxNG および XHTML, SVG, MathML, XLink, etc. があるのでその辺りの「構造と変換を記述」が十分に可能だった (処理系が充実してるとは言ってない)
此度の私の迷走は、これらの XML 規格の処理系が貧弱である以上、構造と変換の記述を Rust でネイティブにやった方がよくない? という発想に基いている。
ただ、 Rust での XML 関連も負けず劣らず貧弱だった (←しってた)。
で、ちょっと思ったんだけど、基本的に DOM のフル機能が欲しい場面って実はそんなにない気がしていて (たとえば XPath とかはかなり関数型寄りな言語仕様だけど実用上はそこそこ使える)、であればさっさと DSL を定義してしまった方が実は早いのではと。
構造定義と変換の定義をできる軽めの DSL を定義したうえで、その処理系を実装してやればいい。
不幸中の幸いと言うべきか、 DOM の実装は煩雑で充実度が低いが、 SAX / StAX のようなストリーミングパーサの実装は Rust でも選べるくらいにはある (はず)
DSL でなく処理系が API を露出したうえで WASM とかで変換器を置いておいた方が一般性があるのでは? ともちょっと思ったけど、結局その WASM を吐くための元言語でのコードも一緒に置いておかないと変更がままならなくなるし、元言語でそんなに充実した変換器が書けるなら最初からネイティブでやれと
というわけで、次の目標は DSL をでっちあげることです (白目)
XSLT はつらいし、 XPath はつらいし、どうすりゃいいんだ……
思うに XPath のつらさは infoset を前提にしているところが一因なのではと
https://mastodon.cardina1.red/@lo48576/105174713705125707
これ s/XPath/XSLT/g やんな
普通に HTML に class とか data-foo とかの属性であれこれメタデータ付けてやるスタイルもn年前から検討しているんだけど、やっぱり footnote まわりとかいろいろを考えると弱いのよね。
たとえば [1] とか [2] とか [2a] とかのようなマーカーを CSS の疑似要素を使わずに出したいみたいなことを考えると、どうしても XSLT みたいな外部の変換を通すことになるし、だったら敢えて拡張なしの HTML で意味論の曖昧な属性をベタベタ貼り付けるのは微妙かなと
なぜ疑似要素が駄目かというと、あいつらコピーしたときテキストとしてクリップボードに入ってこないから。
ブラウザで選択してコピーされない文字列は装飾にしか使えない
あとは、データ構造を記述するうえで普通に toml とか json のような外部形式を使いたいというのもある。
これやると結局 XSLT 1.0 では足りないので、ネイティブロジックで変換を書くのは避けられない
SNS の投稿を引用するとき ActivityPub の JSON をポンと置いておけば自動的に整形されるとか、ほしいじゃん?
(javascript を使えとかいう意見は絶対に認めない)