eric6/WebBrowser/SpeedDial/SpeedDialReader.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7229
53054eb5b15a
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2012 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6
7 """
8 Module implementing a class to read speed dial data files.
9 """
10
11 from __future__ import unicode_literals
12
13 from PyQt5.QtCore import QXmlStreamReader, QIODevice, QFile, QCoreApplication
14
15
16 class SpeedDialReader(QXmlStreamReader):
17 """
18 Class implementing a reader object for speed dial data files.
19 """
20 def __init__(self):
21 """
22 Constructor
23 """
24 super(SpeedDialReader, self).__init__()
25
26 def read(self, fileNameOrDevice):
27 """
28 Public method to read a user agent file.
29
30 @param fileNameOrDevice name of the file to read (string)
31 or reference to the device to read (QIODevice)
32 @return list of speed dial pages (list of Page), number of pages per
33 row (integer) and size of the speed dial pages (integer)
34 """
35 self.__pages = []
36 self.__pagesPerRow = 0
37 self.__sdSize = 0
38
39 if isinstance(fileNameOrDevice, QIODevice):
40 self.setDevice(fileNameOrDevice)
41 else:
42 f = QFile(fileNameOrDevice)
43 if not f.exists():
44 return self.__pages, self.__pagesPerRow, self.__sdSize
45 opened = f.open(QFile.ReadOnly)
46 if not opened:
47 self.raiseError(QCoreApplication.translate(
48 "SpeedDialReader",
49 "The file {0} could not be opened. Error: {1}").format(
50 fileNameOrDevice, f.errorString()))
51 return self.__pages, self.__pagesPerRow, self.__sdSize
52 self.setDevice(f)
53
54 while not self.atEnd():
55 self.readNext()
56 if self.isStartElement():
57 version = self.attributes().value("version")
58 if self.name() == "SpeedDial" and \
59 (not version or version == "1.0"):
60 self.__readSpeedDial()
61 else:
62 self.raiseError(QCoreApplication.translate(
63 "SpeedDialReader",
64 "The file is not a SpeedDial version 1.0 file."))
65
66 return self.__pages, self.__pagesPerRow, self.__sdSize
67
68 def __readSpeedDial(self):
69 """
70 Private method to read the speed dial data.
71 """
72 if not self.isStartElement() and self.name() != "SpeedDial":
73 return
74
75 while not self.atEnd():
76 self.readNext()
77 if self.isEndElement():
78 if self.name() in ["Pages", "Page"]:
79 continue
80 else:
81 break
82
83 if self.isStartElement():
84 if self.name() == "Pages":
85 attributes = self.attributes()
86 pagesPerRow = attributes.value("row")
87 if pagesPerRow.isdigit():
88 self.__pagesPerRow = int(pagesPerRow)
89 sdSize = attributes.value("size")
90 if sdSize.isdigit():
91 self.__sdSize = int(sdSize)
92 elif self.name() == "Page":
93 attributes = self.attributes()
94 url = attributes.value("url")
95 title = attributes.value("title")
96 if url:
97 if not title:
98 title = url
99 from .Page import Page
100 page = Page(url, title)
101 self.__pages.append(page)
102 else:
103 self.__skipUnknownElement()
104
105 def __skipUnknownElement(self):
106 """
107 Private method to skip over all unknown elements.
108 """
109 if not self.isStartElement():
110 return
111
112 while not self.atEnd():
113 self.readNext()
114 if self.isEndElement():
115 break
116
117 if self.isStartElement():
118 self.__skipUnknownElement()

eric ide

mercurial