PyMeld
Оригинальная статья: PyMeld
Автор статьи: Ричи Хиндл (Richie Hindle)
Источник: http://entrian.com/PyMeld/
Простая, легкая система для управления HTML (и XML, неформально) с использованием объектной модели Pythonic. PyMeld
представляет собой единый модуль Python, PyMeld.py.
Особенности:
- Позволяет полностью разделить программную логику и HTML - графический дизайнер может создавать HTML в визуальном редакторе HTML без необходимости иметь дело с любыми нестандартными синтаксическими или нестандартными именами атрибутов. Программный код ничего не знает о XML или HTML - он просто имеет дело с объектами и атрибутами, подобными любому другому фрагменту кода Python.
- Разработан с учетом общих задач программирования HTML-приложений. Заполнение формы HTML с записью из базы данных является однострочным (с использованием оператора% - см. Ниже). Создание таблицы HTML из набора записей так же просто, как показано в примере ниже.
- Никаких особых требований к HTML / XML (или только один: значения атрибутов не должны указываться) - поэтому вы можете использовать любой редактор, и ваш HTML / XML не должен быть строго верным.
- Работает подстановкой строк, а не разложением и перестройкой разметки, поэтому не влияет на части страницы, на которую вы не манипулируете.
- Не делает ничего, кроме манипулирования HTML / XML, следовательно, подходит для любых других веб-инструментов, которые вы используете.
- Трассировки всегда указывают на правильное место - многие системы микширования Python / HTML используют exec или eval, что затрудняет отслеживание ошибок.
Краткая информация
Объект PyMeld.Meld
представляет собой XML-документ или его часть. Все элементы в документе с атрибутами id=name
становятся доступными объектом Meld как object.name
. Атрибуты элементов доступны одинаково. Краткий пример стоит тысячи слов:
>>> from PyMeld import Meld
>>> xhtml = '''<html><body>
... <textarea id="message" rows="2" wrap="off">Type your message.</textarea>
... </body></html>'''
>>> page = Meld(xhtml) # Create a Meld object from XHTML.
>>> print page.message # Access an element within the document.
<textarea id="message" rows="2" wrap="off">Type your message.</textarea>
>>> print page.message.rows # Access an attribute of an element.
2
>>> page.message = "New message." # Change the content of an element.
>>> page.message.rows = 4 # Change an attribute value.
>>> del page.message.wrap # Delete an attribute.
>>> print page # Print the resulting page.
<html><body>
<textarea id="message" rows="4">New message.</textarea>
</body></html>
Таким образом, программная логика и HTML полностью разделены - графический дизайнер может создавать HTML-код в визуальном редакторе XHTML без необходимости иметь дело с любыми нестандартными синтаксическими или нестандартными именами атрибутов. Программный код ничего не знает о XML или HTML - он просто имеет дело с объектами и атрибутами, подобными любому другому фрагменту кода Python. Заполнение формы HTML с записью из базы данных является однострочным (с использованием оператора% - см. Ниже). Создание таблицы HTML из набора записей так же просто, как показано в следующем примере:
Реальный пример:
Вот пример, основанный на данных, который заполняет таблицу из источника данных, основываясь на таблице данных образца, помещенной дизайнером страницы. Обратите внимание, что в реальном мире HTML обычно будет большей страницей, прочитанной из внешнего файла, сохраняя данные и представление отдельно, и данные будут поступать из внешнего источника, такого как РСУБД. HTML может быть полон стилей, изображений, всего, что вам нравится, и все будет работать одинаково.
>>> xhtml = '''<html><table id="people">
... <tr id="header"><th>Name</th><th>Age</th></tr>
... <tr id="row"><td id="name">Example name</td><td id="age">21</td></tr>
... </table></html>'''
>>> doc = Meld(xhtml)
>>> templateRow = doc.row.clone() # Take a copy of the template row, then
>>> del doc.row # delete it to make way for the real rows.
>>> for name, age in [("Richie", 30), ("Dave", 39), ("John", 78)]:
... newRow = templateRow.clone()
... newRow.name = name
... newRow.age = age
... doc.people += newRow
>>> print re.sub(r'</tr>\s*', '</tr>\n', str(doc)) # Prettify the output
<html><table id="people">
<tr id="header"><th>Name</th><th>Age</th></tr>
<tr id="row"><td id="name">Richie</td><td id="age">30</td></tr>
<tr id="row"><td id="name">Dave</td><td id="age">39</td></tr>
<tr id="row"><td id="name">John</td><td id="age">78</td></tr>
</table></html>
Обратите внимание, что если вы собираетесь впоследствии манипулировать таблицей, например, с помощью PyMeld или JavaScript, вам нужно будет переименовать каждую row
, name
и age
чтобы иметь уникальное имя - вы можете сделать это, назначив атрибуту id
но я «Пропустил это, чтобы упростить пример.
Как показано в примере, оператор +=
добавляет контент в элемент - добавляет <tr>
элементы в <table>
в этом случае.
Shortcut: оператор %
Использование синтаксиса object.id = value
для каждой операции может стать утомительным, поэтому есть быстрые клавиши, которые вы можете использовать с помощью оператора %
. Это работает так же, как встроенный оператор %
для строк. Вышеприведенный пример можно было бы написать так:
>>> for name, age in [("Richie", 30), ("Dave", 39), ("John", 78)]:
... doc.people += templateRow % (name, age)
Оператор %
, заданный одним значением или последовательностью, присваивает значения элементам с `id` в том порядке, в котором они появляются, как и оператор %
для строк. Обратите внимание, что нет необходимости вызывать clone()
когда вы используете %
, так как он автоматически возвращает измененный клон (опять же, как и для строк). Вы также можете использовать словарь:
>>> print templateRow % {'name': 'Frances', 'age': 39}
<tr id="row"><td id="name">Frances</td><td id="age">39</td></tr>
Оператор %
действительно полезен, когда у вас есть большое количество элементов данных - например, заполнение формы HTML записью из РСУБД становится однострочным.
Обратите внимание, что эти примеры написаны для ясности, а не производительности, и не обязательно масштабируются очень хорошо - использование +=
для создания результата в цикле неэффективно, а оператор %
PyMeld работает медленнее, чем встроенный Python. См. toFormatString()
в справочном руководстве для способов ускорения этого типа кода.
Содержание элемента
Когда вы ссылаетесь на именованный элемент в документе, вы получаете объект Meld, представляющий весь этот элемент:
>>> page = Meld('<html><span id="x">Hello world</span></html>')
>>> print page.x
<span id="x">Hello world</span>
Если вы просто хотите получить содержимое элемента как строку, используйте атрибут _content
:
>>> print page.x._content
Hello world
Вы также можете назначить _content
, хотя это прямо эквивалентно назначению самому тегу:
>>> page.x._content = "Hello again"
>>> print page
<html><span id="x">Hello again</span></html>
>>> page.x = "Goodbye"
>>> print page
<html><span id="x">Goodbye</span></html>
Единственный раз, когда вам нужно назначить _content
- это когда вы взяли ссылку на элемент внутри документа:
>>> x = page.x
>>> x._content = "I'm back"
>>> print page
<html><span id="x">I'm back</span></html>
Высказывание x = "I'm back"
просто перевязывает x
в строку "I'm back"
не затрагивая документ.
Версия и лицензия
Это версия 2.1.4 PyMeld.py , Copyright (c) 2002-2009 Entrian Solutions. Это программное обеспечение с открытым исходным кодом, выпущенное в соответствии с условиями лицензии MIT.