#!/usr/bin/env python
#-*- coding: UTF-8 -*-

__author__ = 'helljump'

import logging
from PyQt4 import QtGui
import startup
import transaction
from ui import icons_rc  # @UnusedImport
from formlayout import fedit
from utils import MyProgressDialog
from lxml.html.clean import Cleaner
from lxml import etree
import re


log = logging.getLogger(__name__)


def process(prj, parent=None):
    DIVS = re.compile('^<div[^>]*>|</div>$')
    prj_prefs = prj.root()['prefs']
    prefs = prj_prefs.get('html_clearer', [True, True, False, True, True, True, True, True, False])
    PARAMS = [
        (u'Удалять скрипты/JS', prefs[0]),
        (u'Удалять комментарии', prefs[1]),
        (u'Удалять стили', prefs[2]),
        (u'Удалять структурные теги', prefs[3]),
        (u'Удалять Flash, IFrame', prefs[4]),
        (u'Удалять фреймы', prefs[5]),
        (u'Удалять формы', prefs[6]),
        (None, None),
        (u'Оставлять только безопасные атрибуты', prefs[7]),
        (u'Добавлять nofollow', prefs[8]),
    ]
    params = fedit(PARAMS, title=u"Очистка", parent=parent, icon=QtGui.QIcon(':/aaaa.png'))
    if not params:
        return
    prj_prefs['html_clearer'] = params
    transaction.commit()

    cleaner = Cleaner(
        scripts=params[0],
        javascript=params[0],
        comments=params[1],
        style=params[2],
        page_structure=params[3],
        embedded=params[4],
        frames=params[5],
        forms=params[6],
        safe_attrs_only=params[7],
        add_nofollow=params[8])

    docs = prj.root()['documents']
    pdlg = MyProgressDialog(u'Обработка', u'Очистка кода', u'Отмена', 0, len(docs), parent=parent)
    pdlg.show()
    try:
        for i, doc in enumerate(docs):
            try:
                if len(doc.text) > 1:
                    text = cleaner.clean_html(doc.text)
                    doc.text = DIVS.sub('', text).strip()
            except etree.XMLSyntaxError:
                log.exception('html clearer except %s' % doc.title)
            pdlg.set_value(i)
            QtGui.qApp.processEvents()
            if pdlg.wasCanceled():
                transaction.abort()
                return
        transaction.commit()
    finally:
        pdlg.close()
    if parent is not None:
        parent.model.layoutChanged.emit()


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    root = startup.CONN.root()
    prj = root["projects"][0]
    prj.open()
    process(prj)
    prj.close()
