2009-06-21 5 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 атрибутов в других тегах.Устранение относительного пути от py: совпадение в шаблоне genshi

В качестве альтернативы, какой файл содержит блок py: match? Это не так хорошо, потому что он может находиться в другом каталоге из файла с тегом foo.

Еще менее хорошо: я мог бы предоставить путь к файлу, который я представляю как аргумент контекста из-за пределов Genshi, но это может быть в другом каталоге из обоих вышеперечисленных.

ответ

1

Вы должны убедиться, что программа драйвера (т. Е. Программа Python, которая анализирует входной файл) работает в каталоге файла, содержащего тег foo. В противном случае вам необходимо передать относительный путь (то есть, как получить из каталога, в котором читатель будет работать в каталоге считываемого файла) в качестве аргумента контекста для вашего кода на Python и добавить его в команду os.path.join.

С помощью этой установки (и используя Genshi 0.6, установленный на MacOS X 10.6.3 через пакет Fink genshi-py26), команда os.getcwd() возвращает текущий рабочий каталог файла, содержащего тег foo.

Для таких сложных конструкций пути я также настоятельно рекомендую использовать path=os.path.normpath(path), так как вы можете не захотеть, чтобы такие вещи протекали в вашем результирующем HTML-коде.

+0

Полезно некоторым людям, которых я ожидаю, но не совсем то, что мне было: мой код может запускать Genshi в файле A, который имеет xi: include href = "B/C/D", а D имеет xi: include href = «../E» и т. Д., То, что я действительно хотел сделать, - извлечь из Генши знания о местонахождении E или F ... это, вероятно, связано с исправлением Генши. Хотя, как бы то ни было, я переключился на Rails, задав вопрос. :-) –

+0

О, я вижу. Если файл с тегом 'foo' был основным файлом, то вышеупомянутое решение действительно решило бы проблему (по какой-то причине я неявно предполагал этот сценарий, но он действительно не вытекает из вашего вопроса - извините!). Если это был еще один файл, включенный в основной файл, программа драйвера не могла знать о ее местоположении и происхождении и не могла включить правильный путь. В этом случае у меня нет решения проблемы (за исключением наличия явной глобальной константы в начале * каждого * файла, который информирует о своем местоположении, что, безусловно, не представляется возможным). – user8472

+0

Я все еще использую Genshi, так как я уже использовал Python в течение некоторого времени. Пока не удосужился узнать Ruby, но из всего, что я слышал, Rails действительно может быть хорошей причиной для начала: ^) – user8472

Смежные вопросы