INTERESTING FACTS BLOG

Painting and Sketches

PyMeld

Оригинальная статья: PyMeld

Автор статьи: Ричи Хиндл (Richie Hindle)

Источник: http://entrian.com/PyMeld/

Простая, легкая система для управления HTML (и XML, неформально) с использованием объектной модели Pythonic. PyMeld представляет собой единый модуль Python, PyMeld.py.

Особенности:

Краткая информация

Объект 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.