Получилось примерно вот что:
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">[] && echo "good"
patch -p1 < filename.txt
</code>
<user id=“1”>
<article id=“243”>название статьи</article></user></body></html>
Что меня вполне бы устроило, если бы не появившиеся лишние тэги типа xml, body, etc. Как сохранить все без них?
А еще не совсем понятно, почему я не могу просто получить текст между тэгами и приходится использовать какой-то firstChild, причем есть еще и lastChild, а про них в документации нет ничего толкового.