src/eric7/WebBrowser/OpenSearch/OpenSearchReader.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8881
54e42bc2437a
child 9221
bf71ee032bb4
equal deleted inserted replaced
9208:3fc8dfeb6ebe 9209:b99e7fd55fd3
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2009 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a reader for open search engine descriptions.
8 """
9
10 from PyQt6.QtCore import QXmlStreamReader, QIODevice, QCoreApplication
11
12
13 class OpenSearchReader(QXmlStreamReader):
14 """
15 Class implementing a reader for open search engine descriptions.
16 """
17 def read(self, device):
18 """
19 Public method to read the description.
20
21 @param device device to read the description from (QIODevice)
22 @return search engine object (OpenSearchEngine)
23 """
24 self.clear()
25
26 if not device.isOpen():
27 device.open(QIODevice.OpenModeFlag.ReadOnly)
28
29 self.setDevice(device)
30 return self.__read()
31
32 def __read(self):
33 """
34 Private method to read and parse the description.
35
36 @return search engine object (OpenSearchEngine)
37 """
38 from .OpenSearchEngine import OpenSearchEngine
39 engine = OpenSearchEngine()
40
41 while not self.isStartElement() and not self.atEnd():
42 self.readNext()
43
44 if (
45 self.name() != "OpenSearchDescription" or
46 self.namespaceUri() != "http://a9.com/-/spec/opensearch/1.1/"
47 ):
48 self.raiseError(QCoreApplication.translate(
49 "OpenSearchReader",
50 "The file is not an OpenSearch 1.1 file."))
51 return engine
52
53 while not self.atEnd():
54 self.readNext()
55
56 if not self.isStartElement():
57 continue
58
59 if self.name() == "ShortName":
60 engine.setName(self.readElementText())
61
62 elif self.name() == "Description":
63 engine.setDescription(self.readElementText())
64
65 elif self.name() == "Url":
66 type_ = self.attributes().value("type")
67 url = self.attributes().value("template")
68 method = self.attributes().value("method")
69
70 if (
71 type_ == "application/x-suggestions+json" and
72 engine.suggestionsUrlTemplate()
73 ):
74 continue
75
76 if (
77 (not type_ or
78 type_ in ("text/html", "application/xhtml+xml")) and
79 engine.searchUrlTemplate()
80 ):
81 continue
82
83 if not url:
84 continue
85
86 parameters = []
87
88 self.readNext()
89
90 while not (self.isEndElement() and self.name() == "Url"):
91 if (
92 not self.isStartElement() or
93 (self.name() != "Param" and
94 self.name() != "Parameter")
95 ):
96 self.readNext()
97 continue
98
99 key = self.attributes().value("name")
100 value = self.attributes().value("value")
101
102 if key and value:
103 parameters.append((key, value))
104
105 while not self.isEndElement():
106 self.readNext()
107
108 if type_ == "application/x-suggestions+json":
109 engine.setSuggestionsUrlTemplate(url)
110 engine.setSuggestionsParameters(parameters)
111 engine.setSuggestionsMethod(method)
112 elif (
113 not type_ or
114 type_ in ("text/html", "application/xhtml+xml")
115 ):
116 engine.setSearchUrlTemplate(url)
117 engine.setSearchParameters(parameters)
118 engine.setSearchMethod(method)
119
120 elif self.name() == "Image":
121 engine.setImageUrl(self.readElementText())
122
123 if (
124 engine.name() and
125 engine.description() and
126 engine.suggestionsUrlTemplate() and
127 engine.searchUrlTemplate() and
128 engine.imageUrl()
129 ):
130 break
131
132 return engine

eric ide

mercurial