LINUX.ORG.RU

[python][django][html5lib] Обработка собственных тэгов

 ,


0

0

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

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

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

<code lang="bash">
[[ abc =~ ^ab ]] && echo "good"
patch -p1 < filename.txt
</code>

<user id="1" />

<article id="243">название статьи</article>

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

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

Где у тебя есть некий код? Это содержимое поля в модели? И на каком этапе тебе надо это преобразовывать - при сохранении в БД, или при выводе?

Если при сохранении - переопределяешь метод save в модели.

Если при выводе - либо делаешь свой тэг/фильтр, либо можно написать свой виджет и указать его в модели.

anonymous
()
Ответ на: комментарий от anonymous

Уже все это есть. Вопрос не про это был. У меня есть поле content, где хранится оригинальное содержимое, а метод save_model берет content, обрабатывает его, и ложит в cached_content. Так вопрос в том, чем и как обрабатывать этот самый content.

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

def content_handler(source):
    #
    # replace all tags here
    #
    return source

class ArticleAdmin(admin.ModelAdmin):
    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)
cheerfulboy
() автор топика
Ответ на: комментарий от cheerfulboy

Вообще если контент правильно сформирован - то тогда можно работать с DOM, например через питоновский xml.dom.minidom. Он прост и понятен, проходишься по содержимому и нужные ноды меняешь на то что нужно.

Другой вариант - expat, тоже стандартный питоновский. Там надо будет писать хэндлеры для start и end тэга. Работы побольше, само оно работает шустрее, но имхо стоит делать только для толстых документов.

В процессе обработки уже применяешь всякие strip() и прочее по месту.

И, судя по твоему коду, html5lib тебе не нужен - у тебя xml, я не уверен что html5lib с такими тэгами нормально заработает.

anonymous
()
Ответ на: комментарий от cheerfulboy

>Нет, у меня html, только html, никакого xml. Хотя все равно спасибо за наводку, сейчас погляжу.

По идее с правильно сформированным html работать будет и minidom. Но вообще для хтмл-я предназначен BeautifulSoup - отличная кстати вещь, правда бывают неприятные мелочи.

anonymous
()
Ответ на: комментарий от anonymous

Не получилось с minidom. Сначала ругался на русский язык между <article></article>, убрал, и получил вот это — http://dpaste.com/174749/. Про BeautifulSoup знаю, но испытываю недоверие, потому что у меня он постоянно вываливался с непонятными ошибками. Поэтому посмотрел в сторону html5lib, но не нашел никакой вменяемой документации.

cheerfulboy
() автор топика
Ответ на: комментарий от cheerfulboy

Хм, вроде html5lib с minidom работает, если верить документации. По идее с получившимся объектом можно работать как обычно в minidom.

import html5lib
from html5lib import treebuilders

f = open("mydocument.html")
parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("dom"))
minidom_document = parser.parse(f)

и получил вот это — http://dpaste.com/174749/

Может он требует какое-нибудь экранирование симоволов в виде html entity.

anonymous
()
Ответ на: комментарий от cheerfulboy

Ну во-первых - у тебя _не_ html. В html нет тэгов code и прочие article. В xhtml 1.0 тоже нельзя свои тэги делать. А html и body видимо дописывает html5lib, minidom такого делать не должен. Так что может надо таки через minidom чистый его домучать.

Как вариант костыля - удаляй вручную тэги через replace.

А firstChild и прочее - это xml, он такой. Текст - тоже нода в xml-е.

anonymous
()

найди реализацию bbcode для джанги, сделай по подобию, там не сложно

antony986
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.