XProcでサイトを作る練習
Calabash3 (XProc 3処理系)の導入
Morganaの方が3系の現在の完成度はある? かもしれない。詰まったら考える。
- GitHubでPre-Releaseをダウンロード。このページのjarファイルは単体動作するものではないっぽい? あんまり分かっていない。とりあえずzipをダウンロード。
https://github.com/xmlcalabash/xmlcalabash3/releases/tag/2.99.11 - jdkが環境に入っていなかったので導入。
-
unzip
してディレクトリごと置きたい場所に置く。bin/xml-calabash(シェルスクリプト)に実行権限付与。必要ならaliasなりPATHなりを張る。
「XProc is 何」ということで、ざっくりとして日本語情報がこれくらいしかない気がする。 https://blog.antenna.co.jp/ILSoft2/archives/12025
単体HTMLファイルを生成するパイプラインを作ってみる
XMLPress刊の『XProc 3.0 Programmer Reference』(Erik Siegel)から書き換えたりして進めているのでやっていることが若干歪。XMLPressは公式サイトからPDF版が買えるのでKindleよりもおすすめ。
<!-- index.xpl -->
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" version="3.0">
<p:input port="source" primary="true" href="dum.xml">
</p:input>
<p:output port="result" primary="true" pipe="result@create-index">
<p:documentation>Our primary output will be the XML document for the
accounting system</p:documentation>
</p:output>
<p:xslt name="create-index">
<p:with-input port="stylesheet" href="../xsl/index.xsl"/>
</p:xslt>
<p:store href="../index.html"/>
</p:declare-step>
現時点ではXSLT 2.0よろしく、XMLファイルをダミーの入力ファイルにしている。
最終出力はoutputのportなのだが、p:storeで中間出力を取り出している。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:array="http://www.w3.org/2005/xpath-functions/array"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns="http://www.w3.org/1999/XHTML"
exclude-result-prefixes="#all"
expand-text="yes"
version="3.0">
<xsl:output method="html" encoding="UTF-8" indent="yes" include-content-type="no" html-version="5.0"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="/*" name="xsl:initial-template" mode="#all">
<html>
<xsl:attribute name="lang" select="'ja'"/>
<head>
<title>Virtual Ones</title>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width,scale=1.0"/>
</head>
<body>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSLTの方がindex.htmlに載せるべきコンテンツがないのだよぬ。最終的には他のコンテンツページからフィルタした内容をまとめる感じにしてパイプラインランゲージの面目躍如したい。
こんな感じに実行。
$ /opt/calabash/bin/xml-calabash xpl/index.xpl
p:empty
によって入力を明示的に空にできる。
しかしpipelineの性質上xsl:initial-templateを呼ぶようなことはできるのだろうか。
やりたいこととしてはビルド対象リストを渡すようなことになるから問題ないといえばないが
Webサイトを作る場合、トップページのindex.htmlにはよくnewsがくる。簡単なリンクや見出し程度の内容になるはず、というかそれ以上にすべきではなく、情報量としてはJSONでやりとりできる程度。
これは静的にビルドをして作るのはモダンではない、というかnewsのためにトップページをリビルドしたくないので、JSONで送りこんだ情報をShadowDOMとして展開する感じにしてしまうことにしよう。JSONをどこから送りこむかという話になるが、JSONをindex.htmlと同じ階層に置いたって困りはしないはず。
p:add-attribute@matchで、matchしたパターンに対し属性の追加ができる。p:insertでは要素の挿入もできる。地味にXSLTでは無駄が多い処理なので活用したいが、処理部をXSLTファイルに切り出すという方針と折り合いをつける必要がある。
- 入力XMLには含まない付加データ footer部をここでの挿入にするとか
- WAI-ARIAの、現在ページか否かを示す属性など
『XProc 3.0 Programmer Reference』でもXSLTとの使い分けについてはある程度好みの問題であるような旨が書かれている?
最初の入力に何があると嬉しいかというと、多分ビルド対象情報とメタデータまわりで、これにJSONを使うことを考える。
{
"base":"hogefuga.github.io",
"default":{
"title":"Virtual Ones Web Site",
"author":"hidaruma",
"theme":"my-theme"
},
"pages":
[
{ "path":"/",
"role":"index",
"theme":"index",
"id":"index",
"parts":[]
},
...
]
}
<p:xslt>
で@template-name
指定で名前付きテンプレート実行できるらしい!
Morgana XProc IIIのDockerfileを書いてみる。起動確認までしかしてない。LABELの現在の作法がよく分かっていない。
FROM eclipse-temurin:17
ARG VERSION="1.1.2"
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
LABEL "org.opencontainers.image.description"="personal build of Morgana XProcIII"
LABEL "org.opencontainers.image.title"="Morgana XProcIII personal image"
RUN export DEBIAN_FRONTEND=noninteractive && \
apt-get update -q && \
apt-get install -qy --no-install-recommends -y unzip locales tzdata && \
rm -rf /var/lib/apt/lists/*
RUN curl -sLo /tmp/MorganaXProc-IIIse-$VERSION.zip https://sourceforge.net/projects/morganaxproc-iiise/files/MorganaXProc-IIIse-$VERSION/MorganaXProc-IIIse-$VERSION.zip \
&& unzip -qq /tmp/MorganaXProc-IIIse-$VERSION.zip -d /tmp/ \
&& rm /tmp/MorganaXProc-IIIse-$VERSION.zip \
&& mkdir -p /opt/morgana \
&& mv /tmp/MorganaXProc-IIIse-$VERSION/* /opt/morgana/ \
&& rmdir /tmp/MorganaXProc-IIIse-$VERSION \
&& chmod 755 /opt/morgana/Morgana.sh
RUN useradd -ms /bin/bash morgana && \
chown -R morgana:morgana /opt/morgana
USER morgana
ENV MORGANA_HOME=/opt/morgana
WORKDIR $MORGANA_HOME
ENTRYPOINT ["sh","/opt/morgana/Morgana.sh"]