src/eric7/QtHelpInterface/QtHelpDocumentationSettings.py

branch
eric7
changeset 9686
2eee7a645cba
parent 9681
cef9b7dfc997
child 10373
093dcebe5ecb
equal deleted inserted replaced
9685:b43e04854aba 9686:2eee7a645cba
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2021 - 2023 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a class to store the QtHelp documentation settings before
8 being applied to the help engine.
9 """
10
11 import collections
12 import contextlib
13 import copy
14
15 from PyQt6.QtHelp import QCompressedHelpInfo
16
17
18 class QtHelpDocumentationSettings:
19 """
20 Class implementing a temporary store for QtHelp documentation settings.
21 """
22
23 def __init__(self):
24 """
25 Constructor
26 """
27 self._namespaceToComponent = {}
28 self._componentToNamespace = collections.defaultdict(list)
29
30 self._namespaceToVersion = {}
31 self._versionToNamespace = collections.defaultdict(list)
32
33 self._namespaceToFilename = {}
34 self._filenameToNamespace = {}
35
36 def addDocumentation(self, filename):
37 """
38 Public method to a add a documentation file to the list.
39
40 @param filename name of the documentation file to add
41 @type str
42 @return flag indicating success
43 @rtype bool
44 """
45 info = QCompressedHelpInfo.fromCompressedHelpFile(filename)
46
47 if info.isNull():
48 return False
49
50 namespace = info.namespaceName()
51
52 if namespace in self._namespaceToFilename:
53 return False
54
55 if filename in self._filenameToNamespace:
56 return False
57
58 component = info.component()
59 version = info.version()
60
61 self._namespaceToFilename[namespace] = filename
62 self._filenameToNamespace[filename] = namespace
63
64 self._namespaceToComponent[namespace] = component
65 self._componentToNamespace[component].append(namespace)
66
67 self._namespaceToVersion[namespace] = version
68 self._versionToNamespace[version].append(namespace)
69
70 return True
71
72 def removeDocumentation(self, namespace):
73 """
74 Public method to remove the documentation of a given namespace.
75
76 @param namespace name of the namespace
77 @type str
78 @return flag indicating success
79 @rtype bool
80 """
81 if not namespace:
82 return False
83
84 try:
85 filename = self._namespaceToFilename[namespace]
86 except KeyError:
87 return False
88
89 component = self._namespaceToComponent[namespace]
90 version = self._namespaceToVersion[namespace]
91
92 del self._namespaceToComponent[namespace]
93 del self._namespaceToVersion[namespace]
94 del self._namespaceToFilename[namespace]
95 with contextlib.suppress(KeyError):
96 del self._filenameToNamespace[filename]
97 self._componentToNamespace[component].remove(namespace)
98 if len(self._componentToNamespace[component]) == 0:
99 del self._componentToNamespace[component]
100 self._versionToNamespace[version].remove(namespace)
101 if len(self._versionToNamespace[version]) == 0:
102 del self._versionToNamespace[version]
103
104 return True
105
106 def namespace(self, filename):
107 """
108 Public method to get the namespace defined by a QtHelp file.
109
110 @param filename name of the QtHelp file
111 @type str
112 @return name of the namespace
113 @rtype str
114 """
115 return self._filenameToNamespace[filename]
116
117 def components(self):
118 """
119 Public method to get the list of components.
120
121 @return list of components
122 @rtype list of str
123 """
124 return [k for k in self._componentToNamespace.keys()]
125
126 def versions(self):
127 """
128 Public method to get the list of versions.
129
130 @return list of versions
131 @rtype list of QVersionNumber
132 """
133 return [k for k in self._versionToNamespace.keys()]
134
135 def namespaces(self):
136 """
137 Public method to get the list of namespaces.
138
139 @return list of namespaces
140 @rtype list of str
141 """
142 return [k for k in self._namespaceToFilename.keys()]
143
144 def namespaceToFilename(self):
145 """
146 Public method to get the namespace to filename mapping.
147
148 @return dictionary containing the namespace to filename mapping
149 @rtype dict
150 """
151 return copy.deepcopy(self._namespaceToFilename)
152
153 @staticmethod
154 def readSettings(helpEngine):
155 """
156 Static method to read the QtHelp documentation configuration.
157
158 @param helpEngine reference to the QtHelp engine
159 @type QHelpEngineCore
160 @return reference to the created QtHelpDocumentationSettings object
161 @rtype QtHelpDocumentationSettings
162 """
163 filterEngine = helpEngine.filterEngine()
164
165 docSettings = QtHelpDocumentationSettings()
166 docSettings._namespaceToComponent = filterEngine.namespaceToComponent()
167 docSettings._namespaceToVersion = filterEngine.namespaceToVersion()
168
169 for namespace, component in docSettings._namespaceToComponent.items():
170 filename = helpEngine.documentationFileName(namespace)
171 docSettings._namespaceToFilename[namespace] = filename
172 docSettings._filenameToNamespace[filename] = namespace
173 docSettings._componentToNamespace[component].append(namespace)
174
175 for namespace, version in docSettings._namespaceToVersion.items():
176 docSettings._versionToNamespace[version].append(namespace)
177
178 return docSettings
179
180 @staticmethod
181 def applySettings(helpEngine, settings):
182 """
183 Static method to apply the changed QtHelp documentation configuration.
184
185 @param helpEngine reference to the QtHelp engine
186 @type QHelpEngineCore
187 @param settings reference to the created QtHelpDocumentationSettings
188 object
189 @type QtHelpDocumentationSettings
190 @return flag indicating success
191 @rtype bool
192 """
193 currentSettings = QtHelpDocumentationSettings.readSettings(helpEngine)
194
195 docsToRemove = [
196 name
197 for name in currentSettings._namespaceToFilename
198 if name not in settings._namespaceToFilename
199 ]
200 docsToAdd = [
201 filename
202 for filename in settings._filenameToNamespace
203 if filename not in currentSettings._filenameToNamespace
204 ]
205
206 changed = False
207 for namespace in docsToRemove:
208 helpEngine.unregisterDocumentation(namespace)
209 changed = True
210
211 for filename in docsToAdd:
212 helpEngine.registerDocumentation(filename)
213 changed = True
214
215 return changed

eric ide

mercurial