Helpviewer/OpenSearch/OpenSearchReader.py

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

eric ide

mercurial