eric6/Helpviewer/AdBlock/AdBlockPage.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Helpviewer/AdBlock/AdBlockPage.py	Sun Apr 14 15:09:21 2019 +0200
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2009 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class to apply AdBlock rules to a web page.
+"""
+
+from __future__ import unicode_literals
+
+from PyQt5.QtCore import QObject, QUrl
+
+
+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
+        
+        import Helpviewer.HelpWindow
+        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