Всем доброго времени суток!
Недавно я задал вопрос на 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 режиме, всем добровольцам просьба потестить, чтоб в бою не ударить в грязь лицом.
Что еще не реализовано
- Автор замена, для таких символов как ( r ) на ®
- Добавление отступов от определенных строчек
- нельзя отключить расстановку 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
Автор: lesha_firs