2008-09-21 13 views

Répondre

4

Il est impossible de construire une page entière en utilisant seulement genshi.builder.tag - vous devez effectuer une chirurgie sur le flux résultant pour insérer le doctype. En outre, le code résultant aurait l'air horrible. La méthode recommandée pour utiliser Genshi consiste à utiliser un fichier modèle séparé, à en générer un flux, puis à restituer ce flux au type de sortie souhaité.

genshi.builder.tag est surtout utile lorsque vous avez besoin de générer un balisage simple depuis Python, par exemple lorsque vous construisez un formulaire ou que vous effectuez une sorte de modification logique de la sortie.

documentation Voir pour:

Si vous voulez vraiment générer un document en utilisant uniquement builder.tag, ce code (complètement non testé) pourrait être un bon point de départ:

from itertools import chain 
from genshi.core import DOCTYPE, Stream 
from genshi.output import DocType 
from genshi.builder import tag as t 

# Build the page using `genshi.builder.tag` 
page = t.html (t.head (t.title ("Hello world!")), t.body (t.div ("Body text"))) 

# Convert the page element into a stream 
stream = page.generate() 

# Chain the page stream with a stream containing only an HTML4 doctype declaration 
stream = Stream (chain ([(DOCTYPE, DocType.get ('html4'), None)], stream)) 

# Convert the stream to text using the "html" renderer (could also be xml, xhtml, text, etc) 
text = stream.render ('html') 

La page résultante n'aura aucun espace dedans - elle semblera normale, mais vous aurez du mal à lire le code source parce que ce sera entièrement sur une ligne. Implémenter des filtres appropriés pour ajouter des espaces est laissé comme un exercice au lecteur.

+0

cela a du sens. ressemble à quelque chose que vous pourriez utiliser pour construire un fragment html à charger dans une page en utilisant ajax ou quelque chose? –

+0

Même pour les petites pages AJAX, je préfère les modèles, car ils ont tendance à être simplement "si connecté, show name" logique et la substitution de paramètres. builder.tag est pour quand il y a quelque chose de vraiment complexe que je n'arrive pas à comprendre comment écrire correctement avec un template. –

2

Genshi.builder est pour "générer par programmation des flux de balisage" [1]. Je crois que le but en est comme un backend pour la langue du modèle. Vous recherchez probablement le langage de création de gabarit pour générer une page entière.

Vous pouvez faire cependant les éléments suivants:

>>> import genshi.output 
>>> genshi.output.DocType('html') 
('html', '-//W3C//DTD HTML 4.01//EN', 'http://www.w3.org/TR/html4/strict.dtd') 

Voir d'autres Doctypes ici: http://genshi.edgewall.org/wiki/ApiDocs/genshi.output#genshi.output:DocType

[1] genshi.builder.__doc__ 
+0

Y a-t-il un moyen de créer un document html en utilisant Genshi? Je cherche quelque chose de similaire à stan. si ce n'est pas une utilisation appropriée de genshi, c'est bien, mais je voudrais savoir si c'est le cas. –

Questions connexes