eric7/WebBrowser/SpeedDial/SpeedDialReader.py

branch
eric7
changeset 8312
800c432b34c8
parent 8218
7c09585bd960
child 8318
962bce857696
equal deleted inserted replaced
8311:4e8b98454baa 8312:800c432b34c8
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2012 - 2021 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 PyQt5.QtCore import QXmlStreamReader, QIODevice, QFile, QCoreApplication
12
13
14 class SpeedDialReader(QXmlStreamReader):
15 """
16 Class implementing a reader object for speed dial data files.
17 """
18 def __init__(self):
19 """
20 Constructor
21 """
22 super().__init__()
23
24 def read(self, fileNameOrDevice):
25 """
26 Public method to read a user agent file.
27
28 @param fileNameOrDevice name of the file to read (string)
29 or reference to the device to read (QIODevice)
30 @return list of speed dial pages (list of Page), number of pages per
31 row (integer) and size of the speed dial pages (integer)
32 """
33 self.__pages = []
34 self.__pagesPerRow = 0
35 self.__sdSize = 0
36
37 if isinstance(fileNameOrDevice, QIODevice):
38 self.setDevice(fileNameOrDevice)
39 else:
40 f = QFile(fileNameOrDevice)
41 if not f.exists():
42 return self.__pages, self.__pagesPerRow, self.__sdSize
43 opened = f.open(QFile.ReadOnly)
44 if not opened:
45 self.raiseError(QCoreApplication.translate(
46 "SpeedDialReader",
47 "The file {0} could not be opened. Error: {1}").format(
48 fileNameOrDevice, f.errorString()))
49 return self.__pages, self.__pagesPerRow, self.__sdSize
50 self.setDevice(f)
51
52 while not self.atEnd():
53 self.readNext()
54 if self.isStartElement():
55 version = self.attributes().value("version")
56 if (
57 self.name() == "SpeedDial" and
58 (not version or version == "1.0")
59 ):
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