2009-06-21 8 views
0
<py:match path="foo"> 
    <?python 
     import os 
     href = select('@href').render() 
     SOMEWHERE = ... # what file contained the foo tag? 
     path = os.path.abspath(os.path.join(os.path.dirname(SOMEWHERE), href) 
     f = file(path,'r') 
     # (do something interesting with f) 
    ?> 
</py:match> 
... 
<foo href="../path/relative/to/this/template/abcd.xyz"/> 

上記の「どこか」となるべきものは何ですか?他のタグのhref属性のように、そのファイル内のfooタグを持つファイルからの相対的な値をhrefにします。genshiテンプレートのpy:matchからの相対パスの解決

また、どのファイルにpy:matchブロックが含まれていますか?これは、fooタグを持つファイルとは別のディレクトリにある可能性があるため、あまり良くありません。

私はレンダリングしているファイルのパスをGenshiの外部からのコンテキスト引数として与えることができますが、それは上記の両方とは別のディレクトリにある可能性があります。

答えて

1

fooタグを含むファイルのディレクトリ内で、ドライバプログラム(入力ファイルを解析するPythonプログラム)が実行されていることを確認する必要があります。それ以外の場合は、相対パス(リーダーが実行されているディレクトリから読み込み中のファイルのディレクトリに移動する方法)をPythonコードのコンテキスト引数として渡して、os.path.joinコマンドに追加する必要があります。

このセットアップ(そしてMacOS X 10.6.3にインストールされたGenshi 0.6をFinkパッケージgenshi-py26経由で使用する)では、コマンドos.getcwd()は、fooタグを含むファイルの現在の作業ディレクトリを返します。

このような複雑なパス構造の場合は、path=os.path.normpath(path)を使用することを強くお勧めします。これは、結果のHTMLコードでこのようなことが起こりたくないからです。

+0

xi:include href = "B/C/D"があり、Dにxi:include href =があるファイルAでGenshiを実行する可能性がありますが、 "../E"など、私が本当にやりたいことは、GenshiからEまたはFの場所の知識を抽出することです...これはおそらくGenshiにパッチを当てることを伴うでしょう。それが起こると、私は質問をしてからRailsに切り替えました。 :-) –

+0

ああ、そうだ。 'foo'タグをつけたファイルがメインファイルだった場合、上記の解決策が実際に問題を解決するでしょう(何らかの理由で私はこのシナリオを暗黙的に想定していましたが、本当にあなたの質問に従っていません!これがメインファイルに含まれている別のファイルであった場合、ドライバプログラムはその場所と原点について知ることができず、正しいパスを含めることができませんでした。その場合、私は問題の解決策がありません(確かに実現不可能な、自分自身の場所についての情報をすべての*ファイルの先頭に明示的なグローバル定数があることを除いて)。 – user8472

+0

私はすでにPythonをしばらく使用していたので、Genshiを使っています。これまでRubyを学んでいたことはありませんでしたが、Railsが実際に始めるには良い理由があると聞いてきました。^) – user8472

関連する問題