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

от автора


Всем доброго времени суток!
Недавно я задал вопрос на habre, про аналог библиотеки jevix для pyton.
Мне подсказали решение, но этих решений мне было недостаточно, да и всем известно что 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/
Скачать — jevix.vir-mir.ru/media/jevix.rar

ссылка на оригинал статьи http://habrahabr.ru/post/168439/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *