2009-06-21 10 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"/> 

Qu'est-ce qui devrait se passer comme "quelque part" ci-dessus? Je veux que l'attribut href soit relatif au fichier avec l'étiquette foo, comme les attributs href sur d'autres étiquettes.Résolution d'un chemin relatif à partir de py: correspondance dans un gabarit genshi

Sinon, quel fichier contenait le bloc py: match? C'est moins bon, car il peut être dans un répertoire différent du fichier avec la balise foo.

Encore moins bon: je pourrais fournir le chemin du fichier que je rends en tant qu'argument de contexte de l'extérieur de Genshi, mais cela pourrait être dans un répertoire différent des deux ci-dessus.

Répondre

1

Vous devez vous assurer que le programme pilote (c'est-à-dire le programme Python qui analyse le fichier d'entrée) s'exécute dans le répertoire du fichier contenant la balise foo. Sinon, vous devez transmettre le chemin relatif (c'est-à-dire, comment obtenir à partir du répertoire dans lequel le lecteur s'exécute vers le répertoire du fichier en cours de lecture) comme argument de contexte à votre code Python et l'ajouter à la commande os.path.join.

Avec cette configuration (et en utilisant Genshi 0.6 installé sur MacOS X 10.6.3 via le paquet Fink genshi-py26) la commande os.getcwd() renvoie le répertoire de travail actuel du fichier contenant la balise foo.

Pour de telles constructions de chemin compliquées, je recommande fortement d'utiliser path=os.path.normpath(path), car vous ne voulez pas que de telles choses fuient dans votre code HTML résultant.

+0

Utile pour certaines personnes que j'attendais, mais pas tout à fait ce que je recherchais: mon code peut lancer Genshi sur le fichier A, qui a xi: inclure href = "B/C/D", et D a xi: include href = "../E", etc., ce que je voulais vraiment faire est d'extraire de Genshi la connaissance de l'emplacement de E ou F ... cela impliquerait probablement de patcher Genshi. Bien que, en fait, je suis passé à Rails depuis la pose de la question. :-) –

+0

Oh, je vois. Si le fichier avec la balise 'foo' était le fichier principal alors la solution ci-dessus résoudrait en effet le problème (pour une raison quelconque, j'ai implicitement supposé ce scénario, mais il ne résulte pas de votre question - désolé à ce sujet!). S'il s'agissait encore d'un autre fichier inclus dans le fichier principal, le programme du pilote ne pouvait pas connaître son emplacement et son origine et ne pouvait pas inclure le chemin correct. Dans ce cas, je n'ai pas de solution au problème (sauf avoir une constante globale explicite au début de * chaque * fichier qui informe sur son propre emplacement - certainement pas réalisable). – user8472

+0

J'utilise toujours Genshi depuis que j'avais déjà utilisé Python pendant un certain temps. Je n'ai pas pris la peine d'apprendre Ruby jusqu'ici, mais d'après tout ce que j'ai entendu Rails pourrait bien être une bonne raison de commencer: ^) – user8472