Pull to refresh

Библиотека Jevix для Python

Reading time 3 min
Views 7K

Всем доброго времени суток!
Недавно я задал вопрос на habre, про аналог библиотеки jevix для python.
Мне подсказали решение, но этих решений мне было недостаточно, да и всем известно что Jevix самая популярная библиотека для работы с html.

Для тех кто впервые слышит по Jevix

Jevix — средство автоматического применения правил набора текстов, наделённое способностью унифицировать разметку HTML/XML документов, контролировать перечень допустимых тегов и аттрибутов, предотвращать возможные XSS-атаки в коде документов.

Автором этой библиотеки для php является, хабра житель ur001, ссылка на проект jevix.ru/project


Предыстория

Мне очень нравится эта библиотека, я ее использовал и не раз в своих проектах, но как говорится времена меняются и я начал учить python + django и столкнулся с такой проблемой, взялся я делать проект где нужно жестко контролировать передаваемый html код и не дать врагу никакого шанса на XSS-атаки.

Вот только беда, я не смог найти jevix библиотеки для python или достойного аналога! Вот значит посидев подумав я и решил переписать jevix+php на jevix+python.

Поехали

Скажу сразу библиотека сырая и находится в beta режиме, всем добровольцам просьба потестить, чтоб в бою не ударить в грязь лицом.

Что еще не реализовано

  1. Автозамена, для таких символов как ( r ) на ®
  2. Добавление отступов от определенных строчек
  3. нельзя отключить расстановку br в определенных тегах, таких как object… по этому пока что отключил ее полностью


Как пользоваться?

Все банально просто, я старался оставить все как есть и даже название переменных.
Инициализируем
from jevix import Jevix
p = Jevix()

Настраиваем
p.cfgAllowTags(['ls','ddcut','a', 'img', 'i', 'p', 'b', 'u', 's', 'video', 'em',  'strong', 'nobr', 'li', 'ol', 'ul', 'sup', 'abbr', 'sub', 'acronym', 'h4', 'h5', 'h6', 'br', 'hr', 'pre', 'code', 'object', 'param', 'embed', 'blockquote', 'iframe','table','th','tr','td'])

    p.cfgSetTagShort(['br','img', 'hr', 'ddcut','ls']);

    p.cfgSetTagPreformatted(['pre','code','video', 'iframe'])

    p.cfgAllowTagParams('img', {
        0:'src', 'alt' : '#text', 1:'title', 'align': ['right', 'left', 'center', 'middle'],
        'width':'#int', 'height':'#int', 'hspace':'#int', 'vspace':'#int',
        'class' : ['image-center', 'image-left', 'image-right']
    })
    p.cfgAllowTagParams('a', {
        0:'title', 1:'href', 'rel' : '#text', 'name' : '#text', 'target' : ['_blank']
    })

    p.cfgAllowTagParams('ddcut', {
        0:'name',
        })

    p.cfgAllowTagParams('acronym', {
        0:'title',
        })

    p.cfgAllowTagParams('abbr', {
        0:'title',
        })

    p.cfgAllowTagParams('param', {
        'width' : '#int', 'height' : '#int',
        'src' : {'#domain':['youtube.com','rutube.ru','vimeo.com']}
    })

    p.cfgAllowTagParams('iframe', {
        'name' : '#text',
        'value' : '#text',
        'height' : '#int',
        'width' : '#int',
        'src' : {'#domain':['youtube.com','rutube.ru','vimeo.com','video.yandex.ru']},
    })

    p.cfgAllowTagParams('ls', {
        'user' : '#text'
    })

    p.cfgAllowTagParams('td', {
        'colspan':'#int','rowspan':'#int','align':['right', 'left', 'center', 'justify'],
        'height':'#int','width':'#int'
    })

    p.cfgAllowTagParams('table', {
        'border':'#int',
        'cellpadding':'#int','cellspacing':'#int','align':['right', 'left', 'center'],
        'height':'#int','width':'#int'
    })

    p.cfgAllowTagParams('embed', {
        'src' : {'#domain':['youtube.com','rutube.ru','vimeo.com','video.yandex.ru']}, 'type' : '#text',
        'allowscriptaccess' : '#text',
        'allowfullscreen' : '#text','width' : '#int', 'height' : '#int', 'flashvars': '#text',
        'wmode': '#text'
    })

    p.cfgAllowTagParams('object', {
        'width' : '#int',
        'height' : '#int',
        'data' : {'#domain':['youtube.com','rutube.ru','vimeo.com','video.yandex.ru']},

    })



    p.cfgSetTagParamsRequired('img', ['src'])
    p.cfgSetTagParamsRequired('a', ['href'])
    p.cfgSetTagParamsRequired('iframe', ['src'])

    p.cfgSetTagCutWithContent(['script',  'style'])

    p.cfgSetTagChilds('ul', ['li'], False, True)
    p.cfgSetTagChilds('ol', ['li'], False, True)
    p.cfgSetTagChilds('object', ['param'], False, True)
    p.cfgSetTagChilds('object', ['embed'], False, False)
    p.cfgSetTagChilds('table', ['tr'], False, True)
    p.cfgSetTagChilds('tr', ['td','th'], False, True)

    p.cfgSetTagIsEmpty(['param','embed','a','iframe']);
    p.cfgSetTagNoAutoBr(['ul','ol','object','table','tr'])
    p.cfgSetTagBlockType(['h4','h5','h6','ol','ul','blockquote','pre','table','iframe', 'object'])

    p.cfgSetAutoBrMode(True)

    p.cfgSetTagNoTypography(['code','video','object', 'iframe'])

errors = []
text= u"""<iframe width="560" height="315" src="http://youtube.com/embed/lGnGQXUeaVc" frameborder="0" allowfullscreen></iframe>"""



Ну и выполняем
text, errors = p.parse(text)
print text, errors


Ссылки:
на официальный проект — jevix.ru
чтоб потестить в online python+jevix — jevix.vir-mir.ru
проект на github — github.com/vir-mir/jevix
Tags:
Hubs:
+14
Comments 26
Comments Comments 26

Articles