Уведомления

Группа в Telegram: @pythonsu

#1 Март 22, 2010 15:39:52

nuklea
От:
Зарегистрирован: 2009-12-05
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка собственных тэгов

Сразу признаюсь, да, я не осилил документацию.

начал с html5lib — http://code.google.com/p/html5lib/wiki/UserDocumentation
потом нашел нечто про lxml — http://codespeak.net/lxml/dev/
наткнулся на это, немного не в тему — http://softwaremaniacs.org/forum/django/2350/

А задача стоит так — у меня есть некий код, к примеру вот:

<code lang=“bash”>
[] && echo “good”
patch -p1 < filename.txt
</code>

<user id=“1” />

<article id=“243”>название статьи</article>
И хотелось бы уметь заменить lang=“bash” на какой-нибудь class="highlight", а так же сделать strip(), а потом django.utils.html.escape() для текста между <code>. Ну и другие преобразования с тэгами. И да, я совершенно не понимаю, куда смотреть и с чего начать. Пожалуйста, тыкните, пускай грубо, но тыкните. Спасибо за внимание!



Отредактировано (Март 22, 2010 19:16:45)

Офлайн

#2 Март 22, 2010 17:03:45

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Обработка собственных тэгов

Этот “код” это xml?



Офлайн

#3 Март 22, 2010 17:05:32

nuklea
От:
Зарегистрирован: 2009-12-05
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка собственных тэгов

Нет, html.



Офлайн

#4 Март 22, 2010 19:04:20

nuklea
От:
Зарегистрирован: 2009-12-05
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка собственных тэгов

Получилось примерно вот что:

from applications.blog.models import Article
from django.contrib import admin

def content_handler(source):
from html5lib import HTMLParser
from html5lib.treebuilders import getTreeBuilder

parser = HTMLParser(tree=getTreeBuilder('dom'))
doc = parser.parse(source)

for el in doc.getElementsByTagName('code'):
if el.hasAttribute('lang'):
lang = el.getAttribute('lang').strip()
el.setAttribute('class', 'highlight[%s]' % lang)
el.removeAttribute('lang')

data = el.firstChild.data
el.firstChild.data = data.strip()

return doc.toxml()

class ArticleAdmin(admin.ModelAdmin):
#exclude = ['cached_content', ]
list_display = ['title', 'published', 'created', 'updated']

def save_model(self, request, obj, form, change):
obj.cached_content = content_handler(obj.content)
obj.save()

admin.site.register(Article, ArticleAdmin)
Было:
<code lang=“bash”>
[] && echo “good”
patch -p1 < filename.txt
</code>

<user id=“1” />

<article id=“243”>название статьи</article>
Стало:
<?xml version=“1.0” ?>
<html><head/><body><code class="highlight">[] &amp;&amp; echo &quot;good&quot;
patch -p1 &lt; filename.txt
</code>

<user id=“1”>

<article id=“243”>название статьи</article></user></body></html>
Что меня вполне бы устроило, если бы не появившиеся лишние тэги типа xml, body, etc. Как сохранить все без них?
А еще не совсем понятно, почему я не могу просто получить текст между тэгами и приходится использовать какой-то firstChild, причем есть еще и lastChild, а про них в документации нет ничего толкового.



Офлайн

#5 Март 23, 2010 08:32:08

nuklea
От:
Зарегистрирован: 2009-12-05
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка собственных тэгов

Мне начинает казаться, что для решения моей задачи лучше использовать bbcode, а не собственные тэги.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version