Как использовать genshi.builder для программного создания HTML-документа? - PullRequest
3 голосов
/ 22 сентября 2008

Я недавно обнаружил модуль genshi.builder. Это напоминает мне о модуле Stan Divmod Nevow. Как использовать genshi.builder.tag для создания HTML-документа с определенным типом документа? Или это даже хорошая вещь? Если нет, то каков правильный способ?

Ответы [ 2 ]

4 голосов
/ 22 сентября 2008

Невозможно создать целую страницу, используя только 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')

Получившаяся страница не будет содержать пробелов - она ​​будет выглядеть нормально, но вам будет трудно читать исходный код, потому что она будет целиком в одну строку. Применение соответствующих фильтров для добавления пробела оставлено читателю в качестве упражнения.

2 голосов
/ 22 сентября 2008

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')

Смотрите другие Doctypes здесь: http://genshi.edgewall.org/wiki/ApiDocs/genshi.output#genshi.output:DocType

[1] genshi.builder.__doc__
...