Helpviewer/AdBlock/AdBlockPage.py

Sun, 29 Jul 2012 18:05:03 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 29 Jul 2012 18:05:03 +0200
changeset 1965
96f5a76e1845
parent 1960
d8c45fe8a1b9
child 1970
02cf3bac079b
permissions
-rw-r--r--

Fixed some PEP-8 related issues.

# -*- coding: utf-8 -*-

# Copyright (c) 2009 - 2012 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing a class to apply AdBlock rules to a web page.
"""

from PyQt4.QtCore import QObject, QUrl

import Helpviewer.HelpWindow


class AdBlockPage(QObject):
    """
    Class to apply AdBlock rules to a web page.
    """
    def hideBlockedPageEntries(self, page):
        """
        Public method to apply AdBlock rules to a web page.
        
        @param page reference to the web page (HelpWebPage)
        """
        if page is None or page.mainFrame() is None:
            return
        
        manager = Helpviewer.HelpWindow.HelpWindow.adblockManager()
        if not manager.isEnabled():
            return
        
        docElement = page.mainFrame().documentElement()
        
        for entry in page.getAdBlockedPageEntries():
            urlString = entry.urlString()
            if urlString.endswith((".js", ".css")):
                continue
            
            urlEnd = ""
            pos = urlString.rfind("/")
            if pos >= 0:
                urlEnd = urlString[pos + 1:]
            if urlString.endswith("/"):
                urlEnd = urlString[:-1]
            
            selector = 'img[src$="{0}"], iframe[src$="{0}"], embed[src$="{0}"]'\
                       .format(urlEnd)
            elements = docElement.findAll(selector)
            
            for element in elements:
                src = element.attribute("src")
                src = src.replace("../", "")
                if src in urlString:
                    element.setStyleProperty("display", "none")
        
        # apply domain specific element hiding rules
        elementHiding = manager.elementHidingRulesForDomain(page.url())
        if not elementHiding:
            return
        
        elementHiding += "{display: none !important;}\n</style>"
        
        bodyElement = docElement.findFirst("body")
        bodyElement.appendInside('<style type="text/css">\n/* AdBlock for eric */\n' +
                                 elementHiding)


class AdBlockedPageEntry(object):
    """
    Class implementing a data structure for web page rules.
    """
    def __init__(self, rule, url):
        """
        Constructor
        
        @param rule AdBlock rule to add (AdBlockRule)
        @param url URL that matched the rule (QUrl)
        """
        self.rule = rule
        self.url = QUrl(url)
    
    def __eq__(self, other):
        """
        Special method to test equality.
        
        @param other reference to the other entry (AdBlockedPageEntry)
        @return flag indicating equality (boolean)
        """
        return self.rule == other.rule and self.url == other.url
    
    def urlString(self):
        """
        Public method to get the URL as a string.
        
        @return URL as a string (string)
        """
        return self.url.toString()

eric ide

mercurial