思いつきでごにょったら Ruby のオブジェクトとして再現できた。めでたしめでたし。んでごちゃってみたけど用途すくな。読み込むだけだからなぁ……
CSS/Ruby
CSS/Ruby
スキャナ&パーサーだけで力尽きた…… racc css.y
ホントはアクション部分も少し書いたんだけど、どうも上手くいかないので削除って、とりあえず分離させておくことにしてみた。パーサーから構文木作るところって普通はどういう風に実装するだろう。再帰定義の部分で汚くなっちゃうんだよなぁ。スーパー簡単なサンプルが欲しい……
あーあと、Invalid なものが突っ込まれたとき、その部分を無視してパースを続ける、っていうのはどうやって書くんだろう。謎ががががが。
パースエラーは error に還元される。だから、右辺の正しい場所に error を置いとけば無視できると。CSS の ruleset を処理中にパースエラーが起きたら ruleset : error とか書いておけばそこを飛ばして次のやつを探す?みたいな? 適当にやってみよう。
error トークン書くと on_error 呼ばれないのか。なんかどういう風にエラーを処理するのかわからん。
Namazu
CRON で殺される。
何か Killed って言われるので6時から3時にしてみた。Ruby で日記の XML をセクションごとに HTML にわけるところで Killed。mknmz も中途半端に終わったらしく NMZ.lock2 が残ってた。謎。
横スクロール
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 イイ
暇なので最近のめも
cygwin sablotron
動かない。sabcmd は (たぶん) 動いてるけど、Ruby の sablot 作ろうと (ruby extconf.rb で) すると libsablot.a で大量にエラーが出る。検索しても何か妙に情報なし。壮大な勘違いでもしてるんだろうか?
ローカルにこれ入れられないといちいち XREA にうぷしてやらなきゃいけない……嫌だ。wakewakame.
画像メタデータを表示
とりあえず中途半端だけど書いた。画像に含まれる RDF を抽出して表示するだけ。そのうちちゃんと整形させたい。
nulog の画像参照については全部こっちにリンクが張られるようにした。nulog のデータの href とか src はそのままにして、img を含むリンクや、img 単体が存在する場合に view-img を付けてリンクをはる (はりなおす)
URI が微妙だよなぁ……もっといい感じにならないかなぁ。
特定ディレクトリ以下の画像を一覧表示 (サムネイルで。なければない旨の画像? サイズもちゃんと書いておいて条件分岐? 面倒) とかも面白いかなぁ……形にならないとよくわからない。
FOAF Explorer でのエラー
なんかエラーでるので原因を特定すると、foaf:nick に rdf:Alt があるとエラーになる。FOAF Explorer の XSLT を見てみると <xsl:template mode="title" match="*"> というテンプレートの中身が悪さしてる。xsl:choose で選択しているので上のほうに書いてある要素で rdf:Alt を含まなければエラーにならないんじゃないかと思ってやってみたらヒット。foaf:name は書いていなかったので適当に書いておいた。この回避法だと foaf:name を既に書いていてエラーが出る場合無理。あっちの対策を待ちましょうみたいな?
でもこっちで回避するより何かフィードバック送ったほうがいいだろうなぁ。っていっても既に誰か送ってると思うんだけど……むしろエンジンのエラーな気がする。
XSLT での name()
マジメな実装をするなら name() を select や @test で使う機会はまずないはず。 (もちろん name() をそのまま出力する用途では使うけど) そのかわりにちゃんと namespace-uri() と local-name() を使うはずだから。
今まで name() を使うときなんかひっかかりつつ使っていたけどやっと変なことに気付いた。
Namazu について
今まで散々 namazu と書いてきましたが、全部 Namazu の意味です。コマンドラインなんてつかたことない。
日記とか
xsl:param にノード集合を渡す。
予め xmlns:t="http://temporary/" とかやっておく。既存の空間が利用できるならそれ使ってもいいと思う。
<xsl:call-template name="tempfoo"> <xsl:with-param name="foo" xmlns="http://temporary/"> <foo>Foo</foo> <foo>Bar</foo> </xsl:with-param> </xsl:call-template>
<xsl:template name="tempfoo"> <xsl:param name="foo"/> <ol> <xsl:for-each select="$foo/t:foo"> <li><xsl:value-of select="."/></li> </xsl:for-each> </ol> </xsl:template>
<ol> <li>Foo</li> <li>Bar</li> </ol>
渡すほうに名前空間を指定しない場合は、(あたりまえだけど) デフォルトの空間になる。でもそのまま template のほうで接頭辞なしでアクセスしようとしても無理。
できないと思ってた方法ができると分かって、いろいろ楽できる! 諦めかけていたなか光をくれた (謎) 哀さん にありがとう
namazu スタイルシートをつくるときに、一個の option 要素ごとに selected を入れるかの if を作るのが面倒でごちゃごちゃやってた。だいぶスッキリしていい感じ。
ソース間違ってたのをちょっと修正。
新スタイル適用
少し修正してだいぶやる気がなくなったので適用。公開するとまたアレな部分がいっぱい見えてくる。不思議だ。
タイトルフォントについて書くのを忘れてた……
NULL の部分は Amerika Sans。残りの部分は Brie Light っつうフォントどす。
新しいスタイル
なんか殆どできちゃったけどまだ適用しない。IE の :first-child 非対応の対策のために元のマークアップを少し変えて (新しく class を導入) しまった。
結局配色について殆ど考えなかった。というか画像を今のスタイルから流用しているから、全体的に殆ど今のまま。
アクセシビリティツールもまだ使ってない。白ベースの青と黒だから殆ど問題ないと思うけどやっぱやってみなくちゃなぁ。
- 画像と重なる部分のナヴィゲーションが読み難い。
- 検索ページもちゃんとサイト全体と同じ CSS を適用する。
- 本文のスタイルをもっとちゃんと考える。
- もっと細かく
- 骨まで美味しく。
ColorDoctor を使って検証してみたけど、とりあえず大丈夫みたいだ。
それより、この ColorDocter メモリ : 256MB以上 (推奨 : 2GB以上)
って書いてあって 2GB 以上は嘘だろう、とか思ってたら本気でメモリ足りなくなった。むしろ最初起動すらしなかった。起動したと思ったら Firefox が落ちた。どこにそんなメモリ使ってんだろ…….Net だからっすか。
namazu のカスタマイズ
テンプレートに XSLT を使う namazu.cgi の代替を書いて置き換えた。これで namazu だけ HTML4.01 だったり、適用している CSS が違うということがなくなった。
Ruby 拡張ライブラリの search-namazu を使ってクエリ投げて、いったんデータを XML に変換。んでそれを XSLT エンジンに渡してやる。
遠回りだけど、namazu のやつだけ統一感がないのはいくないからこれでよし。もちろん common.xsl が適用されているからスタイルシート追加したきゃ common.xsl を書き換えるだけ。全部変わる!
あーそうだ。Ruby 用の XSLT エンジンがなかったから sablot を使った。何か CGI 経由でコンパイルするっていう方法がずっと頭から抜けてて、Ruby で XSLT エンジンつかえないじゃん!って思ってた。想像力が減ってる。だめだ。
全統マーク
次期スタイルに向けて
いくつか目標的な何か
- パット見のバランス。何か左側に偏っててキモイ
- 余白のとりかた。余白とかない
- border を最小限に……つまり余白のとりかた
- フォントグラフィをちゃんと考える。今めんどくさがりすぎ
- 配色の再考。各種アクセシビリティツール使ってみるとかしてみる
- かっこよく……
そんなわけで CSS Vault とかでパクる参考にするサイトを探す。もっと綺麗な方向にしたい……
なんか細々したグラデーションとボーダー (not CSS) が流行ってるみたいだからパクろう。うん。