Как использовать genshi.builder для программного создания HTML-документа?
Вопрос
Недавно я обнаружил модуль genshi.builder.Это напоминает мне модуль Stan от Divmod Nevow.Как можно использовать genshi.builder.tag для создания HTML-документа с определенным типом документа?Или это вообще хороший поступок?Если нет, то в чем верно способ?
Решение
Невозможно создать целую страницу, используя только genshi.builder.tag
-- вам нужно будет выполнить некоторые операции с результирующим потоком, чтобы вставить тип документа.Кроме того, полученный код будет выглядеть ужасно.Рекомендуемый способ использования Genshi — использовать отдельный файл шаблона, сгенерировать из него поток, а затем преобразовать этот поток в нужный вам тип вывода.
genshi.builder.tag
в основном полезен, когда вам нужно создать простую разметку изнутри Python, например, когда вы создаете форму или выполняете какую-то логическую модификацию вывода.
См. документацию для:
Если вы действительно хотите создать полный документ, используя только builder.tag
, этот (совершенно непроверенный) код может стать хорошей отправной точкой:
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')
На полученной странице не будет пробелов — она будет выглядеть нормально, но вам будет сложно читать исходный код, поскольку он будет целиком состоять из одной строки.Реализация соответствующих фильтров для добавления пробелов оставлена читателю в качестве упражнения.
Другие советы
Genshi.builder предназначен для «программного создания потоков разметки»[1].Я считаю, что его цель — служить бэкэндом для языка шаблонов.Вероятно, вы ищете язык шаблонов для создания целой страницы.
Однако вы можете сделать следующее:
>>> import genshi.output
>>> genshi.output.DocType('html')
('html', '-//W3C//DTD HTML 4.01//EN', 'http://www.w3.org/TR/html4/strict.dtd')
Другие типы документов смотрите здесь: http://genshi.edgewall.org/wiki/ApiDocs/genshi.output#genshi.output:DocType
[1] genshi.builder.__doc__