何か Killed って言われるので6時から3時にしてみた。Ruby で日記の XML をセクションごとに HTML にわけるところで Killed。mknmz も中途半端に終わったらしく NMZ.lock2 が残ってた。謎。
CRON で殺される。
横スクロール
img 要素がはみ出したり、Gecko では URI が折り返されなかったりで横スクロールがでるけど確実にうざいので対策。
CSS で img { max-with: 100% }
, p, dt, dd, li { overflow: hidden }
にしてみた。どんな弊害があるかしら。
と思ったら後者で float したところに流れ込まなくなった。なんでだろう。
float させてる中に画像があると大きさが 0 になっちゃうか。だめだなこりゃ。さくじょー
XSLT と XPath の理解
とりあえずカレントノードとコンテキストノード。
カレントノード = current()
で、コンテキストノード = self::node()
。カレントノードは XSLT のもの。XPath には current()
という関数はないし、そもそも必要ない。
current()
が変わるのは xsl:template
又は xsl:for-each
。選択 (select) されたノードが current() になる。
self::node()
が変わるのは /
, [
]
。(別に変わるとは限らない……)
基準点とノードテストがまだあんまり理解できてない……
画像をてきとーに一覧表示する。
/view-img/2003/ みたいな。
RDF は画像ファイル自身に埋め込んだのを取り出していちいち動的に合成してる。現状では同じディレクトリに samp-meta.rdf があるからそっち直接読んでもいいんだけど……実験ってことで……
合成するとき REXML 使ってるから怪しい XML (名前空間接頭辞が他のファイルと違うとか) があるとたぶんパースエラーになる。稀なケースだし Ruby のライブラリでガッチリキッチリ実装した使いやすいやつを知らないので仕方ない。
ローカル側では RDF を埋め込む (ファイル名に -meta.rdf をつけたやつを突っ込む) ときに画像サイズが一定以上だったらサムネイルを作って、その情報 (foaf:thumbnail
) も追加して埋め込む。
サーバー側は同じディレクトリの画像をスキャンして RDF を取り出し、@rdf:about
を書き換えて合成。合成したヤツを XSLT エンジンに渡す。あとはまぁ普通に XSLT テンプレの仕事で……
ちなみにファイル名のリストは別に XML 作って渡してる。丁度いい語彙があれば RDF に RDF として突っ込んだほうがスマートだけど考えるのが面倒だった。
だいぶソースが汚い。
Sablotron にノード集合を渡す。
XSLT エンジンにノード集合渡したいことが多々あるけど、params にナマの XML を渡しても当たり前にサニタライズされたただの文字列が渡るだけ。じゃあどうすりゃいいねんと諦めていたわけだけど、FOAF Explorer のソース見ててわかった。arguments のほうに XML とか XSLT とか渡すのと同じように渡せばいいんだ。
Sablotron は arguments を内部的に URI として (スキーム arg:) 扱っているから、そっちに適当に渡してやればやりほうだいらしい。エロイ。
$arguments = array( '/_xml' => file_get_contents($xml), '/_xsl' => file_get_contents($xsl), '/foo' => "<test><f>aa</f><f>bb</f></test>" ); $result = xslt_process($xh, 'arg:/_xml', "arg:/_xsl", NULL, $arguments);
で、XSLT 側からは document('arg:/foo')
でアクセスできる。結局 <xsl:param name="foo" select="document('arg:/foo')"/>
とかやっとけば OK。Sablotron イイ