eric7/WebBrowser/OpenSearch/OpenSearchReader.py

branch
eric7
changeset 8312
800c432b34c8
parent 8205
4a0f1f896341
child 8318
962bce857696
diff -r 4e8b98454baa -r 800c432b34c8 eric7/WebBrowser/OpenSearch/OpenSearchReader.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/WebBrowser/OpenSearch/OpenSearchReader.py	Sat May 15 18:45:04 2021 +0200
@@ -0,0 +1,132 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2009 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a reader for open search engine descriptions.
+"""
+
+from PyQt5.QtCore import QXmlStreamReader, QIODevice, QCoreApplication
+
+
+class OpenSearchReader(QXmlStreamReader):
+    """
+    Class implementing a reader for open search engine descriptions.
+    """
+    def read(self, device):
+        """
+        Public method to read the description.
+        
+        @param device device to read the description from (QIODevice)
+        @return search engine object (OpenSearchEngine)
+        """
+        self.clear()
+        
+        if not device.isOpen():
+            device.open(QIODevice.OpenModeFlag.ReadOnly)
+        
+        self.setDevice(device)
+        return self.__read()
+    
+    def __read(self):
+        """
+        Private method to read and parse the description.
+        
+        @return search engine object (OpenSearchEngine)
+        """
+        from .OpenSearchEngine import OpenSearchEngine
+        engine = OpenSearchEngine()
+        
+        while not self.isStartElement() and not self.atEnd():
+            self.readNext()
+        
+        if (
+            self.name() != "OpenSearchDescription" or
+            self.namespaceUri() != "http://a9.com/-/spec/opensearch/1.1/"
+        ):
+            self.raiseError(QCoreApplication.translate(
+                "OpenSearchReader",
+                "The file is not an OpenSearch 1.1 file."))
+            return engine
+        
+        while not self.atEnd():
+            self.readNext()
+            
+            if not self.isStartElement():
+                continue
+            
+            if self.name() == "ShortName":
+                engine.setName(self.readElementText())
+                
+            elif self.name() == "Description":
+                engine.setDescription(self.readElementText())
+                
+            elif self.name() == "Url":
+                type_ = self.attributes().value("type")
+                url = self.attributes().value("template")
+                method = self.attributes().value("method")
+                
+                if (
+                    type_ == "application/x-suggestions+json" and
+                    engine.suggestionsUrlTemplate()
+                ):
+                    continue
+                
+                if (
+                    (not type_ or
+                     type_ in ("text/html", "application/xhtml+xml")) and
+                    engine.searchUrlTemplate()
+                ):
+                    continue
+                
+                if not url:
+                    continue
+                
+                parameters = []
+                
+                self.readNext()
+                
+                while not (self.isEndElement() and self.name() == "Url"):
+                    if (
+                        not self.isStartElement() or
+                        (self.name() != "Param" and
+                         self.name() != "Parameter")
+                    ):
+                        self.readNext()
+                        continue
+                    
+                    key = self.attributes().value("name")
+                    value = self.attributes().value("value")
+                    
+                    if key and value:
+                        parameters.append((key, value))
+                    
+                    while not self.isEndElement():
+                        self.readNext()
+                
+                if type_ == "application/x-suggestions+json":
+                    engine.setSuggestionsUrlTemplate(url)
+                    engine.setSuggestionsParameters(parameters)
+                    engine.setSuggestionsMethod(method)
+                elif (
+                    not type_ or
+                    type_ in ("text/html", "application/xhtml+xml")
+                ):
+                    engine.setSearchUrlTemplate(url)
+                    engine.setSearchParameters(parameters)
+                    engine.setSearchMethod(method)
+                
+            elif self.name() == "Image":
+                engine.setImageUrl(self.readElementText())
+            
+            if (
+                engine.name() and
+                engine.description() and
+                engine.suggestionsUrlTemplate() and
+                engine.searchUrlTemplate() and
+                engine.imageUrl()
+            ):
+                break
+        
+        return engine

eric ide

mercurial