Browse Source

docs, examples and logging updated

master
Dirk Alders 3 months ago
parent
commit
cc06fae9cd
100 changed files with 3686 additions and 19117 deletions
  1. 75
    78
      __init__.py
  2. 1
    1
      _docs_/.buildinfo
  3. BIN
      _docs_/_downloads/f5f51665bfc67c10ccc039770b738067/unittest.pdf
  4. 1
    0
      _docs_/_sources/index.rst.txt
  5. 301
    52
      _docs_/_static/basic.css
  6. 269
    0
      _docs_/_static/classic.css
  7. 92
    0
      _docs_/_static/copybutton.js
  8. 0
    1
      _docs_/_static/css/badge_only.css
  9. BIN
      _docs_/_static/css/fonts/Roboto-Slab-Bold.woff
  10. BIN
      _docs_/_static/css/fonts/Roboto-Slab-Bold.woff2
  11. BIN
      _docs_/_static/css/fonts/Roboto-Slab-Regular.woff
  12. BIN
      _docs_/_static/css/fonts/Roboto-Slab-Regular.woff2
  13. BIN
      _docs_/_static/css/fonts/fontawesome-webfont.eot
  14. 0
    2671
      _docs_/_static/css/fonts/fontawesome-webfont.svg
  15. BIN
      _docs_/_static/css/fonts/fontawesome-webfont.ttf
  16. BIN
      _docs_/_static/css/fonts/fontawesome-webfont.woff
  17. BIN
      _docs_/_static/css/fonts/fontawesome-webfont.woff2
  18. BIN
      _docs_/_static/css/fonts/lato-bold-italic.woff
  19. BIN
      _docs_/_static/css/fonts/lato-bold-italic.woff2
  20. BIN
      _docs_/_static/css/fonts/lato-bold.woff
  21. BIN
      _docs_/_static/css/fonts/lato-bold.woff2
  22. BIN
      _docs_/_static/css/fonts/lato-normal-italic.woff
  23. BIN
      _docs_/_static/css/fonts/lato-normal-italic.woff2
  24. BIN
      _docs_/_static/css/fonts/lato-normal.woff
  25. BIN
      _docs_/_static/css/fonts/lato-normal.woff2
  26. 0
    4
      _docs_/_static/css/theme.css
  27. 1
    0
      _docs_/_static/default.css
  28. 109
    268
      _docs_/_static/doctools.js
  29. 6
    3
      _docs_/_static/documentation_options.js
  30. BIN
      _docs_/_static/fonts/FontAwesome.otf
  31. BIN
      _docs_/_static/fonts/Lato/lato-bold.eot
  32. BIN
      _docs_/_static/fonts/Lato/lato-bold.ttf
  33. BIN
      _docs_/_static/fonts/Lato/lato-bold.woff
  34. BIN
      _docs_/_static/fonts/Lato/lato-bold.woff2
  35. BIN
      _docs_/_static/fonts/Lato/lato-bolditalic.eot
  36. BIN
      _docs_/_static/fonts/Lato/lato-bolditalic.ttf
  37. BIN
      _docs_/_static/fonts/Lato/lato-bolditalic.woff
  38. BIN
      _docs_/_static/fonts/Lato/lato-bolditalic.woff2
  39. BIN
      _docs_/_static/fonts/Lato/lato-italic.eot
  40. BIN
      _docs_/_static/fonts/Lato/lato-italic.ttf
  41. BIN
      _docs_/_static/fonts/Lato/lato-italic.woff
  42. BIN
      _docs_/_static/fonts/Lato/lato-italic.woff2
  43. BIN
      _docs_/_static/fonts/Lato/lato-regular.eot
  44. BIN
      _docs_/_static/fonts/Lato/lato-regular.ttf
  45. BIN
      _docs_/_static/fonts/Lato/lato-regular.woff
  46. BIN
      _docs_/_static/fonts/Lato/lato-regular.woff2
  47. BIN
      _docs_/_static/fonts/Roboto-Slab-Bold.woff
  48. BIN
      _docs_/_static/fonts/Roboto-Slab-Bold.woff2
  49. BIN
      _docs_/_static/fonts/Roboto-Slab-Light.woff
  50. BIN
      _docs_/_static/fonts/Roboto-Slab-Light.woff2
  51. BIN
      _docs_/_static/fonts/Roboto-Slab-Regular.woff
  52. BIN
      _docs_/_static/fonts/Roboto-Slab-Regular.woff2
  53. BIN
      _docs_/_static/fonts/Roboto-Slab-Thin.woff
  54. BIN
      _docs_/_static/fonts/Roboto-Slab-Thin.woff2
  55. BIN
      _docs_/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot
  56. BIN
      _docs_/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf
  57. BIN
      _docs_/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff
  58. BIN
      _docs_/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2
  59. BIN
      _docs_/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot
  60. BIN
      _docs_/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf
  61. BIN
      _docs_/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff
  62. BIN
      _docs_/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2
  63. BIN
      _docs_/_static/fonts/fontawesome-webfont.eot
  64. 0
    2671
      _docs_/_static/fonts/fontawesome-webfont.svg
  65. BIN
      _docs_/_static/fonts/fontawesome-webfont.ttf
  66. BIN
      _docs_/_static/fonts/fontawesome-webfont.woff
  67. BIN
      _docs_/_static/fonts/fontawesome-webfont.woff2
  68. BIN
      _docs_/_static/fonts/lato-bold-italic.woff
  69. BIN
      _docs_/_static/fonts/lato-bold-italic.woff2
  70. BIN
      _docs_/_static/fonts/lato-bold.woff
  71. BIN
      _docs_/_static/fonts/lato-bold.woff2
  72. BIN
      _docs_/_static/fonts/lato-normal-italic.woff
  73. BIN
      _docs_/_static/fonts/lato-normal-italic.woff2
  74. BIN
      _docs_/_static/fonts/lato-normal.woff
  75. BIN
      _docs_/_static/fonts/lato-normal.woff2
  76. 0
    10365
      _docs_/_static/jquery.js
  77. 0
    1
      _docs_/_static/js/badge_only.js
  78. 0
    4
      _docs_/_static/js/html5shiv-printshiv.min.js
  79. 0
    4
      _docs_/_static/js/html5shiv.min.js
  80. 0
    4
      _docs_/_static/js/modernizr.min.js
  81. 0
    1
      _docs_/_static/js/theme.js
  82. 4
    102
      _docs_/_static/language_data.js
  83. 57
    0
      _docs_/_static/menu.js
  84. BIN
      _docs_/_static/py.png
  85. 14
    0
      _docs_/_static/py.svg
  86. 756
    0
      _docs_/_static/pydoctheme.css
  87. 178
    0
      _docs_/_static/pydoctheme_dark.css
  88. 24
    18
      _docs_/_static/pygments.css
  89. 85
    0
      _docs_/_static/pygments_dark.css
  90. 21
    0
      _docs_/_static/search-focus.js
  91. 498
    359
      _docs_/_static/searchtools.js
  92. 81
    0
      _docs_/_static/sidebar.js
  93. 154
    0
      _docs_/_static/sphinx_highlight.js
  94. 24
    0
      _docs_/_static/themetoggle.js
  95. 0
    1692
      _docs_/_static/underscore.js
  96. 225
    179
      _docs_/genindex.html
  97. 516
    466
      _docs_/index.html
  98. BIN
      _docs_/objects.inv
  99. 194
    173
      _docs_/py-modindex.html
  100. 0
    0
      _docs_/search.html

+ 75
- 78
__init__.py View File

45
 
45
 
46
 class property_cache_pickle(object):
46
 class property_cache_pickle(object):
47
     """
47
     """
48
-    Class to cache properties, which take longer on initialising than reading a file in pickle format.
48
+    This class caches the data from a given `source_instance`. It takes the data from the cache instead of generating the data from the `source_instance`,
49
+    if the conditions for the cache usage are given.
50
+
51
+    .. admonition:: Required properties for the `source_instance`
52
+
53
+                * **uid():** returns the unique id of the source's source or None, if you don't want to use the unique id.
54
+                * **keys():** returns a list of all available keys.
55
+                * **data_version():** returns a version number of the current data (it should be increased, if the get method of the source instance returns improved values or the data structure had been changed).
56
+                * **get(key, default):** returns the property for a key. If key does not exists, default will be returned.
57
+    
58
+    .. hint:: You are able to use all parameters and methods of the `source_instance` identically with the property_cache instance.
49
 
59
 
50
     :param source_instance: The source instance holding the data
60
     :param source_instance: The source instance holding the data
51
     :type source_instance: instance
61
     :type source_instance: instance
52
     :param cache_filename: File name, where the properties are stored as cache
62
     :param cache_filename: File name, where the properties are stored as cache
53
     :type cache_filename: str
63
     :type cache_filename: str
54
-    :param load_all_on_init: Optionally init behaviour control parameter. True will load all available properties from source on init, False not.
55
-    :param max_age: The maximum age of the cache object, after that time the source will be used for getting information.
56
-    :type max_age: int
57
-    :param store_on_get: Parameter to enable / disable cache storage on get. If you disble data storage, you need to update and store the cache manually
58
-
59
-    .. note:: source_instance needs to have at least the following methods: uid(), keys(), data_version(), get()
60
-
61
-                * uid(): returns the unique id of the source.
62
-                * keys(): returns a list of all available keys.
63
-                * data_version(): returns a version number of the current data (it should be increased, if the get method of the source instance returns improved values or the data structure had been changed).
64
-                * get(key, default): returns the property for a key. If key does not exists, default will be returned.
65
-
66
-    Reasons for updating the complete data set:
67
-
68
-    * UID of source_instance has changed (in comparison to the cached value).
69
-    * data_version is increased
64
+    :param load_all_on_init: True will load all data from the source instance, when the cache will be initialised the first time.
65
+    :type load_all_on_init: bool
66
+    :param callback_on_data_storage: The callback will be executed every time when the cache file is stored. It will be executed with the instance of this class as first argument.
67
+    :type callback_on_data_storage: method
68
+    :param max_age: The maximum age of the cached data in seconds or None for no maximum age.
69
+    :type max_age: int or None
70
+    :param store_on_get: False will prevent cache storage with execution of the `.get(key, default)` method. You need to store the cache somewhere else.
71
+    :type store_on_get: bool
72
+
73
+    .. admonition:: The cache will be used, if all following conditions are given
74
+
75
+                * The key is in the list returned by `.keys()` method of the `source_instance`
76
+                * The key is not in the list of keys added by the `.add_source_get_keys()` method.
77
+                * The cache age is less then the given max_age parameter or the given max_age is None.
78
+                * The uid of the source instance (e.g. a checksum or unique id of the source) is identically to to uid stored in the cache.
79
+                * The data version of the `source_instance` is <= the data version stored in the cache.
80
+                * The value is available in the previous stored information
70
 
81
 
71
     **Example:**
82
     **Example:**
72
 
83
 
76
 
87
 
77
     .. literalinclude:: caching/_examples_/property_cache_pickle_1.log
88
     .. literalinclude:: caching/_examples_/property_cache_pickle_1.log
78
 
89
 
79
-    With every following execution (slow for getting "two" which is not cached - see implementation):
90
+    With every following execution the time cosumption my by much smaller:
80
 
91
 
81
     .. literalinclude:: caching/_examples_/property_cache_pickle_2.log
92
     .. literalinclude:: caching/_examples_/property_cache_pickle_2.log
82
     """
93
     """
83
-    LOG_PREFIX = 'PickCache:'
84
     DATA_VERSION_TAG = '_property_cache_data_version_'
94
     DATA_VERSION_TAG = '_property_cache_data_version_'
85
     STORAGE_VERSION_TAG = '_storage_version_'
95
     STORAGE_VERSION_TAG = '_storage_version_'
86
     UID_TAG = '_property_cache_uid_'
96
     UID_TAG = '_property_cache_uid_'
100
         self._source_get_keys = []
110
         self._source_get_keys = []
101
         self._cached_props = None
111
         self._cached_props = None
102
 
112
 
113
+    def add_source_get_keys(self, keys):
114
+        """
115
+        This will add one or more keys to a list of keys which will always be provided by the `source_instance` instead of the cache.
116
+
117
+        :param keys: The key or keys to be added
118
+        :type keys: list, tuple, str
119
+        """
120
+        if type(keys) in [list, tuple]:
121
+            self._source_get_keys.extend(keys)
122
+        else:
123
+            self._source_get_keys.append(keys)
124
+
125
+    def full_update(self):
126
+        """
127
+        With the execution of this method, the complete source data which needs to be cached, will be read from the source instance
128
+        and the resulting cache will be stored to the given file.
129
+
130
+        .. hint:: Use this method, if you initiallised the class with `store_on_get=False`
131
+        """
132
+        self._load_source()
133
+        self._save_cache()
134
+
103
     def get(self, key, default=None):
135
     def get(self, key, default=None):
104
         """
136
         """
105
-        Method to get the cached property. If key does not exists in cache, the property will be loaded from source_instance and stored in cache (file).
137
+        Method to get the cached property. If the key does not exists in the cache or `source_instance`, `default` will be returned.
106
 
138
 
107
         :param key: key for value to get.
139
         :param key: key for value to get.
108
         :param default: value to be returned, if key does not exists.
140
         :param default: value to be returned, if key does not exists.
118
                 if cache_old:
150
                 if cache_old:
119
                     logger.debug("The cached value is old, cached value will be ignored")
151
                     logger.debug("The cached value is old, cached value will be ignored")
120
             if self._key_filter(key) not in self._cached_props[self.DATA_TAG] or cache_old:
152
             if self._key_filter(key) not in self._cached_props[self.DATA_TAG] or cache_old:
153
+                logger.debug("Loading property for key='%s' from source instance", key)
121
                 val = self._source_instance.get(key, None)
154
                 val = self._source_instance.get(key, None)
122
-                logger.debug("%s Loading property for '%s' from source instance (%s)", self.LOG_PREFIX, key, repr(val))
123
                 if self._store_on_get:
155
                 if self._store_on_get:
124
                     tm = int(time.time())
156
                     tm = int(time.time())
125
-                    logger.debug("Storing value=%s with timestamp=%d to chache", val, tm)
157
+                    logger.debug("Adding key=%s, value=%s with timestamp=%d to chache", key, val, tm)
126
                     self._cached_props[self.DATA_TAG][self._key_filter(key)] = val
158
                     self._cached_props[self.DATA_TAG][self._key_filter(key)] = val
127
                     self._cached_props[self.AGE_TAG][self._key_filter(key)] = tm
159
                     self._cached_props[self.AGE_TAG][self._key_filter(key)] = tm
128
                     self._save_cache()
160
                     self._save_cache()
129
                 else:
161
                 else:
130
                     return val
162
                     return val
131
             else:
163
             else:
132
-                logger.debug("%s Providing property for '%s' from cache (%s)", self.LOG_PREFIX,
133
-                             key, repr(self._cached_props[self.DATA_TAG].get(self._key_filter(key), default)))
164
+                logger.debug("Providing property for '%s' from cache", key)
134
             return self._cached_props[self.DATA_TAG].get(self._key_filter(key), default)
165
             return self._cached_props[self.DATA_TAG].get(self._key_filter(key), default)
135
         else:
166
         else:
136
-            logger.info("%s Key '%s' is not in cached_keys. Uncached data will be returned.", self.LOG_PREFIX, key)
167
+            if key not in self.keys():
168
+                logger.debug("Key '%s' is not in cached_keys. Uncached data will be returned.", key)
169
+            elif key in self._source_get_keys:
170
+                logger.debug("Key '%s' is excluded by .add_source_get_keys(). Uncached data will be returned.", key)
137
             return self._source_instance.get(key, default)
171
             return self._source_instance.get(key, default)
138
 
172
 
139
-    def full_update(self):
140
-        self._load_source()
141
-        self._save_cache()
142
-
143
-    def keys(self):
144
-        """
145
-        Method to get the available keys (from :data:`source_instance`).
146
-        """
147
-        return self._source_instance.keys()
148
-
149
     def _data_version(self):
173
     def _data_version(self):
150
         if self._cached_props is None:
174
         if self._cached_props is None:
151
             return None
175
             return None
173
         if not load_cache or uid or data_version or storage_version:
197
         if not load_cache or uid or data_version or storage_version:
174
             if load_cache:
198
             if load_cache:
175
                 if self._uid() is not None and uid:
199
                 if self._uid() is not None and uid:
176
-                    logger.debug("%s Source uid changed, ignoring previous cache data", self.LOG_PREFIX)
200
+                    logger.debug("Source uid changed, ignoring previous cache data")
177
                 if self._data_version() is not None and data_version:
201
                 if self._data_version() is not None and data_version:
178
-                    logger.debug("%s Data version increased, ignoring previous cache data", self.LOG_PREFIX)
202
+                    logger.debug("Data version increased, ignoring previous cache data")
179
                 if storage_version:
203
                 if storage_version:
180
-                    logger.debug("%s Storage version changed, ignoring previous cache data", self.LOG_PREFIX)
204
+                    logger.debug("Storage version changed, ignoring previous cache data")
181
             self._cached_props = {self.AGE_TAG: {}, self.DATA_TAG: {}}
205
             self._cached_props = {self.AGE_TAG: {}, self.DATA_TAG: {}}
182
             if self._load_all_on_init:
206
             if self._load_all_on_init:
183
                 self._load_source()
207
                 self._load_source()
190
         if os.path.exists(self._cache_filename):
214
         if os.path.exists(self._cache_filename):
191
             with open(self._cache_filename, 'rb') as fh:
215
             with open(self._cache_filename, 'rb') as fh:
192
                 self._cached_props = pickle.load(fh)
216
                 self._cached_props = pickle.load(fh)
193
-            logger.info('%s Loading properties from cache (%s)', self.LOG_PREFIX, self._cache_filename)
217
+            logger.debug('Loading properties from cache (%s)', self._cache_filename)
194
             return True
218
             return True
195
         else:
219
         else:
196
-            logger.debug('%s Cache file does not exists (yet).', self.LOG_PREFIX)
220
+            logger.debug('Cache file does not exists (yet).')
197
         return False
221
         return False
198
 
222
 
199
     def _key_filter(self, key):
223
     def _key_filter(self, key):
202
     def _load_source(self):
226
     def _load_source(self):
203
         if self._cached_props is None:
227
         if self._cached_props is None:
204
             self._init_cache()
228
             self._init_cache()
205
-        logger.debug('%s Loading all data from source - %s', self.LOG_PREFIX, repr(self.keys()))
229
+        logger.debug('Loading all data from source - %s', repr(self.keys()))
206
         for key in self.keys():
230
         for key in self.keys():
207
             if key not in self._source_get_keys:
231
             if key not in self._source_get_keys:
208
                 self._cached_props[self.DATA_TAG][self._key_filter(key)] = self._source_instance.get(key)
232
                 self._cached_props[self.DATA_TAG][self._key_filter(key)] = self._source_instance.get(key)
211
     def _save_cache(self):
235
     def _save_cache(self):
212
         with open(self._cache_filename, 'wb') as fh:
236
         with open(self._cache_filename, 'wb') as fh:
213
             pickle.dump(self._cached_props, fh)
237
             pickle.dump(self._cached_props, fh)
214
-            logger.info('%s cache-file stored (%s)', self.LOG_PREFIX, self._cache_filename)
238
+            logger.debug('cache-file stored (%s)', self._cache_filename)
215
         if self._callback_on_data_storage is not None:
239
         if self._callback_on_data_storage is not None:
216
-            self._callback_on_data_storage()
240
+            self._callback_on_data_storage(self)
217
 
241
 
218
     def _uid(self):
242
     def _uid(self):
219
         if self._cached_props is None:
243
         if self._cached_props is None:
221
         else:
245
         else:
222
             return self._cached_props.get(self.UID_TAG, None)
246
             return self._cached_props.get(self.UID_TAG, None)
223
 
247
 
224
-    def add_source_get_keys(self, keys):
225
-        if type(keys) in [list, tuple]:
226
-            self._source_get_keys.extend(keys)
227
-        else:
228
-            self._source_get_keys.append(keys)
229
-
230
     def __getattribute__(self, name):
248
     def __getattribute__(self, name):
231
         try:
249
         try:
232
             return super().__getattribute__(name)
250
             return super().__getattribute__(name)
236
 
254
 
237
 class property_cache_json(property_cache_pickle):
255
 class property_cache_json(property_cache_pickle):
238
     """
256
     """
239
-    Class to cache properties, which take longer on initialising than reading a file in json format. See also parent :py:class:`property_cache_pickle`
257
+    See also parent :py:class:`property_cache_pickle` for detailed information.
240
 
258
 
241
-    :param source_instance: The source instance holding the data
242
-    :type source_instance: instance
243
-    :param cache_filename: File name, where the properties are stored as cache
244
-    :type cache_filename: str
245
-    :param load_all_on_init: Optionally init behaviour control parameter. True will load all available properties from source on init, False not.
246
-    :param max_age: The maximum age of the cache object, after that time the source will be used for getting information.
247
-    :type max_age: int
248
-    :param store_on_get: Parameter to enable / disable cache storage on get. If you disble data storage, you need to update and store the cache manually
249
-
250
-    .. warning::
259
+    .. important::
251
         * This class uses json. You should **only** use keys of type string!
260
         * This class uses json. You should **only** use keys of type string!
252
         * Unicode types are transfered to strings
261
         * Unicode types are transfered to strings
253
 
262
 
254
-    .. note:: source_instance needs to have at least the following methods: uid(), keys(), data_version(), get()
255
-
256
-                * uid(): returns the unique id of the source.
257
-                * keys(): returns a list of all available keys.
258
-                * data_version(): returns a version number of the current data (it should be increased, if the get method of the source instance returns improved values or the data structure had been changed).
259
-                * get(key, default): returns the property for a key. If key does not exists, default will be returned.
260
-
261
-    Reasons for updating the complete data set:
262
-
263
-    * UID of source_instance has changed (in comparison to the cached value).
264
-    * data_version is increased
263
+        See limitations of json.
265
 
264
 
266
     **Example:**
265
     **Example:**
267
 
266
 
271
 
270
 
272
     .. literalinclude:: caching/_examples_/property_cache_json_1.log
271
     .. literalinclude:: caching/_examples_/property_cache_json_1.log
273
 
272
 
274
-    With every following execution (slow for getting "two" which is not cached - see implementation):
273
+    With every following execution the time cosumption my by much smaller:
275
 
274
 
276
     .. literalinclude:: caching/_examples_/property_cache_json_2.log
275
     .. literalinclude:: caching/_examples_/property_cache_json_2.log
277
     """
276
     """
278
-    LOG_PREFIX = 'JsonCache:'
279
-
280
     def _load_cache(self):
277
     def _load_cache(self):
281
         if os.path.exists(self._cache_filename):
278
         if os.path.exists(self._cache_filename):
282
             with open(self._cache_filename, 'r') as fh:
279
             with open(self._cache_filename, 'r') as fh:
283
                 self._cached_props = json.load(fh)
280
                 self._cached_props = json.load(fh)
284
-            logger.info('%s Loading properties from cache (%s)', self.LOG_PREFIX, self._cache_filename)
281
+            logger.debug('Loading properties from cache (%s)', self._cache_filename)
285
             return True
282
             return True
286
         else:
283
         else:
287
-            logger.debug('%s Cache file does not exists (yet).', self.LOG_PREFIX)
284
+            logger.debug('Cache file does not exists (yet).')
288
         return False
285
         return False
289
 
286
 
290
     def _save_cache(self):
287
     def _save_cache(self):
291
         with open(self._cache_filename, 'w') as fh:
288
         with open(self._cache_filename, 'w') as fh:
292
             json.dump(self._cached_props, fh, sort_keys=True, indent=4)
289
             json.dump(self._cached_props, fh, sort_keys=True, indent=4)
293
-            logger.info('%s cache-file stored (%s)', self.LOG_PREFIX, self._cache_filename)
290
+            logger.debug('cache-file stored (%s)', self._cache_filename)
294
         if self._callback_on_data_storage is not None:
291
         if self._callback_on_data_storage is not None:
295
-            self._callback_on_data_storage()
292
+            self._callback_on_data_storage(self)

+ 1
- 1
_docs_/.buildinfo View File

1
 # Sphinx build info version 1
1
 # Sphinx build info version 1
2
 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
2
 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
3
-config: 73dea94261007106c35818f82665e5f6
3
+config: 7b165219304607239cf8050fe95b27cb
4
 tags: 645f666f9bcd5a90fca523b33c5a78b7
4
 tags: 645f666f9bcd5a90fca523b33c5a78b7

BIN
_docs_/_downloads/f5f51665bfc67c10ccc039770b738067/unittest.pdf View File


+ 1
- 0
_docs_/_sources/index.rst.txt View File

10
    :members:
10
    :members:
11
 
11
 
12
 .. toctree::
12
 .. toctree::
13
+   :orphan: LICENSE.rst
13
    :maxdepth: 2
14
    :maxdepth: 2
14
    :caption: Contents:
15
    :caption: Contents:
15
 
16
 

+ 301
- 52
_docs_/_static/basic.css View File

4
  *
4
  *
5
  * Sphinx stylesheet -- basic theme.
5
  * Sphinx stylesheet -- basic theme.
6
  *
6
  *
7
- * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
7
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
8
  * :license: BSD, see LICENSE for details.
8
  * :license: BSD, see LICENSE for details.
9
  *
9
  *
10
  */
10
  */
15
     clear: both;
15
     clear: both;
16
 }
16
 }
17
 
17
 
18
+div.section::after {
19
+    display: block;
20
+    content: '';
21
+    clear: left;
22
+}
23
+
18
 /* -- relbar ---------------------------------------------------------------- */
24
 /* -- relbar ---------------------------------------------------------------- */
19
 
25
 
20
 div.related {
26
 div.related {
124
     font-weight: bold;
130
     font-weight: bold;
125
 }
131
 }
126
 
132
 
127
-ul.search li div.context {
133
+ul.search li p.context {
128
     color: #888;
134
     color: #888;
129
     margin: 2px 0 0 30px;
135
     margin: 2px 0 0 30px;
130
     text-align: left;
136
     text-align: left;
216
 /* -- general body styles --------------------------------------------------- */
222
 /* -- general body styles --------------------------------------------------- */
217
 
223
 
218
 div.body {
224
 div.body {
219
-    min-width: 450px;
225
+    min-width: 360px;
220
     max-width: 800px;
226
     max-width: 800px;
221
 }
227
 }
222
 
228
 
231
     visibility: hidden;
237
     visibility: hidden;
232
 }
238
 }
233
 
239
 
240
+a:visited {
241
+    color: #551A8B;
242
+}
243
+
234
 h1:hover > a.headerlink,
244
 h1:hover > a.headerlink,
235
 h2:hover > a.headerlink,
245
 h2:hover > a.headerlink,
236
 h3:hover > a.headerlink,
246
 h3:hover > a.headerlink,
261
     font-weight: bold;
271
     font-weight: bold;
262
 }
272
 }
263
 
273
 
264
-img.align-left, .figure.align-left, object.align-left {
274
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
265
     clear: left;
275
     clear: left;
266
     float: left;
276
     float: left;
267
     margin-right: 1em;
277
     margin-right: 1em;
268
 }
278
 }
269
 
279
 
270
-img.align-right, .figure.align-right, object.align-right {
280
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
271
     clear: right;
281
     clear: right;
272
     float: right;
282
     float: right;
273
     margin-left: 1em;
283
     margin-left: 1em;
274
 }
284
 }
275
 
285
 
276
-img.align-center, .figure.align-center, object.align-center {
286
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
287
+  display: block;
288
+  margin-left: auto;
289
+  margin-right: auto;
290
+}
291
+
292
+img.align-default, figure.align-default, .figure.align-default {
277
   display: block;
293
   display: block;
278
   margin-left: auto;
294
   margin-left: auto;
279
   margin-right: auto;
295
   margin-right: auto;
287
     text-align: center;
303
     text-align: center;
288
 }
304
 }
289
 
305
 
306
+.align-default {
307
+    text-align: center;
308
+}
309
+
290
 .align-right {
310
 .align-right {
291
     text-align: right;
311
     text-align: right;
292
 }
312
 }
293
 
313
 
294
 /* -- sidebars -------------------------------------------------------------- */
314
 /* -- sidebars -------------------------------------------------------------- */
295
 
315
 
296
-div.sidebar {
316
+div.sidebar,
317
+aside.sidebar {
297
     margin: 0 0 0.5em 1em;
318
     margin: 0 0 0.5em 1em;
298
     border: 1px solid #ddb;
319
     border: 1px solid #ddb;
299
-    padding: 7px 7px 0 7px;
320
+    padding: 7px;
300
     background-color: #ffe;
321
     background-color: #ffe;
301
     width: 40%;
322
     width: 40%;
302
     float: right;
323
     float: right;
324
+    clear: right;
325
+    overflow-x: auto;
303
 }
326
 }
304
 
327
 
305
 p.sidebar-title {
328
 p.sidebar-title {
306
     font-weight: bold;
329
     font-weight: bold;
307
 }
330
 }
308
 
331
 
332
+nav.contents,
333
+aside.topic,
334
+div.admonition, div.topic, blockquote {
335
+    clear: left;
336
+}
337
+
309
 /* -- topics ---------------------------------------------------------------- */
338
 /* -- topics ---------------------------------------------------------------- */
310
 
339
 
340
+nav.contents,
341
+aside.topic,
311
 div.topic {
342
 div.topic {
312
     border: 1px solid #ccc;
343
     border: 1px solid #ccc;
313
-    padding: 7px 7px 0 7px;
344
+    padding: 7px;
314
     margin: 10px 0 10px 0;
345
     margin: 10px 0 10px 0;
315
 }
346
 }
316
 
347
 
332
     font-weight: bold;
363
     font-weight: bold;
333
 }
364
 }
334
 
365
 
335
-div.admonition dl {
336
-    margin-bottom: 0;
337
-}
338
-
339
 p.admonition-title {
366
 p.admonition-title {
340
     margin: 0px 10px 5px 0px;
367
     margin: 0px 10px 5px 0px;
341
     font-weight: bold;
368
     font-weight: bold;
346
     margin-top: 25px;
373
     margin-top: 25px;
347
 }
374
 }
348
 
375
 
376
+/* -- content of sidebars/topics/admonitions -------------------------------- */
377
+
378
+div.sidebar > :last-child,
379
+aside.sidebar > :last-child,
380
+nav.contents > :last-child,
381
+aside.topic > :last-child,
382
+div.topic > :last-child,
383
+div.admonition > :last-child {
384
+    margin-bottom: 0;
385
+}
386
+
387
+div.sidebar::after,
388
+aside.sidebar::after,
389
+nav.contents::after,
390
+aside.topic::after,
391
+div.topic::after,
392
+div.admonition::after,
393
+blockquote::after {
394
+    display: block;
395
+    content: '';
396
+    clear: both;
397
+}
398
+
349
 /* -- tables ---------------------------------------------------------------- */
399
 /* -- tables ---------------------------------------------------------------- */
350
 
400
 
351
 table.docutils {
401
 table.docutils {
402
+    margin-top: 10px;
403
+    margin-bottom: 10px;
352
     border: 0;
404
     border: 0;
353
     border-collapse: collapse;
405
     border-collapse: collapse;
354
 }
406
 }
358
     margin-right: auto;
410
     margin-right: auto;
359
 }
411
 }
360
 
412
 
413
+table.align-default {
414
+    margin-left: auto;
415
+    margin-right: auto;
416
+}
417
+
361
 table caption span.caption-number {
418
 table caption span.caption-number {
362
     font-style: italic;
419
     font-style: italic;
363
 }
420
 }
373
     border-bottom: 1px solid #aaa;
430
     border-bottom: 1px solid #aaa;
374
 }
431
 }
375
 
432
 
376
-table.footnote td, table.footnote th {
377
-    border: 0 !important;
378
-}
379
-
380
 th {
433
 th {
381
     text-align: left;
434
     text-align: left;
382
     padding-right: 5px;
435
     padding-right: 5px;
391
     border-bottom: none;
444
     border-bottom: none;
392
 }
445
 }
393
 
446
 
447
+th > :first-child,
448
+td > :first-child {
449
+    margin-top: 0px;
450
+}
451
+
452
+th > :last-child,
453
+td > :last-child {
454
+    margin-bottom: 0px;
455
+}
456
+
394
 /* -- figures --------------------------------------------------------------- */
457
 /* -- figures --------------------------------------------------------------- */
395
 
458
 
396
-div.figure {
459
+div.figure, figure {
397
     margin: 0.5em;
460
     margin: 0.5em;
398
     padding: 0.5em;
461
     padding: 0.5em;
399
 }
462
 }
400
 
463
 
401
-div.figure p.caption {
464
+div.figure p.caption, figcaption {
402
     padding: 0.3em;
465
     padding: 0.3em;
403
 }
466
 }
404
 
467
 
405
-div.figure p.caption span.caption-number {
468
+div.figure p.caption span.caption-number,
469
+figcaption span.caption-number {
406
     font-style: italic;
470
     font-style: italic;
407
 }
471
 }
408
 
472
 
409
-div.figure p.caption span.caption-text {
473
+div.figure p.caption span.caption-text,
474
+figcaption span.caption-text {
410
 }
475
 }
411
 
476
 
412
 /* -- field list styles ----------------------------------------------------- */
477
 /* -- field list styles ----------------------------------------------------- */
433
 
498
 
434
 /* -- hlist styles ---------------------------------------------------------- */
499
 /* -- hlist styles ---------------------------------------------------------- */
435
 
500
 
501
+table.hlist {
502
+    margin: 1em 0;
503
+}
504
+
436
 table.hlist td {
505
 table.hlist td {
437
     vertical-align: top;
506
     vertical-align: top;
438
 }
507
 }
439
 
508
 
509
+/* -- object description styles --------------------------------------------- */
510
+
511
+.sig {
512
+	font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
513
+}
514
+
515
+.sig-name, code.descname {
516
+    background-color: transparent;
517
+    font-weight: bold;
518
+}
519
+
520
+.sig-name {
521
+	font-size: 1.1em;
522
+}
523
+
524
+code.descname {
525
+    font-size: 1.2em;
526
+}
527
+
528
+.sig-prename, code.descclassname {
529
+    background-color: transparent;
530
+}
531
+
532
+.optional {
533
+    font-size: 1.3em;
534
+}
535
+
536
+.sig-paren {
537
+    font-size: larger;
538
+}
539
+
540
+.sig-param.n {
541
+	font-style: italic;
542
+}
543
+
544
+/* C++ specific styling */
545
+
546
+.sig-inline.c-texpr,
547
+.sig-inline.cpp-texpr {
548
+	font-family: unset;
549
+}
550
+
551
+.sig.c   .k, .sig.c   .kt,
552
+.sig.cpp .k, .sig.cpp .kt {
553
+	color: #0033B3;
554
+}
555
+
556
+.sig.c   .m,
557
+.sig.cpp .m {
558
+	color: #1750EB;
559
+}
560
+
561
+.sig.c   .s, .sig.c   .sc,
562
+.sig.cpp .s, .sig.cpp .sc {
563
+	color: #067D17;
564
+}
565
+
440
 
566
 
441
 /* -- other body styles ----------------------------------------------------- */
567
 /* -- other body styles ----------------------------------------------------- */
442
 
568
 
460
     list-style: upper-roman;
586
     list-style: upper-roman;
461
 }
587
 }
462
 
588
 
589
+:not(li) > ol > li:first-child > :first-child,
590
+:not(li) > ul > li:first-child > :first-child {
591
+    margin-top: 0px;
592
+}
593
+
594
+:not(li) > ol > li:last-child > :last-child,
595
+:not(li) > ul > li:last-child > :last-child {
596
+    margin-bottom: 0px;
597
+}
598
+
599
+ol.simple ol p,
600
+ol.simple ul p,
601
+ul.simple ol p,
602
+ul.simple ul p {
603
+    margin-top: 0;
604
+}
605
+
606
+ol.simple > li:not(:first-child) > p,
607
+ul.simple > li:not(:first-child) > p {
608
+    margin-top: 0;
609
+}
610
+
611
+ol.simple p,
612
+ul.simple p {
613
+    margin-bottom: 0;
614
+}
615
+
616
+aside.footnote > span,
617
+div.citation > span {
618
+    float: left;
619
+}
620
+aside.footnote > span:last-of-type,
621
+div.citation > span:last-of-type {
622
+  padding-right: 0.5em;
623
+}
624
+aside.footnote > p {
625
+  margin-left: 2em;
626
+}
627
+div.citation > p {
628
+  margin-left: 4em;
629
+}
630
+aside.footnote > p:last-of-type,
631
+div.citation > p:last-of-type {
632
+    margin-bottom: 0em;
633
+}
634
+aside.footnote > p:last-of-type:after,
635
+div.citation > p:last-of-type:after {
636
+    content: "";
637
+    clear: both;
638
+}
639
+
640
+dl.field-list {
641
+    display: grid;
642
+    grid-template-columns: fit-content(30%) auto;
643
+}
644
+
645
+dl.field-list > dt {
646
+    font-weight: bold;
647
+    word-break: break-word;
648
+    padding-left: 0.5em;
649
+    padding-right: 5px;
650
+}
651
+
652
+dl.field-list > dd {
653
+    padding-left: 0.5em;
654
+    margin-top: 0em;
655
+    margin-left: 0em;
656
+    margin-bottom: 0em;
657
+}
658
+
463
 dl {
659
 dl {
464
     margin-bottom: 15px;
660
     margin-bottom: 15px;
465
 }
661
 }
466
 
662
 
467
-dd p {
663
+dd > :first-child {
468
     margin-top: 0px;
664
     margin-top: 0px;
469
 }
665
 }
470
 
666
 
478
     margin-left: 30px;
674
     margin-left: 30px;
479
 }
675
 }
480
 
676
 
677
+.sig dd {
678
+    margin-top: 0px;
679
+    margin-bottom: 0px;
680
+}
681
+
682
+.sig dl {
683
+    margin-top: 0px;
684
+    margin-bottom: 0px;
685
+}
686
+
687
+dl > dd:last-child,
688
+dl > dd:last-child > :last-child {
689
+    margin-bottom: 0;
690
+}
691
+
481
 dt:target, span.highlighted {
692
 dt:target, span.highlighted {
482
     background-color: #fbe54e;
693
     background-color: #fbe54e;
483
 }
694
 }
491
     font-size: 1.1em;
702
     font-size: 1.1em;
492
 }
703
 }
493
 
704
 
494
-.optional {
495
-    font-size: 1.3em;
496
-}
497
-
498
-.sig-paren {
499
-    font-size: larger;
500
-}
501
-
502
 .versionmodified {
705
 .versionmodified {
503
     font-style: italic;
706
     font-style: italic;
504
 }
707
 }
537
     font-style: oblique;
740
     font-style: oblique;
538
 }
741
 }
539
 
742
 
743
+.classifier:before {
744
+    font-style: normal;
745
+    margin: 0 0.5em;
746
+    content: ":";
747
+    display: inline-block;
748
+}
749
+
540
 abbr, acronym {
750
 abbr, acronym {
541
     border-bottom: dotted 1px;
751
     border-bottom: dotted 1px;
542
     cursor: help;
752
     cursor: help;
543
 }
753
 }
544
 
754
 
755
+.translated {
756
+    background-color: rgba(207, 255, 207, 0.2)
757
+}
758
+
759
+.untranslated {
760
+    background-color: rgba(255, 207, 207, 0.2)
761
+}
762
+
545
 /* -- code displays --------------------------------------------------------- */
763
 /* -- code displays --------------------------------------------------------- */
546
 
764
 
547
 pre {
765
 pre {
549
     overflow-y: hidden;  /* fixes display issues on Chrome browsers */
767
     overflow-y: hidden;  /* fixes display issues on Chrome browsers */
550
 }
768
 }
551
 
769
 
770
+pre, div[class*="highlight-"] {
771
+    clear: both;
772
+}
773
+
552
 span.pre {
774
 span.pre {
553
     -moz-hyphens: none;
775
     -moz-hyphens: none;
554
     -ms-hyphens: none;
776
     -ms-hyphens: none;
555
     -webkit-hyphens: none;
777
     -webkit-hyphens: none;
556
     hyphens: none;
778
     hyphens: none;
779
+    white-space: nowrap;
780
+}
781
+
782
+div[class*="highlight-"] {
783
+    margin: 1em 0;
557
 }
784
 }
558
 
785
 
559
 td.linenos pre {
786
 td.linenos pre {
560
-    padding: 5px 0px;
561
     border: 0;
787
     border: 0;
562
     background-color: transparent;
788
     background-color: transparent;
563
     color: #aaa;
789
     color: #aaa;
564
 }
790
 }
565
 
791
 
566
 table.highlighttable {
792
 table.highlighttable {
567
-    margin-left: 0.5em;
793
+    display: block;
794
+}
795
+
796
+table.highlighttable tbody {
797
+    display: block;
798
+}
799
+
800
+table.highlighttable tr {
801
+    display: flex;
568
 }
802
 }
569
 
803
 
570
 table.highlighttable td {
804
 table.highlighttable td {
571
-    padding: 0 0.5em 0 0.5em;
805
+    margin: 0;
806
+    padding: 0;
807
+}
808
+
809
+table.highlighttable td.linenos {
810
+    padding-right: 0.5em;
811
+}
812
+
813
+table.highlighttable td.code {
814
+    flex: 1;
815
+    overflow: hidden;
816
+}
817
+
818
+.highlight .hll {
819
+    display: block;
820
+}
821
+
822
+div.highlight pre,
823
+table.highlighttable pre {
824
+    margin: 0;
825
+}
826
+
827
+div.code-block-caption + div {
828
+    margin-top: 0;
572
 }
829
 }
573
 
830
 
574
 div.code-block-caption {
831
 div.code-block-caption {
832
+    margin-top: 1em;
575
     padding: 2px 5px;
833
     padding: 2px 5px;
576
     font-size: small;
834
     font-size: small;
577
 }
835
 }
580
     background-color: transparent;
838
     background-color: transparent;
581
 }
839
 }
582
 
840
 
583
-div.code-block-caption + div > div.highlight > pre {
584
-    margin-top: 0;
841
+table.highlighttable td.linenos,
842
+span.linenos,
843
+div.highlight span.gp {  /* gp: Generic.Prompt */
844
+  user-select: none;
845
+  -webkit-user-select: text; /* Safari fallback only */
846
+  -webkit-user-select: none; /* Chrome/Safari */
847
+  -moz-user-select: none; /* Firefox */
848
+  -ms-user-select: none; /* IE10+ */
585
 }
849
 }
586
 
850
 
587
 div.code-block-caption span.caption-number {
851
 div.code-block-caption span.caption-number {
593
 }
857
 }
594
 
858
 
595
 div.literal-block-wrapper {
859
 div.literal-block-wrapper {
596
-    padding: 1em 1em 0;
597
-}
598
-
599
-div.literal-block-wrapper div.highlight {
600
-    margin: 0;
601
-}
602
-
603
-code.descname {
604
-    background-color: transparent;
605
-    font-weight: bold;
606
-    font-size: 1.2em;
607
-}
608
-
609
-code.descclassname {
610
-    background-color: transparent;
860
+    margin: 1em 0;
611
 }
861
 }
612
 
862
 
613
 code.xref, a code {
863
 code.xref, a code {
648
 }
898
 }
649
 
899
 
650
 span.eqno a.headerlink {
900
 span.eqno a.headerlink {
651
-    position: relative;
652
-    left: 0px;
901
+    position: absolute;
653
     z-index: 1;
902
     z-index: 1;
654
 }
903
 }
655
 
904
 

+ 269
- 0
_docs_/_static/classic.css View File

1
+/*
2
+ * classic.css_t
3
+ * ~~~~~~~~~~~~~
4
+ *
5
+ * Sphinx stylesheet -- classic theme.
6
+ *
7
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
8
+ * :license: BSD, see LICENSE for details.
9
+ *
10
+ */
11
+
12
+@import url("basic.css");
13
+
14
+/* -- page layout ----------------------------------------------------------- */
15
+
16
+html {
17
+    /* CSS hack for macOS's scrollbar (see #1125) */
18
+    background-color: #FFFFFF;
19
+}
20
+
21
+body {
22
+    font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;
23
+    font-size: 100%;
24
+    background-color: white;
25
+    color: #000;
26
+    margin: 0;
27
+    padding: 0;
28
+}
29
+
30
+div.document {
31
+    display: flex;
32
+    background-color: white;
33
+}
34
+
35
+div.documentwrapper {
36
+    float: left;
37
+    width: 100%;
38
+}
39
+
40
+div.bodywrapper {
41
+    margin: 0 0 0 230px;
42
+}
43
+
44
+div.body {
45
+    background-color: white;
46
+    color: #222222;
47
+    padding: 0 20px 30px 20px;
48
+}
49
+
50
+div.footer {
51
+    color: #555555;
52
+    width: 100%;
53
+    padding: 9px 0 9px 0;
54
+    text-align: center;
55
+    font-size: 75%;
56
+}
57
+
58
+div.footer a {
59
+    color: #555555;
60
+    text-decoration: underline;
61
+}
62
+
63
+div.related {
64
+    background-color: white;
65
+    line-height: 30px;
66
+    color: #666666;
67
+}
68
+
69
+div.related a {
70
+    color: #444444;
71
+}
72
+
73
+div.sphinxsidebar {
74
+}
75
+
76
+div.sphinxsidebar h3 {
77
+    font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;
78
+    color: #444444;
79
+    font-size: 1.4em;
80
+    font-weight: normal;
81
+    margin: 0;
82
+    padding: 0;
83
+}
84
+
85
+div.sphinxsidebar h3 a {
86
+    color: #444444;
87
+}
88
+
89
+div.sphinxsidebar h4 {
90
+    font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;
91
+    color: #444444;
92
+    font-size: 1.3em;
93
+    font-weight: normal;
94
+    margin: 5px 0 0 0;
95
+    padding: 0;
96
+}
97
+
98
+div.sphinxsidebar p {
99
+    color: #444444;
100
+}
101
+
102
+div.sphinxsidebar p.topless {
103
+    margin: 5px 10px 10px 10px;
104
+}
105
+
106
+div.sphinxsidebar ul {
107
+    margin: 10px;
108
+    padding: 0;
109
+    color: #444444;
110
+}
111
+
112
+div.sphinxsidebar a {
113
+    color: #444444;
114
+}
115
+
116
+div.sphinxsidebar input {
117
+    border: 1px solid #444444;
118
+    font-family: sans-serif;
119
+    font-size: 1em;
120
+}
121
+
122
+
123
+
124
+/* -- hyperlink styles ------------------------------------------------------ */
125
+
126
+a {
127
+    color: #0090c0;
128
+    text-decoration: none;
129
+}
130
+
131
+a:visited {
132
+    color: #00608f;
133
+    text-decoration: none;
134
+}
135
+
136
+a:hover {
137
+    text-decoration: underline;
138
+}
139
+
140
+
141
+
142
+/* -- body styles ----------------------------------------------------------- */
143
+
144
+div.body h1,
145
+div.body h2,
146
+div.body h3,
147
+div.body h4,
148
+div.body h5,
149
+div.body h6 {
150
+    font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;
151
+    background-color: white;
152
+    font-weight: normal;
153
+    color: #1a1a1a;
154
+    border-bottom: 1px solid #ccc;
155
+    margin: 20px -20px 10px -20px;
156
+    padding: 3px 0 3px 10px;
157
+}
158
+
159
+div.body h1 { margin-top: 0; font-size: 200%; }
160
+div.body h2 { font-size: 160%; }
161
+div.body h3 { font-size: 140%; }
162
+div.body h4 { font-size: 120%; }
163
+div.body h5 { font-size: 110%; }
164
+div.body h6 { font-size: 100%; }
165
+
166
+a.headerlink {
167
+    color: #aaaaaa;
168
+    font-size: 0.8em;
169
+    padding: 0 4px 0 4px;
170
+    text-decoration: none;
171
+}
172
+
173
+a.headerlink:hover {
174
+    background-color: #aaaaaa;
175
+    color: white;
176
+}
177
+
178
+div.body p, div.body dd, div.body li, div.body blockquote {
179
+    text-align: justify;
180
+    line-height: 130%;
181
+}
182
+
183
+div.admonition p.admonition-title + p {
184
+    display: inline;
185
+}
186
+
187
+div.admonition p {
188
+    margin-bottom: 5px;
189
+}
190
+
191
+div.admonition pre {
192
+    margin-bottom: 5px;
193
+}
194
+
195
+div.admonition ul, div.admonition ol {
196
+    margin-bottom: 5px;
197
+}
198
+
199
+div.note {
200
+    background-color: #eee;
201
+    border: 1px solid #ccc;
202
+}
203
+
204
+div.seealso {
205
+    background-color: #ffc;
206
+    border: 1px solid #ff6;
207
+}
208
+
209
+nav.contents,
210
+aside.topic,
211
+div.topic {
212
+    background-color: #eee;
213
+}
214
+
215
+div.warning {
216
+    background-color: #ffe4e4;
217
+    border: 1px solid #f66;
218
+}
219
+
220
+p.admonition-title {
221
+    display: inline;
222
+}
223
+
224
+p.admonition-title:after {
225
+    content: ":";
226
+}
227
+
228
+pre {
229
+    padding: 5px;
230
+    background-color: #eeffcc;
231
+    color: #333333;
232
+    line-height: 120%;
233
+    border: 1px solid #ac9;
234
+    border-left: none;
235
+    border-right: none;
236
+}
237
+
238
+code {
239
+    background-color: #ecf0f3;
240
+    padding: 0 1px 0 1px;
241
+    font-size: 0.95em;
242
+}
243
+
244
+th, dl.field-list > dt {
245
+    background-color: #ede;
246
+}
247
+
248
+.warning code {
249
+    background: #efc2c2;
250
+}
251
+
252
+.note code {
253
+    background: #d6d6d6;
254
+}
255
+
256
+.viewcode-back {
257
+    font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;
258
+}
259
+
260
+div.viewcode-block:target {
261
+    background-color: #f4debf;
262
+    border-top: 1px solid #ac9;
263
+    border-bottom: 1px solid #ac9;
264
+}
265
+
266
+div.code-block-caption {
267
+    color: #efefef;
268
+    background-color: #1c4e63;
269
+}

+ 92
- 0
_docs_/_static/copybutton.js View File

1
+// ``function*`` denotes a generator in JavaScript, see
2
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*
3
+function* getHideableCopyButtonElements(rootElement) {
4
+    // yield all elements with the "go" (Generic.Output),
5
+    // "gp" (Generic.Prompt), or "gt" (Generic.Traceback) CSS class
6
+    for (const el of rootElement.querySelectorAll('.go, .gp, .gt')) {
7
+        yield el
8
+    }
9
+    // tracebacks (.gt) contain bare text elements that need to be
10
+    // wrapped in a span to hide or show the element
11
+    for (let el of rootElement.querySelectorAll('.gt')) {
12
+        while ((el = el.nextSibling) && el.nodeType !== Node.DOCUMENT_NODE) {
13
+            // stop wrapping text nodes when we hit the next output or
14
+            // prompt element
15
+            if (el.nodeType === Node.ELEMENT_NODE && el.matches(".gp, .go")) {
16
+                break
17
+            }
18
+            // if the node is a text node with content, wrap it in a
19
+            // span element so that we can control visibility
20
+            if (el.nodeType === Node.TEXT_NODE && el.textContent.trim()) {
21
+                const wrapper = document.createElement("span")
22
+                el.after(wrapper)
23
+                wrapper.appendChild(el)
24
+                el = wrapper
25
+            }
26
+            yield el
27
+        }
28
+    }
29
+}
30
+
31
+
32
+const loadCopyButton = () => {
33
+    /* Add a [>>>] button in the top-right corner of code samples to hide
34
+     * the >>> and ... prompts and the output and thus make the code
35
+     * copyable. */
36
+    const hide_text = "Hide the prompts and output"
37
+    const show_text = "Show the prompts and output"
38
+
39
+    const button = document.createElement("span")
40
+    button.classList.add("copybutton")
41
+    button.innerText = ">>>"
42
+    button.title = hide_text
43
+    button.dataset.hidden = "false"
44
+    const buttonClick = event => {
45
+        // define the behavior of the button when it's clicked
46
+        event.preventDefault()
47
+        const buttonEl = event.currentTarget
48
+        const codeEl = buttonEl.nextElementSibling
49
+        if (buttonEl.dataset.hidden === "false") {
50
+            // hide the code output
51
+            for (const el of getHideableCopyButtonElements(codeEl)) {
52
+                el.hidden = true
53
+            }
54
+            buttonEl.title = show_text
55
+            buttonEl.dataset.hidden = "true"
56
+        } else {
57
+            // show the code output
58
+            for (const el of getHideableCopyButtonElements(codeEl)) {
59
+                el.hidden = false
60
+            }
61
+            buttonEl.title = hide_text
62
+            buttonEl.dataset.hidden = "false"
63
+        }
64
+    }
65
+
66
+    const highlightedElements = document.querySelectorAll(
67
+        ".highlight-python .highlight,"
68
+        + ".highlight-python3 .highlight,"
69
+        + ".highlight-pycon .highlight,"
70
+        + ".highlight-pycon3 .highlight,"
71
+        + ".highlight-default .highlight"
72
+    )
73
+
74
+    // create and add the button to all the code blocks that contain >>>
75
+    highlightedElements.forEach(el => {
76
+        el.style.position = "relative"
77
+
78
+        // if we find a console prompt (.gp), prepend the (deeply cloned) button
79
+        const clonedButton = button.cloneNode(true)
80
+        // the onclick attribute is not cloned, set it on the new element
81
+        clonedButton.onclick = buttonClick
82
+        if (el.querySelector(".gp") !== null) {
83
+            el.prepend(clonedButton)
84
+        }
85
+    })
86
+}
87
+
88
+if (document.readyState !== "loading") {
89
+    loadCopyButton()
90
+} else {
91
+    document.addEventListener("DOMContentLoaded", loadCopyButton)
92
+}

+ 0
- 1
_docs_/_static/css/badge_only.css View File

1
-.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}

BIN
_docs_/_static/css/fonts/Roboto-Slab-Bold.woff View File


BIN
_docs_/_static/css/fonts/Roboto-Slab-Bold.woff2 View File


BIN
_docs_/_static/css/fonts/Roboto-Slab-Regular.woff View File


BIN
_docs_/_static/css/fonts/Roboto-Slab-Regular.woff2 View File


BIN
_docs_/_static/css/fonts/fontawesome-webfont.eot View File


+ 0
- 2671
_docs_/_static/css/fonts/fontawesome-webfont.svg
File diff suppressed because it is too large
View File


BIN
_docs_/_static/css/fonts/fontawesome-webfont.ttf View File


BIN
_docs_/_static/css/fonts/fontawesome-webfont.woff View File


BIN
_docs_/_static/css/fonts/fontawesome-webfont.woff2 View File


BIN
_docs_/_static/css/fonts/lato-bold-italic.woff View File


BIN
_docs_/_static/css/fonts/lato-bold-italic.woff2 View File


BIN
_docs_/_static/css/fonts/lato-bold.woff View File


BIN
_docs_/_static/css/fonts/lato-bold.woff2 View File


BIN
_docs_/_static/css/fonts/lato-normal-italic.woff View File


BIN
_docs_/_static/css/fonts/lato-normal-italic.woff2 View File


BIN
_docs_/_static/css/fonts/lato-normal.woff View File


BIN
_docs_/_static/css/fonts/lato-normal.woff2 View File


+ 0
- 4
_docs_/_static/css/theme.css
File diff suppressed because it is too large
View File


+ 1
- 0
_docs_/_static/default.css View File

1
+@import url("classic.css");

+ 109
- 268
_docs_/_static/doctools.js View File

2
  * doctools.js
2
  * doctools.js
3
  * ~~~~~~~~~~~
3
  * ~~~~~~~~~~~
4
  *
4
  *
5
- * Sphinx JavaScript utilities for all documentation.
5
+ * Base JavaScript utilities for all Sphinx HTML documentation.
6
  *
6
  *
7
- * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
7
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
8
  * :license: BSD, see LICENSE for details.
8
  * :license: BSD, see LICENSE for details.
9
  *
9
  *
10
  */
10
  */
11
-
12
-/**
13
- * select a different prefix for underscore
14
- */
15
-$u = _.noConflict();
16
-
17
-/**
18
- * make the code below compatible with browsers without
19
- * an installed firebug like debugger
20
-if (!window.console || !console.firebug) {
21
-  var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
22
-    "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
23
-    "profile", "profileEnd"];
24
-  window.console = {};
25
-  for (var i = 0; i < names.length; ++i)
26
-    window.console[names[i]] = function() {};
27
-}
28
- */
29
-
30
-/**
31
- * small helper function to urldecode strings
32
- */
33
-jQuery.urldecode = function(x) {
34
-  return decodeURIComponent(x).replace(/\+/g, ' ');
35
-};
36
-
37
-/**
38
- * small helper function to urlencode strings
39
- */
40
-jQuery.urlencode = encodeURIComponent;
41
-
42
-/**
43
- * This function returns the parsed url parameters of the
44
- * current request. Multiple values per key are supported,
45
- * it will always return arrays of strings for the value parts.
46
- */
47
-jQuery.getQueryParameters = function(s) {
48
-  if (typeof s === 'undefined')
49
-    s = document.location.search;
50
-  var parts = s.substr(s.indexOf('?') + 1).split('&');
51
-  var result = {};
52
-  for (var i = 0; i < parts.length; i++) {
53
-    var tmp = parts[i].split('=', 2);
54
-    var key = jQuery.urldecode(tmp[0]);
55
-    var value = jQuery.urldecode(tmp[1]);
56
-    if (key in result)
57
-      result[key].push(value);
58
-    else
59
-      result[key] = [value];
11
+"use strict";
12
+
13
+const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
14
+  "TEXTAREA",
15
+  "INPUT",
16
+  "SELECT",
17
+  "BUTTON",
18
+]);
19
+
20
+const _ready = (callback) => {
21
+  if (document.readyState !== "loading") {
22
+    callback();
23
+  } else {
24
+    document.addEventListener("DOMContentLoaded", callback);
60
   }
25
   }
61
-  return result;
62
 };
26
 };
63
 
27
 
64
-/**
65
- * highlight a given string on a jquery object by wrapping it in
66
- * span elements with the given class name.
67
- */
68
-jQuery.fn.highlightText = function(text, className) {
69
-  function highlight(node, addItems) {
70
-    if (node.nodeType === 3) {
71
-      var val = node.nodeValue;
72
-      var pos = val.toLowerCase().indexOf(text);
73
-      if (pos >= 0 &&
74
-          !jQuery(node.parentNode).hasClass(className) &&
75
-          !jQuery(node.parentNode).hasClass("nohighlight")) {
76
-        var span;
77
-        var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
78
-        if (isInSVG) {
79
-          span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
80
-        } else {
81
-          span = document.createElement("span");
82
-          span.className = className;
83
-        }
84
-        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
85
-        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
86
-          document.createTextNode(val.substr(pos + text.length)),
87
-          node.nextSibling));
88
-        node.nodeValue = val.substr(0, pos);
89
-        if (isInSVG) {
90
-          var bbox = span.getBBox();
91
-          var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
92
-       	  rect.x.baseVal.value = bbox.x;
93
-          rect.y.baseVal.value = bbox.y;
94
-          rect.width.baseVal.value = bbox.width;
95
-          rect.height.baseVal.value = bbox.height;
96
-          rect.setAttribute('class', className);
97
-          var parentOfText = node.parentNode.parentNode;
98
-          addItems.push({
99
-              "parent": node.parentNode,
100
-              "target": rect});
101
-        }
102
-      }
103
-    }
104
-    else if (!jQuery(node).is("button, select, textarea")) {
105
-      jQuery.each(node.childNodes, function() {
106
-        highlight(this, addItems);
107
-      });
108
-    }
109
-  }
110
-  var addItems = [];
111
-  var result = this.each(function() {
112
-    highlight(this, addItems);
113
-  });
114
-  for (var i = 0; i < addItems.length; ++i) {
115
-    jQuery(addItems[i].parent).before(addItems[i].target);
116
-  }
117
-  return result;
118
-};
119
-
120
-/*
121
- * backward compatibility for jQuery.browser
122
- * This will be supported until firefox bug is fixed.
123
- */
124
-if (!jQuery.browser) {
125
-  jQuery.uaMatch = function(ua) {
126
-    ua = ua.toLowerCase();
127
-
128
-    var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
129
-      /(webkit)[ \/]([\w.]+)/.exec(ua) ||
130
-      /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
131
-      /(msie) ([\w.]+)/.exec(ua) ||
132
-      ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
133
-      [];
134
-
135
-    return {
136
-      browser: match[ 1 ] || "",
137
-      version: match[ 2 ] || "0"
138
-    };
139
-  };
140
-  jQuery.browser = {};
141
-  jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
142
-}
143
-
144
 /**
28
 /**
145
  * Small JavaScript module for the documentation.
29
  * Small JavaScript module for the documentation.
146
  */
30
  */
147
-var Documentation = {
148
-
149
-  init : function() {
150
-    this.fixFirefoxAnchorBug();
151
-    this.highlightSearchWords();
152
-    this.initIndexTable();
153
-    if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
154
-      this.initOnKeyListeners();
155
-    }
31
+const Documentation = {
32
+  init: () => {
33
+    Documentation.initDomainIndexTable();
34
+    Documentation.initOnKeyListeners();
156
   },
35
   },
157
 
36
 
158
   /**
37
   /**
159
    * i18n support
38
    * i18n support
160
    */
39
    */
161
-  TRANSLATIONS : {},
162
-  PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
163
-  LOCALE : 'unknown',
40
+  TRANSLATIONS: {},
41
+  PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
42
+  LOCALE: "unknown",
164
 
43
 
165
   // gettext and ngettext don't access this so that the functions
44
   // gettext and ngettext don't access this so that the functions
166
   // can safely bound to a different name (_ = Documentation.gettext)
45
   // can safely bound to a different name (_ = Documentation.gettext)
167
-  gettext : function(string) {
168
-    var translated = Documentation.TRANSLATIONS[string];
169
-    if (typeof translated === 'undefined')
170
-      return string;
171
-    return (typeof translated === 'string') ? translated : translated[0];
172
-  },
173
-
174
-  ngettext : function(singular, plural, n) {
175
-    var translated = Documentation.TRANSLATIONS[singular];
176
-    if (typeof translated === 'undefined')
177
-      return (n == 1) ? singular : plural;
178
-    return translated[Documentation.PLURALEXPR(n)];
46
+  gettext: (string) => {
47
+    const translated = Documentation.TRANSLATIONS[string];
48
+    switch (typeof translated) {
49
+      case "undefined":
50
+        return string; // no translation
51
+      case "string":
52
+        return translated; // translation exists
53
+      default:
54
+        return translated[0]; // (singular, plural) translation tuple exists
55
+    }
179
   },
56
   },
180
 
57
 
181
-  addTranslations : function(catalog) {
182
-    for (var key in catalog.messages)
183
-      this.TRANSLATIONS[key] = catalog.messages[key];
184
-    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
185
-    this.LOCALE = catalog.locale;
58
+  ngettext: (singular, plural, n) => {
59
+    const translated = Documentation.TRANSLATIONS[singular];
60
+    if (typeof translated !== "undefined")
61
+      return translated[Documentation.PLURAL_EXPR(n)];
62
+    return n === 1 ? singular : plural;
186
   },
63
   },
187
 
64
 
188
-  /**
189
-   * add context elements like header anchor links
190
-   */
191
-  addContextElements : function() {
192
-    $('div[id] > :header:first').each(function() {
193
-      $('<a class="headerlink">\u00B6</a>').
194
-      attr('href', '#' + this.id).
195
-      attr('title', _('Permalink to this headline')).
196
-      appendTo(this);
197
-    });
198
-    $('dt[id]').each(function() {
199
-      $('<a class="headerlink">\u00B6</a>').
200
-      attr('href', '#' + this.id).
201
-      attr('title', _('Permalink to this definition')).
202
-      appendTo(this);
203
-    });
65
+  addTranslations: (catalog) => {
66
+    Object.assign(Documentation.TRANSLATIONS, catalog.messages);
67
+    Documentation.PLURAL_EXPR = new Function(
68
+      "n",
69
+      `return (${catalog.plural_expr})`
70
+    );
71
+    Documentation.LOCALE = catalog.locale;
204
   },
72
   },
205
 
73
 
206
   /**
74
   /**
207
-   * workaround a firefox stupidity
208
-   * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
75
+   * helper function to focus on search bar
209
    */
76
    */
210
-  fixFirefoxAnchorBug : function() {
211
-    if (document.location.hash && $.browser.mozilla)
212
-      window.setTimeout(function() {
213
-        document.location.href += '';
214
-      }, 10);
77
+  focusSearchBar: () => {
78
+    document.querySelectorAll("input[name=q]")[0]?.focus();
215
   },
79
   },
216
 
80
 
217
   /**
81
   /**
218
-   * highlight the search words provided in the url in the text
82
+   * Initialise the domain index toggle buttons
219
    */
83
    */
220
-  highlightSearchWords : function() {
221
-    var params = $.getQueryParameters();
222
-    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
223
-    if (terms.length) {
224
-      var body = $('div.body');
225
-      if (!body.length) {
226
-        body = $('body');
84
+  initDomainIndexTable: () => {
85
+    const toggler = (el) => {
86
+      const idNumber = el.id.substr(7);
87
+      const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
88
+      if (el.src.substr(-9) === "minus.png") {
89
+        el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
90
+        toggledRows.forEach((el) => (el.style.display = "none"));
91
+      } else {
92
+        el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
93
+        toggledRows.forEach((el) => (el.style.display = ""));
227
       }
94
       }
228
-      window.setTimeout(function() {
229
-        $.each(terms, function() {
230
-          body.highlightText(this.toLowerCase(), 'highlighted');
231
-        });
232
-      }, 10);
233
-      $('<p class="highlight-link"><a href="javascript:Documentation.' +
234
-        'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
235
-          .appendTo($('#searchbox'));
236
-    }
237
-  },
238
-
239
-  /**
240
-   * init the domain index toggle buttons
241
-   */
242
-  initIndexTable : function() {
243
-    var togglers = $('img.toggler').click(function() {
244
-      var src = $(this).attr('src');
245
-      var idnum = $(this).attr('id').substr(7);
246
-      $('tr.cg-' + idnum).toggle();
247
-      if (src.substr(-9) === 'minus.png')
248
-        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
249
-      else
250
-        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
251
-    }).css('display', '');
252
-    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
253
-        togglers.click();
254
-    }
255
-  },
256
-
257
-  /**
258
-   * helper function to hide the search marks again
259
-   */
260
-  hideSearchWords : function() {
261
-    $('#searchbox .highlight-link').fadeOut(300);
262
-    $('span.highlighted').removeClass('highlighted');
263
-  },
264
-
265
-  /**
266
-   * make the url absolute
267
-   */
268
-  makeURL : function(relativeURL) {
269
-    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
270
-  },
95
+    };
271
 
96
 
272
-  /**
273
-   * get the current relative url
274
-   */
275
-  getCurrentURL : function() {
276
-    var path = document.location.pathname;
277
-    var parts = path.split(/\//);
278
-    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
279
-      if (this === '..')
280
-        parts.pop();
281
-    });
282
-    var url = parts.join('/');
283
-    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
97
+    const togglerElements = document.querySelectorAll("img.toggler");
98
+    togglerElements.forEach((el) =>
99
+      el.addEventListener("click", (event) => toggler(event.currentTarget))
100
+    );
101
+    togglerElements.forEach((el) => (el.style.display = ""));
102
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
284
   },
103
   },
285
 
104
 
286
-  initOnKeyListeners: function() {
287
-    $(document).keyup(function(event) {
288
-      var activeElementType = document.activeElement.tagName;
289
-      // don't navigate when in search box or textarea
290
-      if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') {
291
-        switch (event.keyCode) {
292
-          case 37: // left
293
-            var prevHref = $('link[rel="prev"]').prop('href');
294
-            if (prevHref) {
295
-              window.location.href = prevHref;
296
-              return false;
105
+  initOnKeyListeners: () => {
106
+    // only install a listener if it is really needed
107
+    if (
108
+      !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
109
+      !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
110
+    )
111
+      return;
112
+
113
+    document.addEventListener("keydown", (event) => {
114
+      // bail for input elements
115
+      if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
116
+      // bail with special keys
117
+      if (event.altKey || event.ctrlKey || event.metaKey) return;
118
+
119
+      if (!event.shiftKey) {
120
+        switch (event.key) {
121
+          case "ArrowLeft":
122
+            if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
123
+
124
+            const prevLink = document.querySelector('link[rel="prev"]');
125
+            if (prevLink && prevLink.href) {
126
+              window.location.href = prevLink.href;
127
+              event.preventDefault();
297
             }
128
             }
298
-          case 39: // right
299
-            var nextHref = $('link[rel="next"]').prop('href');
300
-            if (nextHref) {
301
-              window.location.href = nextHref;
302
-              return false;
129
+            break;
130
+          case "ArrowRight":
131
+            if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
132
+
133
+            const nextLink = document.querySelector('link[rel="next"]');
134
+            if (nextLink && nextLink.href) {
135
+              window.location.href = nextLink.href;
136
+              event.preventDefault();
303
             }
137
             }
138
+            break;
304
         }
139
         }
305
       }
140
       }
141
+
142
+      // some keyboard layouts may need Shift to get /
143
+      switch (event.key) {
144
+        case "/":
145
+          if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
146
+          Documentation.focusSearchBar();
147
+          event.preventDefault();
148
+      }
306
     });
149
     });
307
-  }
150
+  },
308
 };
151
 };
309
 
152
 
310
 // quick alias for translations
153
 // quick alias for translations
311
-_ = Documentation.gettext;
154
+const _ = Documentation.gettext;
312
 
155
 
313
-$(document).ready(function() {
314
-  Documentation.init();
315
-});
156
+_ready(Documentation.init);

+ 6
- 3
_docs_/_static/documentation_options.js View File

1
-var DOCUMENTATION_OPTIONS = {
2
-    URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
1
+const DOCUMENTATION_OPTIONS = {
3
     VERSION: '',
2
     VERSION: '',
4
-    LANGUAGE: 'None',
3
+    LANGUAGE: 'en',
5
     COLLAPSE_INDEX: false,
4
     COLLAPSE_INDEX: false,
5
+    BUILDER: 'html',
6
     FILE_SUFFIX: '.html',
6
     FILE_SUFFIX: '.html',
7
+    LINK_SUFFIX: '.html',
7
     HAS_SOURCE: true,
8
     HAS_SOURCE: true,
8
     SOURCELINK_SUFFIX: '.txt',
9
     SOURCELINK_SUFFIX: '.txt',
9
     NAVIGATION_WITH_KEYS: false,
10
     NAVIGATION_WITH_KEYS: false,
11
+    SHOW_SEARCH_SUMMARY: true,
12
+    ENABLE_SEARCH_SHORTCUTS: true,
10
 };
13
 };

BIN
_docs_/_static/fonts/FontAwesome.otf View File


BIN
_docs_/_static/fonts/Lato/lato-bold.eot View File


BIN
_docs_/_static/fonts/Lato/lato-bold.ttf View File


BIN
_docs_/_static/fonts/Lato/lato-bold.woff View File


BIN
_docs_/_static/fonts/Lato/lato-bold.woff2 View File


BIN
_docs_/_static/fonts/Lato/lato-bolditalic.eot View File


BIN
_docs_/_static/fonts/Lato/lato-bolditalic.ttf View File


BIN
_docs_/_static/fonts/Lato/lato-bolditalic.woff View File


BIN
_docs_/_static/fonts/Lato/lato-bolditalic.woff2 View File


BIN
_docs_/_static/fonts/Lato/lato-italic.eot View File


BIN
_docs_/_static/fonts/Lato/lato-italic.ttf View File


BIN
_docs_/_static/fonts/Lato/lato-italic.woff View File


BIN
_docs_/_static/fonts/Lato/lato-italic.woff2 View File


BIN
_docs_/_static/fonts/Lato/lato-regular.eot View File


BIN
_docs_/_static/fonts/Lato/lato-regular.ttf View File


BIN
_docs_/_static/fonts/Lato/lato-regular.woff View File


BIN
_docs_/_static/fonts/Lato/lato-regular.woff2 View File


BIN
_docs_/_static/fonts/Roboto-Slab-Bold.woff View File


BIN
_docs_/_static/fonts/Roboto-Slab-Bold.woff2 View File


BIN
_docs_/_static/fonts/Roboto-Slab-Light.woff View File


BIN
_docs_/_static/fonts/Roboto-Slab-Light.woff2 View File


BIN
_docs_/_static/fonts/Roboto-Slab-Regular.woff View File


BIN
_docs_/_static/fonts/Roboto-Slab-Regular.woff2 View File


BIN
_docs_/_static/fonts/Roboto-Slab-Thin.woff View File


BIN
_docs_/_static/fonts/Roboto-Slab-Thin.woff2 View File


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot View File


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf View File


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff View File


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 View File


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot View File


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf View File


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff View File


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 View File


BIN
_docs_/_static/fonts/fontawesome-webfont.eot View File


+ 0
- 2671
_docs_/_static/fonts/fontawesome-webfont.svg
File diff suppressed because it is too large
View File


BIN
_docs_/_static/fonts/fontawesome-webfont.ttf View File


BIN
_docs_/_static/fonts/fontawesome-webfont.woff View File


BIN
_docs_/_static/fonts/fontawesome-webfont.woff2 View File


BIN
_docs_/_static/fonts/lato-bold-italic.woff View File


BIN
_docs_/_static/fonts/lato-bold-italic.woff2 View File


BIN
_docs_/_static/fonts/lato-bold.woff View File


BIN
_docs_/_static/fonts/lato-bold.woff2 View File


BIN
_docs_/_static/fonts/lato-normal-italic.woff View File


BIN
_docs_/_static/fonts/lato-normal-italic.woff2 View File


BIN
_docs_/_static/fonts/lato-normal.woff View File


BIN
_docs_/_static/fonts/lato-normal.woff2 View File


+ 0
- 10365
_docs_/_static/jquery.js
File diff suppressed because it is too large
View File


+ 0
- 1
_docs_/_static/js/badge_only.js View File

1
-!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}});

+ 0
- 4
_docs_/_static/js/html5shiv-printshiv.min.js View File

1
-/**
2
-* @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
3
-*/
4
-!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document);

+ 0
- 4
_docs_/_static/js/html5shiv.min.js View File

1
-/**
2
-* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
3
-*/
4
-!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);

+ 0
- 4
_docs_/_static/js/modernizr.min.js
File diff suppressed because it is too large
View File


+ 0
- 1
_docs_/_static/js/theme.js View File

1
-!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("<div class='wy-table-responsive'></div>"),n("table.docutils.footnote").wrap("<div class='wy-table-responsive footnote'></div>"),n("table.docutils.citation").wrap("<div class='wy-table-responsive citation'></div>"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n('<span class="toctree-expand"></span>'),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}t.length>0&&($(".wy-menu-vertical .current").removeClass("current"),t.addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l1").parent().addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l2").addClass("current"),t.closest("li.toctree-l3").addClass("current"),t.closest("li.toctree-l4").addClass("current"),t.closest("li.toctree-l5").addClass("current"),t[0].scrollIntoView())}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current"),e.siblings().find("li.current").removeClass("current"),e.find("> ul li.current").removeClass("current"),e.toggleClass("current")}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t<e.length&&!window.requestAnimationFrame;++t)window.requestAnimationFrame=window[e[t]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[t]+"CancelAnimationFrame"]||window[e[t]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,t){var i=(new Date).getTime(),o=Math.max(0,16-(i-n)),r=window.setTimeout((function(){e(i+o)}),o);return n=i+o,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(n){clearTimeout(n)})}()}).call(window)},function(n,e){n.exports=jQuery},function(n,e,t){}]);

+ 4
- 102
_docs_/_static/language_data.js View File

5
  * This script contains the language-specific data used by searchtools.js,
5
  * This script contains the language-specific data used by searchtools.js,
6
  * namely the list of stopwords, stemmer, scorer and splitter.
6
  * namely the list of stopwords, stemmer, scorer and splitter.
7
  *
7
  *
8
- * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
8
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
9
  * :license: BSD, see LICENSE for details.
9
  * :license: BSD, see LICENSE for details.
10
  *
10
  *
11
  */
11
  */
12
 
12
 
13
-var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
13
+var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
14
 
14
 
15
 
15
 
16
-/* Non-minified version JS is _stemmer.js if file is provided */ 
16
+/* Non-minified version is copied as a separate JS file, if available */
17
+
17
 /**
18
 /**
18
  * Porter Stemmer
19
  * Porter Stemmer
19
  */
20
  */
196
   }
197
   }
197
 }
198
 }
198
 
199
 
199
-
200
-
201
-
202
-
203
-var splitChars = (function() {
204
-    var result = {};
205
-    var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
206
-         1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
207
-         2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
208
-         2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
209
-         3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
210
-         3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
211
-         4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
212
-         8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
213
-         11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
214
-         43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
215
-    var i, j, start, end;
216
-    for (i = 0; i < singles.length; i++) {
217
-        result[singles[i]] = true;
218
-    }
219
-    var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
220
-         [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
221
-         [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
222
-         [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
223
-         [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
224
-         [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
225
-         [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
226
-         [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
227
-         [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
228
-         [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
229
-         [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
230
-         [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
231
-         [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
232
-         [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
233
-         [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
234
-         [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
235
-         [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
236
-         [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
237
-         [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
238
-         [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
239
-         [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
240
-         [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
241
-         [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
242
-         [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
243
-         [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
244
-         [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
245
-         [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
246
-         [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
247
-         [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
248
-         [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
249
-         [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
250
-         [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
251
-         [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
252
-         [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
253
-         [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
254
-         [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
255
-         [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
256
-         [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
257
-         [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
258
-         [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
259
-         [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
260
-         [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
261
-         [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
262
-         [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
263
-         [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
264
-         [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
265
-         [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
266
-         [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
267
-         [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
268
-    for (i = 0; i < ranges.length; i++) {
269
-        start = ranges[i][0];
270
-        end = ranges[i][1];
271
-        for (j = start; j <= end; j++) {
272
-            result[j] = true;
273
-        }
274
-    }
275
-    return result;
276
-})();
277
-
278
-function splitQuery(query) {
279
-    var result = [];
280
-    var start = -1;
281
-    for (var i = 0; i < query.length; i++) {
282
-        if (splitChars[query.charCodeAt(i)]) {
283
-            if (start !== -1) {
284
-                result.push(query.slice(start, i));
285
-                start = -1;
286
-            }
287
-        } else if (start === -1) {
288
-            start = i;
289
-        }
290
-    }
291
-    if (start !== -1) {
292
-        result.push(query.slice(start));
293
-    }
294
-    return result;
295
-}
296
-
297
-

+ 57
- 0
_docs_/_static/menu.js View File

1
+document.addEventListener("DOMContentLoaded", function () {
2
+
3
+    // Make tables responsive by wrapping them in a div and making them scrollable
4
+    const tables = document.querySelectorAll("table.docutils")
5
+    tables.forEach(function(table){
6
+        table.outerHTML = '<div class="responsive-table__container">' + table.outerHTML + "</div>"
7
+    })
8
+
9
+    const togglerInput = document.querySelector(".toggler__input")
10
+    const togglerLabel = document.querySelector(".toggler__label")
11
+    const sideMenu = document.querySelector(".menu-wrapper")
12
+    const menuItems = document.querySelectorAll(".menu")
13
+    const doc = document.querySelector(".document")
14
+    const body = document.querySelector("body")
15
+
16
+    function closeMenu() {
17
+        togglerInput.checked = false
18
+        sideMenu.setAttribute("aria-expanded", "false")
19
+        sideMenu.setAttribute("aria-hidden", "true")
20
+        togglerLabel.setAttribute("aria-pressed", "false")
21
+        body.style.overflow = "visible"
22
+    }
23
+    function openMenu() {
24
+        togglerInput.checked = true
25
+        sideMenu.setAttribute("aria-expanded", "true")
26
+        sideMenu.setAttribute("aria-hidden", "false")
27
+        togglerLabel.setAttribute("aria-pressed", "true")
28
+        body.style.overflow = "hidden"
29
+    }
30
+
31
+    // Close menu when link on the sideMenu is clicked
32
+    sideMenu.addEventListener("click", function (event) {
33
+        let target = event.target
34
+        if (target.tagName.toLowerCase() !== "a") {
35
+            return
36
+        }
37
+        closeMenu()
38
+    })
39
+    // Add accessibility data when sideMenu is opened/closed
40
+    togglerInput.addEventListener("change", function (_event) {
41
+        togglerInput.checked ? openMenu() : closeMenu()
42
+    })
43
+    // Make sideMenu links tabbable only when visible
44
+    for(let menuItem of menuItems) {
45
+        if(togglerInput.checked) {
46
+          menuItem.setAttribute("tabindex", "0")
47
+        } else {
48
+          menuItem.setAttribute("tabindex", "-1")
49
+        }
50
+    }
51
+    // Close sideMenu when document body is clicked
52
+    doc.addEventListener("click", function () {
53
+        if (togglerInput.checked) {
54
+            closeMenu()
55
+        }
56
+    })
57
+})

BIN
_docs_/_static/py.png View File


+ 14
- 0
_docs_/_static/py.svg View File

1
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+<path d="M7.90472 0.00013087C7.24498 0.00316295 6.61493 0.0588153 6.06056 0.15584C4.42744 0.441207 4.13093 1.0385 4.13093 2.14002V3.59479H7.99018V4.07971H4.13093H2.68259C1.56098 4.07971 0.578874 4.7465 0.271682 6.01495C-0.0826595 7.4689 -0.0983765 8.37618 0.271682 9.89434C0.546011 11.0244 1.20115 11.8296 2.32275 11.8296H3.64965V10.0856C3.64965 8.82574 4.75178 7.71441 6.06056 7.71441H9.91531C10.9883 7.71441 11.8449 6.84056 11.8449 5.77472V2.14002C11.8449 1.10556 10.9626 0.328486 9.91531 0.15584C9.25235 0.046687 8.56447 -0.00290121 7.90472 0.00013087ZM5.81767 1.17017C6.2163 1.17017 6.54184 1.49742 6.54184 1.89978C6.54184 2.30072 6.2163 2.62494 5.81767 2.62494C5.41761 2.62494 5.0935 2.30072 5.0935 1.89978C5.0935 1.49742 5.41761 1.17017 5.81767 1.17017Z" fill="url(#paint0_linear)"/>
3
+<path d="M12.3262 4.07971V5.77472C12.3262 7.08883 11.1998 8.19488 9.9153 8.19488H6.06055C5.00466 8.19488 4.13092 9.0887 4.13092 10.1346V13.7693C4.13092 14.8037 5.04038 15.4122 6.06055 15.709C7.28217 16.0642 8.45364 16.1285 9.9153 15.709C10.8869 15.4307 11.8449 14.8708 11.8449 13.7693V12.3145H7.99017V11.8296H11.8449H13.7746C14.8962 11.8296 15.3141 11.0558 15.7042 9.89434C16.1071 8.69865 16.09 7.5488 15.7042 6.01495C15.427 4.91058 14.8976 4.07971 13.7746 4.07971H12.3262ZM10.1582 13.2843C10.5583 13.2843 10.8824 13.6086 10.8824 14.0095C10.8824 14.4119 10.5583 14.7391 10.1582 14.7391C9.75955 14.7391 9.43402 14.4119 9.43402 14.0095C9.43402 13.6086 9.75955 13.2843 10.1582 13.2843Z" fill="url(#paint1_linear)"/>
4
+<defs>
5
+<linearGradient id="paint0_linear" x1="1.25961e-08" y1="1.08223e-08" x2="8.81664" y2="7.59597" gradientUnits="userSpaceOnUse">
6
+<stop stop-color="#5A9FD4"/>
7
+<stop offset="1" stop-color="#306998"/>
8
+</linearGradient>
9
+<linearGradient id="paint1_linear" x1="10.0654" y1="13.8872" x2="6.91912" y2="9.42957" gradientUnits="userSpaceOnUse">
10
+<stop stop-color="#FFD43B"/>
11
+<stop offset="1" stop-color="#FFE873"/>
12
+</linearGradient>
13
+</defs>
14
+</svg>

+ 756
- 0
_docs_/_static/pydoctheme.css View File

1
+@import url('classic.css');
2
+
3
+/* Common colours */
4
+:root {
5
+    --good-color: rgb(41 100 51);
6
+    --good-border: rgb(79 196 100);
7
+    --middle-color: rgb(133 72 38);
8
+    --middle-border: rgb(244, 227, 76);
9
+    --bad-color: rgb(159 49 51);
10
+    --bad-border: rgb(244, 76, 78);
11
+}
12
+
13
+/* unset some styles from the classic stylesheet */
14
+div.document,
15
+div.body,
16
+div.related,
17
+div.body h1,
18
+div.body h2,
19
+div.body h3,
20
+div.body h4,
21
+div.body h5,
22
+div.body h6,
23
+div.sphinxsidebar a,
24
+div.sphinxsidebar p,
25
+div.sphinxsidebar ul,
26
+div.sphinxsidebar h3,
27
+div.sphinxsidebar h3 a,
28
+div.sphinxsidebar h4,
29
+.menu a,
30
+.menu p,
31
+.menu ul,
32
+.menu h3,
33
+.menu h3 a,
34
+.menu h4,
35
+table.docutils td,
36
+table.indextable tr.cap,
37
+pre {
38
+    background-color: inherit;
39
+    color: inherit;
40
+}
41
+
42
+/* Add underlines to links */
43
+a[href] {
44
+    text-decoration: underline 1px;
45
+}
46
+
47
+/* Increase the underline offset for code to avoid obscuring underscores */
48
+a[href]:has(> code) {
49
+    text-underline-offset: 0.25em;
50
+}
51
+
52
+/* No underline for navigation */
53
+a.headerlink,
54
+div.genindex-jumpbox a,
55
+div.modindex-jumpbox a,
56
+div#search-results a,
57
+div.sphinxsidebar a,
58
+div.toctree-wrapper a,
59
+div[role=navigation] a,
60
+table.contentstable a,
61
+table.indextable a {
62
+    text-decoration: none;
63
+}
64
+
65
+/* Except when hovered */
66
+div.genindex-jumpbox a:hover,
67
+div.modindex-jumpbox a:hover,
68
+div#search-results a:hover,
69
+div.sphinxsidebar a:hover,
70
+div.toctree-wrapper a:hover,
71
+div[role=navigation] a:hover,
72
+table.contentstable a:hover,
73
+table.indextable a:hover {
74
+    text-decoration: underline;
75
+    text-underline-offset: auto;
76
+}
77
+
78
+body {
79
+    margin-left: 1em;
80
+    margin-right: 1em;
81
+}
82
+
83
+.mobile-nav,
84
+.menu-wrapper {
85
+    display: none;
86
+}
87
+
88
+div.related {
89
+    margin-top: 0.5em;
90
+    margin-bottom: 1.2em;
91
+    padding: 0.5em 0;
92
+    border-width: 1px;
93
+    border-color: #ccc;
94
+}
95
+
96
+.mobile-nav + div.related {
97
+    border-bottom-style: solid;
98
+}
99
+
100
+.document + div.related {
101
+    border-top-style: solid;
102
+}
103
+
104
+div.related a:hover {
105
+    color: #0095c4;
106
+}
107
+
108
+.related .switchers {
109
+    display: inline-flex;
110
+}
111
+
112
+.switchers > div {
113
+    margin-right: 5px;
114
+}
115
+
116
+div.related ul::after {
117
+    content: '';
118
+    clear: both;
119
+    display: block;
120
+}
121
+
122
+.inline-search,
123
+form.inline-search input {
124
+    display: inline;
125
+}
126
+
127
+form.inline-search input[type='submit'] {
128
+    width: 40px;
129
+}
130
+
131
+div.document {
132
+    display: flex;
133
+    /* Don't let long code literals extend beyond the right side of the screen */
134
+    overflow-wrap: break-word;
135
+}
136
+
137
+/* Don't let long code literals extend beyond the right side of the screen */
138
+span.pre {
139
+    white-space: unset;
140
+}
141
+
142
+div.sphinxsidebar {
143
+    float: none;
144
+    position: sticky;
145
+    top: 0;
146
+    max-height: 100vh;
147
+    color: #444;
148
+    background-color: #eee;
149
+    border-radius: 5px;
150
+    line-height: 130%;
151
+    font-size: smaller;
152
+}
153
+
154
+div.sphinxsidebar h3,
155
+div.sphinxsidebar h4 {
156
+    margin-top: 1.5em;
157
+}
158
+
159
+div.sphinxsidebarwrapper {
160
+    width: 217px;
161
+    box-sizing: border-box;
162
+    height: 100%;
163
+    overflow-x: hidden;
164
+    overflow-y: auto;
165
+    float: left;
166
+}
167
+
168
+div.sphinxsidebarwrapper > h3:first-child {
169
+    margin-top: 0.2em;
170
+}
171
+
172
+div.sphinxsidebarwrapper > ul > li > ul > li {
173
+    margin-bottom: 0.4em;
174
+}
175
+
176
+div.sphinxsidebar a:hover {
177
+    color: #0095c4;
178
+}
179
+
180
+form.inline-search input,
181
+div.sphinxsidebar input,
182
+div.related input {
183
+    font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;
184
+    border: 1px solid #999999;
185
+    font-size: smaller;
186
+    border-radius: 3px;
187
+}
188
+
189
+div.sphinxsidebar input[type='text'] {
190
+    max-width: 150px;
191
+}
192
+
193
+#sidebarbutton {
194
+    /* Sphinx 4.x and earlier compat */
195
+    height: 100%;
196
+    background-color: #CCCCCC;
197
+    margin-left: 0;
198
+    color: #444444;
199
+    font-size: 1.2em;
200
+    cursor: pointer;
201
+    padding-top: 1px;
202
+    float: right;
203
+    display: table;
204
+    /* after Sphinx 4.x and earlier is dropped, only the below is needed */
205
+    width: 12px;
206
+    border-radius: 0 5px 5px 0;
207
+    border-left: none;
208
+}
209
+
210
+#sidebarbutton span {
211
+    /* Sphinx 4.x and earlier compat */
212
+    display: table-cell;
213
+    vertical-align: middle;
214
+}
215
+
216
+#sidebarbutton:hover {
217
+    background-color: #AAAAAA;
218
+}
219
+
220
+div.body {
221
+    padding: 0 0 0 1.2em;
222
+}
223
+
224
+div.body p, div.body dd, div.body li, div.body blockquote {
225
+    text-align: left;
226
+    line-height: 1.6;
227
+}
228
+div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 {
229
+    margin: 0;
230
+    border: 0;
231
+    padding: 0.3em 0;
232
+}
233
+
234
+div.body hr {
235
+    border: 0;
236
+    background-color: #ccc;
237
+    height: 1px;
238
+}
239
+
240
+div.body pre {
241
+    border-radius: 3px;
242
+    border: 1px solid #ac9;
243
+}
244
+
245
+/* Admonitions */
246
+:root {
247
+    --admonition-background: #eee;
248
+    --admonition-border: #ccc;
249
+    --admonition-color: black;
250
+    --attention-background: #bbddff5c;
251
+    --attention-border: #0000ff36;
252
+    --caution-background: #ffc;
253
+    --caution-border: #dd6;
254
+    --danger-background: #ffe4e4;
255
+    --danger-border: red;
256
+    --error-background: #ffe4e4;
257
+    --error-border: red;
258
+    --hint-background: #dfd;
259
+    --hint-border: green;
260
+    --seealso-background: #ffc;
261
+    --seealso-border: #dd6;
262
+    --tip-background: #dfd;
263
+    --tip-border: green;
264
+    --warning-background: #ffe4e4;
265
+    --warning-border: red;
266
+}
267
+
268
+div.body div.admonition {
269
+    background-color: var(--admonition-background);
270
+    border: 1px solid var(--admonition-border);
271
+    border-radius: 3px;
272
+    color: var(--admonition-color);
273
+}
274
+
275
+div.body div.admonition.attention {
276
+    background-color: var(--attention-background);
277
+    border-color: var(--attention-border);
278
+}
279
+
280
+div.body div.admonition.caution {
281
+    background-color: var(--caution-background);
282
+    border-color: var(--caution-border);
283
+}
284
+
285
+div.body div.admonition.danger {
286
+    background-color: var(--danger-background);
287
+    border-color: var(--danger-border);
288
+}
289
+
290
+div.body div.admonition.error {
291
+    background-color: var(--error-background);
292
+    border-color: var(--error-border);
293
+}
294
+
295
+div.body div.admonition.hint {
296
+    background-color: var(--hint-background);
297
+    border-color: var(--hint-border);
298
+}
299
+
300
+div.body div.admonition.seealso {
301
+    background-color: var(--seealso-background);
302
+    border-color: var(--seealso-border);
303
+}
304
+
305
+div.body div.admonition.tip {
306
+    background-color: var(--tip-background);
307
+    border-color: var(--tip-border);
308
+}
309
+
310
+div.body div.admonition.warning {
311
+    background-color: var(--warning-background);
312
+    border-color: var(--warning-border);
313
+}
314
+
315
+div.body div.impl-detail {
316
+    border-radius: 3px;
317
+}
318
+
319
+div.body div.impl-detail > p {
320
+    margin: 0;
321
+}
322
+
323
+div.body a {
324
+    color: #0072aa;
325
+}
326
+
327
+div.body a:visited {
328
+    color: #6363bb;
329
+}
330
+
331
+div.body a:hover {
332
+    color: #00b0e4;
333
+}
334
+
335
+tt, code, pre {
336
+    font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace;
337
+    font-size: 96.5%;
338
+}
339
+
340
+div.body tt,
341
+div.body code {
342
+    border-radius: 3px;
343
+}
344
+
345
+div.body tt.descname,
346
+div.body code.descname {
347
+    font-size: 120%;
348
+}
349
+
350
+div.body tt.xref,
351
+div.body a tt,
352
+div.body code.xref,
353
+div.body a code {
354
+    font-weight: normal;
355
+}
356
+
357
+table.docutils {
358
+    border: 1px solid #ddd;
359
+    min-width: 20%;
360
+    border-radius: 3px;
361
+    margin-top: 10px;
362
+    margin-bottom: 10px;
363
+}
364
+
365
+table.docutils td,
366
+table.docutils th {
367
+    border: 1px solid #ddd !important;
368
+    border-radius: 3px;
369
+    padding: 0.3em 0.5em;
370
+}
371
+
372
+table p,
373
+table li {
374
+    text-align: left !important;
375
+}
376
+
377
+table.docutils th {
378
+    background-color: #eee;
379
+}
380
+
381
+table.footnote,
382
+table.footnote td {
383
+    border: 0 !important;
384
+}
385
+
386
+div.footer {
387
+    line-height: 150%;
388
+    text-align: right;
389
+    width: auto;
390
+    margin-right: 10px;
391
+}
392
+
393
+div.footer a {
394
+    text-underline-offset: auto;
395
+}
396
+
397
+div.footer a:hover {
398
+    color: #0095c4;
399
+}
400
+
401
+/* C API return value annotations */
402
+:root {
403
+    --refcount: var(--good-color);
404
+    --refcount-return-borrowed-ref: var(--middle-color);
405
+}
406
+
407
+.refcount {
408
+    color: var(--refcount);
409
+}
410
+
411
+.refcount.return_borrowed_ref {
412
+    color: var(--refcount-return-borrowed-ref)
413
+}
414
+
415
+.stableabi {
416
+    color: #229;
417
+}
418
+
419
+dl > dt span ~ em,
420
+.sig {
421
+    font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace;
422
+}
423
+
424
+.toctree-wrapper ul {
425
+    padding-left: 20px;
426
+}
427
+
428
+.theme-selector {
429
+    margin-left: .5em;
430
+}
431
+
432
+div.genindex-jumpbox,
433
+div.genindex-jumpbox > p {
434
+    display: inline-flex;
435
+    flex-wrap: wrap;
436
+}
437
+
438
+div.genindex-jumpbox a {
439
+    margin: 0 5px;
440
+    min-width: 30px;
441
+    text-align: center;
442
+}
443
+
444
+.copybutton {
445
+    cursor: pointer;
446
+    position: absolute;
447
+    top: 0;
448
+    right: 0;
449
+    font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace;
450
+    padding-left: 0.2em;
451
+    padding-right: 0.2em;
452
+    border-radius: 0 3px 0 0;
453
+    color: #ac9; /* follows div.body pre */
454
+    border-color: #ac9; /* follows div.body pre */
455
+    border-style: solid; /* follows div.body pre */
456
+    border-width: 1px; /* follows div.body pre */
457
+}
458
+
459
+.copybutton[data-hidden='true'] {
460
+    text-decoration: line-through;
461
+}
462
+
463
+@media (max-width: 1023px) {
464
+    /* Body layout */
465
+    div.body {
466
+        min-width: 100%;
467
+        padding: 0;
468
+        font-size: 0.875rem;
469
+    }
470
+    div.bodywrapper {
471
+        margin: 0;
472
+    }
473
+    /* Typography */
474
+    div.body h1 {
475
+        font-size: 1.625rem;
476
+    }
477
+    div.body h2 {
478
+        font-size: 1.25rem;
479
+    }
480
+    div.body h3, div.body h4, div.body h5 {
481
+        font-size: 1rem;
482
+    }
483
+    /* Override default styles to make more readable */
484
+    div.body ul {
485
+        padding-inline-start: 1rem;
486
+    }
487
+    div.body blockquote {
488
+        margin-inline-start: 1rem;
489
+        margin-inline-end: 0;
490
+    }
491
+    /* Remove sidebar and top related bar */
492
+    div.related, .sphinxsidebar {
493
+        display: none;
494
+    }
495
+    /* Anchorlinks are not hidden by fixed-positioned navbar when scrolled to */
496
+    html {
497
+        scroll-padding-top: 40px;
498
+    }
499
+    body {
500
+        margin-top: 40px;
501
+    }
502
+
503
+    /* Top navigation bar */
504
+    .mobile-nav {
505
+        display: block;
506
+        height: 40px;
507
+        width: 100%;
508
+        position: fixed;
509
+        top: 0;
510
+        left: 0;
511
+        box-shadow: rgba(0, 0, 0, 0.25) 0 0 2px 0;
512
+        z-index: 1;
513
+    }
514
+    .mobile-nav * {
515
+        box-sizing: border-box;
516
+    }
517
+    .nav-content {
518
+        position: absolute;
519
+        z-index: 1;
520
+        height: 40px;
521
+        width: 100%;
522
+        display: flex;
523
+        background-color: white;
524
+    }
525
+    .nav-items-wrapper {
526
+        display: flex;
527
+        flex: auto;
528
+        padding: .25rem;
529
+        align-items: stretch;
530
+    }
531
+    .nav-logo {
532
+        margin-right: 1rem;
533
+        flex-shrink: 0;
534
+        align-self: center;
535
+    }
536
+    .nav-content img {
537
+        display: block;
538
+        width: 20px;
539
+    }
540
+    .version_switcher_placeholder {
541
+        margin-right: 1rem;
542
+    }
543
+    .version_switcher_placeholder > select {
544
+        height: 100%;
545
+    }
546
+    .nav-content .search {
547
+        display: flex;
548
+        flex: auto;
549
+        border: 1px solid #a9a9a9;
550
+        align-items: stretch;
551
+    }
552
+    .nav-content .search input[type=search] {
553
+        border: 0;
554
+        padding-left: 24px;
555
+        width: 100%;
556
+        flex: 1;
557
+    }
558
+    .nav-content .search input[type=submit] {
559
+        height: 100%;
560
+        box-shadow: none;
561
+        border: 0;
562
+        border-left: 1px solid #a9a9a9;
563
+        cursor: pointer;
564
+        margin-right: 0;
565
+    }
566
+    .nav-content .search svg {
567
+        position: absolute;
568
+        align-self: center;
569
+        padding-left: 4px;
570
+    }
571
+    .toggler__input {
572
+        display: none;
573
+    }
574
+    .toggler__label {
575
+        width: 40px;
576
+        cursor: pointer;
577
+        display: flex;
578
+        align-items: center;
579
+        justify-content: center;
580
+        padding: 8px;
581
+        flex-shrink: 0;
582
+    }
583
+    .toggler__label:hover, .toggler__label:focus {
584
+        background-color: rgba(127 127 127 / 50%);
585
+    }
586
+    .toggler__label > span {
587
+        position: relative;
588
+        flex: none;
589
+        height: 2px;
590
+        width: 100%;
591
+        background: currentColor;
592
+        transition: all 400ms ease;
593
+    }
594
+    .toggler__label > span::before,
595
+    .toggler__label > span::after {
596
+        content: '';
597
+        height: 2px;
598
+        width: 100%;
599
+        background: inherit;
600
+        position: absolute;
601
+        left: 0;
602
+        top: -8px;
603
+    }
604
+    .toggler__label > span::after {
605
+        top: 8px;
606
+    }
607
+    .toggler__input:checked ~ nav > .toggler__label span {
608
+        transform: rotate(135deg);
609
+    }
610
+    .toggler__input:checked ~ nav > .toggler__label span::before {
611
+        transform: rotate(90deg);
612
+    }
613
+    .toggler__input:checked ~ nav > .toggler__label span::before,
614
+    .toggler__input:checked ~ nav > .toggler__label span::after {
615
+        top: 0;
616
+    }
617
+    .toggler__input:checked:hover ~ nav > .toggler__label span {
618
+        transform: rotate(315deg);
619
+    }
620
+    .toggler__input:checked ~ .menu-wrapper {
621
+        visibility: visible;
622
+        left: 0;
623
+    }
624
+
625
+    /* Sliding side menu */
626
+    .menu-wrapper {
627
+        display: block;
628
+        position: fixed;
629
+        top: 0;
630
+        transition: left 400ms ease;
631
+        left: -310px;
632
+        width: 300px;
633
+        height: 100%;
634
+        background-color: #eee;
635
+        color: #444444;
636
+        box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
637
+        overflow-y: auto;
638
+    }
639
+    .menu-wrapper.open {
640
+        visibility: visible;
641
+        left: 0;
642
+    }
643
+    .menu {
644
+        padding: 40px 10px 30px 20px;
645
+    }
646
+    .menu-wrapper h3,
647
+    .menu-wrapper h4 {
648
+        margin-bottom: 0;
649
+        font-weight: normal;
650
+    }
651
+    .menu-wrapper h4 {
652
+        font-size: 1.3em;
653
+    }
654
+    .menu-wrapper h3 {
655
+        font-size: 1.4em;
656
+    }
657
+    .menu-wrapper h3 + p,
658
+    .menu-wrapper h4 + p {
659
+        margin-top: 0.5rem;
660
+    }
661
+    .menu a {
662
+        font-size: smaller;
663
+        text-decoration: none;
664
+    }
665
+    .menu ul {
666
+        list-style: none;
667
+        line-height: 1.4;
668
+        overflow-wrap: break-word;
669
+        padding-left: 0;
670
+    }
671
+    .menu ul ul {
672
+        margin-left: 20px;
673
+        list-style: square;
674
+    }
675
+    .menu ul li {
676
+        margin-bottom: 0.5rem;
677
+    }
678
+    .language_switcher_placeholder {
679
+        margin-top: 2rem;
680
+    }
681
+    .language_switcher_placeholder select {
682
+        width: 100%;
683
+    }
684
+    .document {
685
+        position: relative;
686
+        z-index: 0;
687
+    }
688
+    /*Responsive tables*/
689
+    .responsive-table__container {
690
+        width: 100%;
691
+        overflow-x: auto;
692
+    }
693
+
694
+    .menu .theme-selector-label {
695
+        margin-top: .5em;
696
+        display: flex;
697
+        width: 100%;
698
+    }
699
+
700
+    .menu .theme-selector {
701
+        flex: auto;
702
+    }
703
+}
704
+
705
+@media (min-width: 1024px) {
706
+    div.footer {
707
+        margin-top: -2em;
708
+    }
709
+}
710
+
711
+/* Version change directives */
712
+:root {
713
+    --versionadded: var(--good-color);
714
+    --versionchanged: var(--middle-color);
715
+    --deprecated: var(--bad-color);
716
+
717
+    --versionadded-border: var(--good-border);
718
+    --versionchanged-border: var(--middle-border);
719
+    --deprecated-border: var(--bad-border);
720
+}
721
+
722
+div.versionadded,
723
+div.versionchanged,
724
+div.deprecated,
725
+div.deprecated-removed {
726
+    border-left: 3px solid;
727
+    padding: 0 1rem;
728
+}
729
+
730
+div.versionadded {
731
+    border-left-color: var(--versionadded-border);
732
+}
733
+
734
+div.versionchanged {
735
+    border-left-color: var(--versionchanged-border);
736
+}
737
+
738
+div.deprecated,
739
+div.deprecated-removed,
740
+div.versionremoved {
741
+    border-left-color: var(--deprecated-border);
742
+}
743
+
744
+div.versionadded .versionmodified {
745
+    color: var(--versionadded);
746
+}
747
+
748
+div.versionchanged .versionmodified {
749
+    color: var(--versionchanged);
750
+}
751
+
752
+div.deprecated .versionmodified,
753
+div.deprecated-removed .versionmodified,
754
+div.versionremoved .versionmodified {
755
+    color: var(--deprecated);
756
+}

+ 178
- 0
_docs_/_static/pydoctheme_dark.css View File

1
+/* Common colours */
2
+:root {
3
+    --good-color: rgb(79 196 100);
4
+    --good-border: var(--good-color);
5
+    --middle-color: rgb(244, 227, 76);
6
+    --middle-border: var(--middle-color);
7
+    --bad-color: rgb(244, 76, 78);
8
+    --bad-border: var(--bad-color);
9
+}
10
+
11
+
12
+/* Browser elements */
13
+:root {
14
+    scrollbar-color: #616161 transparent;
15
+    color-scheme: dark;
16
+}
17
+
18
+html,
19
+body {
20
+    background-color: #222;
21
+    color: rgba(255, 255, 255, 0.87);
22
+}
23
+
24
+div.related {
25
+    color: rgba(255, 255, 255, 0.7); /* classic overwrite */
26
+    border-color: #424242;
27
+}
28
+
29
+/* SIDEBAR */
30
+div.sphinxsidebar, .menu-wrapper {
31
+    background-color: #333;
32
+    color: inherit;
33
+}
34
+
35
+#sidebarbutton {
36
+    /* important to overwrite style attribute */
37
+    background-color: #555 !important;
38
+    color: inherit !important;
39
+}
40
+
41
+div.sidebar, aside.sidebar {
42
+    background-color: #424242;
43
+    border-color: #616161;
44
+}
45
+
46
+/* ANCHORS AND HIGHLIGHTS */
47
+div.body a {
48
+    color: #7af;
49
+}
50
+
51
+div.body a:visited {
52
+    color: #09e;
53
+}
54
+
55
+a.headerlink:hover {
56
+    background-color: #424242;
57
+}
58
+
59
+div.related a {
60
+    color: currentColor;
61
+}
62
+
63
+div.footer,
64
+div.footer a {
65
+    color: currentColor; /* classic overwrites */
66
+}
67
+
68
+dt:target,
69
+span.highlighted {
70
+    background-color: #616161;
71
+}
72
+
73
+.footnote:target {
74
+    background-color: #2c3e50;
75
+}
76
+
77
+/* Below for most things in text */
78
+
79
+dl.field-list > dt {
80
+    background-color: #434;
81
+}
82
+
83
+table.docutils td,
84
+table.docutils th {
85
+    border-color: #616161 !important;
86
+}
87
+
88
+table.docutils th {
89
+    background-color: #424242;
90
+}
91
+
92
+.stableabi {
93
+    color: #bbf;
94
+}
95
+
96
+div.body pre {
97
+    border-color: #616161;
98
+}
99
+
100
+code {
101
+    background-color: #424242;
102
+}
103
+
104
+div.body div.seealso {
105
+    background-color: rgba(255, 255, 0, 0.1);
106
+}
107
+
108
+div.warning {
109
+    background-color: rgba(255, 0, 0, 0.2);
110
+}
111
+
112
+.warning code {
113
+    background-color: rgba(255, 0, 0, 0.5);
114
+}
115
+
116
+/* Admonitions */
117
+:root {
118
+    --admonition-background: #ffffff1a;
119
+    --admonition-border: currentColor;
120
+    --admonition-color: #ffffffde;
121
+    --attention-background: #ffffff1a;
122
+    --attention-border: currentColor;
123
+    --caution-background: #ffff001a;
124
+    --caution-border: #dd6;
125
+    --danger-background: #f003;
126
+    --danger-border: #f66;
127
+    --error-background: #f003;
128
+    --error-border: #f66;
129
+    --hint-background: #0044117a;
130
+    --hint-border: green;
131
+    --seealso-background: #ffff001a;
132
+    --seealso-border: #dd6;
133
+    --tip-background: #0044117a;
134
+    --tip-border: green;
135
+    --warning-background: #ff000033;
136
+    --warning-border: #ff6666;
137
+}
138
+
139
+aside.topic,
140
+div.topic,
141
+div.note,
142
+nav.contents {
143
+    background-color: rgba(255, 255, 255, 0.1);
144
+    border-color: currentColor;
145
+}
146
+
147
+.note code {
148
+    background-color: rgba(255, 255, 255, 0.1);
149
+}
150
+
151
+.mobile-nav {
152
+    box-shadow: rgba(255, 255, 255, 0.25) 0 0 2px 0;
153
+}
154
+
155
+.nav-content {
156
+    background-color: black;
157
+}
158
+
159
+img.invert-in-dark-mode {
160
+    filter: invert(1) hue-rotate(.5turn);
161
+}
162
+
163
+/* -- object description styles --------------------------------------------- */
164
+
165
+/* C++ specific styling */
166
+
167
+/* Override Sphinx's basic.css to fix colour contrast */
168
+.sig.c   .k, .sig.c   .kt,
169
+.sig.cpp .k, .sig.cpp .kt {
170
+    color: #5283ff;
171
+}
172
+
173
+/* Version change directives */
174
+:root {
175
+    --versionadded: var(--good-color);
176
+    --versionchanged: var(--middle-color);
177
+    --deprecated: var(--bad-color);
178
+}

+ 24
- 18
_docs_/_static/pygments.css View File

1
+pre { line-height: 125%; }
2
+td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
3
+span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
4
+td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
5
+span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
1
 .highlight .hll { background-color: #ffffcc }
6
 .highlight .hll { background-color: #ffffcc }
2
-.highlight  { background: #f8f8f8; }
3
-.highlight .c { color: #408080; font-style: italic } /* Comment */
7
+.highlight { background: #f8f8f8; }
8
+.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */
4
 .highlight .err { border: 1px solid #FF0000 } /* Error */
9
 .highlight .err { border: 1px solid #FF0000 } /* Error */
5
 .highlight .k { color: #008000; font-weight: bold } /* Keyword */
10
 .highlight .k { color: #008000; font-weight: bold } /* Keyword */
6
 .highlight .o { color: #666666 } /* Operator */
11
 .highlight .o { color: #666666 } /* Operator */
7
-.highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
8
-.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
9
-.highlight .cp { color: #BC7A00 } /* Comment.Preproc */
10
-.highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
11
-.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
12
-.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
12
+.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
13
+.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
14
+.highlight .cp { color: #9C6500 } /* Comment.Preproc */
15
+.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
16
+.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
17
+.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
13
 .highlight .gd { color: #A00000 } /* Generic.Deleted */
18
 .highlight .gd { color: #A00000 } /* Generic.Deleted */
14
 .highlight .ge { font-style: italic } /* Generic.Emph */
19
 .highlight .ge { font-style: italic } /* Generic.Emph */
15
-.highlight .gr { color: #FF0000 } /* Generic.Error */
20
+.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
21
+.highlight .gr { color: #E40000 } /* Generic.Error */
16
 .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
22
 .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
17
-.highlight .gi { color: #00A000 } /* Generic.Inserted */
18
-.highlight .go { color: #888888 } /* Generic.Output */
23
+.highlight .gi { color: #008400 } /* Generic.Inserted */
24
+.highlight .go { color: #717171 } /* Generic.Output */
19
 .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
25
 .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
20
 .highlight .gs { font-weight: bold } /* Generic.Strong */
26
 .highlight .gs { font-weight: bold } /* Generic.Strong */
21
 .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
27
 .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
28
 .highlight .kt { color: #B00040 } /* Keyword.Type */
34
 .highlight .kt { color: #B00040 } /* Keyword.Type */
29
 .highlight .m { color: #666666 } /* Literal.Number */
35
 .highlight .m { color: #666666 } /* Literal.Number */
30
 .highlight .s { color: #BA2121 } /* Literal.String */
36
 .highlight .s { color: #BA2121 } /* Literal.String */
31
-.highlight .na { color: #7D9029 } /* Name.Attribute */
37
+.highlight .na { color: #687822 } /* Name.Attribute */
32
 .highlight .nb { color: #008000 } /* Name.Builtin */
38
 .highlight .nb { color: #008000 } /* Name.Builtin */
33
 .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
39
 .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
34
 .highlight .no { color: #880000 } /* Name.Constant */
40
 .highlight .no { color: #880000 } /* Name.Constant */
35
 .highlight .nd { color: #AA22FF } /* Name.Decorator */
41
 .highlight .nd { color: #AA22FF } /* Name.Decorator */
36
-.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
37
-.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
42
+.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */
43
+.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
38
 .highlight .nf { color: #0000FF } /* Name.Function */
44
 .highlight .nf { color: #0000FF } /* Name.Function */
39
-.highlight .nl { color: #A0A000 } /* Name.Label */
45
+.highlight .nl { color: #767600 } /* Name.Label */
40
 .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
46
 .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
41
 .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
47
 .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
42
 .highlight .nv { color: #19177C } /* Name.Variable */
48
 .highlight .nv { color: #19177C } /* Name.Variable */
53
 .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
59
 .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
54
 .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
60
 .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
55
 .highlight .s2 { color: #BA2121 } /* Literal.String.Double */
61
 .highlight .s2 { color: #BA2121 } /* Literal.String.Double */
56
-.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
62
+.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
57
 .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
63
 .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
58
-.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
64
+.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
59
 .highlight .sx { color: #008000 } /* Literal.String.Other */
65
 .highlight .sx { color: #008000 } /* Literal.String.Other */
60
-.highlight .sr { color: #BB6688 } /* Literal.String.Regex */
66
+.highlight .sr { color: #A45A77 } /* Literal.String.Regex */
61
 .highlight .s1 { color: #BA2121 } /* Literal.String.Single */
67
 .highlight .s1 { color: #BA2121 } /* Literal.String.Single */
62
 .highlight .ss { color: #19177C } /* Literal.String.Symbol */
68
 .highlight .ss { color: #19177C } /* Literal.String.Symbol */
63
 .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
69
 .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */

+ 85
- 0
_docs_/_static/pygments_dark.css View File

1
+pre { line-height: 125%; }
2
+td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
3
+span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
4
+td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
5
+span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
6
+.highlight .hll { background-color: #49483e }
7
+.highlight { background: #272822; color: #f8f8f2 }
8
+.highlight .c { color: #959077 } /* Comment */
9
+.highlight .err { color: #ed007e; background-color: #1e0010 } /* Error */
10
+.highlight .esc { color: #f8f8f2 } /* Escape */
11
+.highlight .g { color: #f8f8f2 } /* Generic */
12
+.highlight .k { color: #66d9ef } /* Keyword */
13
+.highlight .l { color: #ae81ff } /* Literal */
14
+.highlight .n { color: #f8f8f2 } /* Name */
15
+.highlight .o { color: #ff4689 } /* Operator */
16
+.highlight .x { color: #f8f8f2 } /* Other */
17
+.highlight .p { color: #f8f8f2 } /* Punctuation */
18
+.highlight .ch { color: #959077 } /* Comment.Hashbang */
19
+.highlight .cm { color: #959077 } /* Comment.Multiline */
20
+.highlight .cp { color: #959077 } /* Comment.Preproc */
21
+.highlight .cpf { color: #959077 } /* Comment.PreprocFile */
22
+.highlight .c1 { color: #959077 } /* Comment.Single */
23
+.highlight .cs { color: #959077 } /* Comment.Special */
24
+.highlight .gd { color: #ff4689 } /* Generic.Deleted */
25
+.highlight .ge { color: #f8f8f2; font-style: italic } /* Generic.Emph */
26
+.highlight .ges { color: #f8f8f2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
27
+.highlight .gr { color: #f8f8f2 } /* Generic.Error */
28
+.highlight .gh { color: #f8f8f2 } /* Generic.Heading */
29
+.highlight .gi { color: #a6e22e } /* Generic.Inserted */
30
+.highlight .go { color: #66d9ef } /* Generic.Output */
31
+.highlight .gp { color: #ff4689; font-weight: bold } /* Generic.Prompt */
32
+.highlight .gs { color: #f8f8f2; font-weight: bold } /* Generic.Strong */
33
+.highlight .gu { color: #959077 } /* Generic.Subheading */
34
+.highlight .gt { color: #f8f8f2 } /* Generic.Traceback */
35
+.highlight .kc { color: #66d9ef } /* Keyword.Constant */
36
+.highlight .kd { color: #66d9ef } /* Keyword.Declaration */
37
+.highlight .kn { color: #ff4689 } /* Keyword.Namespace */
38
+.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */
39
+.highlight .kr { color: #66d9ef } /* Keyword.Reserved */
40
+.highlight .kt { color: #66d9ef } /* Keyword.Type */
41
+.highlight .ld { color: #e6db74 } /* Literal.Date */
42
+.highlight .m { color: #ae81ff } /* Literal.Number */
43
+.highlight .s { color: #e6db74 } /* Literal.String */
44
+.highlight .na { color: #a6e22e } /* Name.Attribute */
45
+.highlight .nb { color: #f8f8f2 } /* Name.Builtin */
46
+.highlight .nc { color: #a6e22e } /* Name.Class */
47
+.highlight .no { color: #66d9ef } /* Name.Constant */
48
+.highlight .nd { color: #a6e22e } /* Name.Decorator */
49
+.highlight .ni { color: #f8f8f2 } /* Name.Entity */
50
+.highlight .ne { color: #a6e22e } /* Name.Exception */
51
+.highlight .nf { color: #a6e22e } /* Name.Function */
52
+.highlight .nl { color: #f8f8f2 } /* Name.Label */
53
+.highlight .nn { color: #f8f8f2 } /* Name.Namespace */
54
+.highlight .nx { color: #a6e22e } /* Name.Other */
55
+.highlight .py { color: #f8f8f2 } /* Name.Property */
56
+.highlight .nt { color: #ff4689 } /* Name.Tag */
57
+.highlight .nv { color: #f8f8f2 } /* Name.Variable */
58
+.highlight .ow { color: #ff4689 } /* Operator.Word */
59
+.highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */
60
+.highlight .w { color: #f8f8f2 } /* Text.Whitespace */
61
+.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */
62
+.highlight .mf { color: #ae81ff } /* Literal.Number.Float */
63
+.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */
64
+.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */
65
+.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */
66
+.highlight .sa { color: #e6db74 } /* Literal.String.Affix */
67
+.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */
68
+.highlight .sc { color: #e6db74 } /* Literal.String.Char */
69
+.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */
70
+.highlight .sd { color: #e6db74 } /* Literal.String.Doc */
71
+.highlight .s2 { color: #e6db74 } /* Literal.String.Double */
72
+.highlight .se { color: #ae81ff } /* Literal.String.Escape */
73
+.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */
74
+.highlight .si { color: #e6db74 } /* Literal.String.Interpol */
75
+.highlight .sx { color: #e6db74 } /* Literal.String.Other */
76
+.highlight .sr { color: #e6db74 } /* Literal.String.Regex */
77
+.highlight .s1 { color: #e6db74 } /* Literal.String.Single */
78
+.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */
79
+.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
80
+.highlight .fm { color: #a6e22e } /* Name.Function.Magic */
81
+.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */
82
+.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */
83
+.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */
84
+.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */
85
+.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */

+ 21
- 0
_docs_/_static/search-focus.js View File

1
+function isInputFocused() {
2
+  const activeElement = document.activeElement;
3
+  return (
4
+    activeElement.tagName === 'INPUT' ||
5
+    activeElement.tagName === 'TEXTAREA' ||
6
+    activeElement.isContentEditable
7
+  );
8
+}
9
+
10
+document.addEventListener('keydown', function(event) {
11
+  if (event.key === '/') {
12
+    if (!isInputFocused()) {
13
+      // Prevent "/" from being entered in the search box
14
+      event.preventDefault();
15
+
16
+      // Set the focus on the search box
17
+      const searchBox = document.getElementById('search-box');
18
+      searchBox.focus();
19
+    }
20
+  }
21
+});

+ 498
- 359
_docs_/_static/searchtools.js View File

4
  *
4
  *
5
  * Sphinx JavaScript utilities for the full-text search.
5
  * Sphinx JavaScript utilities for the full-text search.
6
  *
6
  *
7
- * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
7
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
8
  * :license: BSD, see LICENSE for details.
8
  * :license: BSD, see LICENSE for details.
9
  *
9
  *
10
  */
10
  */
11
+"use strict";
11
 
12
 
12
-if (!Scorer) {
13
-  /**
14
-   * Simple result scoring code.
15
-   */
13
+/**
14
+ * Simple result scoring code.
15
+ */
16
+if (typeof Scorer === "undefined") {
16
   var Scorer = {
17
   var Scorer = {
17
     // Implement the following function to further tweak the score for each result
18
     // Implement the following function to further tweak the score for each result
18
-    // The function takes a result array [filename, title, anchor, descr, score]
19
+    // The function takes a result array [docname, title, anchor, descr, score, filename]
19
     // and returns the new score.
20
     // and returns the new score.
20
     /*
21
     /*
21
-    score: function(result) {
22
-      return result[4];
22
+    score: result => {
23
+      const [docname, title, anchor, descr, score, filename] = result
24
+      return score
23
     },
25
     },
24
     */
26
     */
25
 
27
 
28
     // or matches in the last dotted part of the object name
30
     // or matches in the last dotted part of the object name
29
     objPartialMatch: 6,
31
     objPartialMatch: 6,
30
     // Additive scores depending on the priority of the object
32
     // Additive scores depending on the priority of the object
31
-    objPrio: {0:  15,   // used to be importantResults
32
-              1:  5,   // used to be objectResults
33
-              2: -5},  // used to be unimportantResults
33
+    objPrio: {
34
+      0: 15, // used to be importantResults
35
+      1: 5, // used to be objectResults
36
+      2: -5, // used to be unimportantResults
37
+    },
34
     //  Used when the priority is not in the mapping.
38
     //  Used when the priority is not in the mapping.
35
     objPrioDefault: 0,
39
     objPrioDefault: 0,
36
 
40
 
37
     // query found in title
41
     // query found in title
38
     title: 15,
42
     title: 15,
43
+    partialTitle: 7,
39
     // query found in terms
44
     // query found in terms
40
-    term: 5
45
+    term: 5,
46
+    partialTerm: 2,
41
   };
47
   };
42
 }
48
 }
43
 
49
 
44
-if (!splitQuery) {
45
-  function splitQuery(query) {
46
-    return query.split(/\s+/);
50
+const _removeChildren = (element) => {
51
+  while (element && element.lastChild) element.removeChild(element.lastChild);
52
+};
53
+
54
+/**
55
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
56
+ */
57
+const _escapeRegExp = (string) =>
58
+  string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
59
+
60
+const _displayItem = (item, searchTerms, highlightTerms) => {
61
+  const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
62
+  const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
63
+  const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
64
+  const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
65
+  const contentRoot = document.documentElement.dataset.content_root;
66
+
67
+  const [docName, title, anchor, descr, score, _filename] = item;
68
+
69
+  let listItem = document.createElement("li");
70
+  let requestUrl;
71
+  let linkUrl;
72
+  if (docBuilder === "dirhtml") {
73
+    // dirhtml builder
74
+    let dirname = docName + "/";
75
+    if (dirname.match(/\/index\/$/))
76
+      dirname = dirname.substring(0, dirname.length - 6);
77
+    else if (dirname === "index/") dirname = "";
78
+    requestUrl = contentRoot + dirname;
79
+    linkUrl = requestUrl;
80
+  } else {
81
+    // normal html builders
82
+    requestUrl = contentRoot + docName + docFileSuffix;
83
+    linkUrl = docName + docLinkSuffix;
84
+  }
85
+  let linkEl = listItem.appendChild(document.createElement("a"));
86
+  linkEl.href = linkUrl + anchor;
87
+  linkEl.dataset.score = score;
88
+  linkEl.innerHTML = title;
89
+  if (descr) {
90
+    listItem.appendChild(document.createElement("span")).innerHTML =
91
+      " (" + descr + ")";
92
+    // highlight search terms in the description
93
+    if (SPHINX_HIGHLIGHT_ENABLED)  // set in sphinx_highlight.js
94
+      highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
95
+  }
96
+  else if (showSearchSummary)
97
+    fetch(requestUrl)
98
+      .then((responseData) => responseData.text())
99
+      .then((data) => {
100
+        if (data)
101
+          listItem.appendChild(
102
+            Search.makeSearchSummary(data, searchTerms, anchor)
103
+          );
104
+        // highlight search terms in the summary
105
+        if (SPHINX_HIGHLIGHT_ENABLED)  // set in sphinx_highlight.js
106
+          highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
107
+      });
108
+  Search.output.appendChild(listItem);
109
+};
110
+const _finishSearch = (resultCount) => {
111
+  Search.stopPulse();
112
+  Search.title.innerText = _("Search Results");
113
+  if (!resultCount)
114
+    Search.status.innerText = Documentation.gettext(
115
+      "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
116
+    );
117
+  else
118
+    Search.status.innerText = _(
119
+      "Search finished, found ${resultCount} page(s) matching the search query."
120
+    ).replace('${resultCount}', resultCount);
121
+};
122
+const _displayNextItem = (
123
+  results,
124
+  resultCount,
125
+  searchTerms,
126
+  highlightTerms,
127
+) => {
128
+  // results left, load the summary and display it
129
+  // this is intended to be dynamic (don't sub resultsCount)
130
+  if (results.length) {
131
+    _displayItem(results.pop(), searchTerms, highlightTerms);
132
+    setTimeout(
133
+      () => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
134
+      5
135
+    );
47
   }
136
   }
137
+  // search finished, update title and status message
138
+  else _finishSearch(resultCount);
139
+};
140
+// Helper function used by query() to order search results.
141
+// Each input is an array of [docname, title, anchor, descr, score, filename].
142
+// Order the results by score (in opposite order of appearance, since the
143
+// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
144
+const _orderResultsByScoreThenName = (a, b) => {
145
+  const leftScore = a[4];
146
+  const rightScore = b[4];
147
+  if (leftScore === rightScore) {
148
+    // same score: sort alphabetically
149
+    const leftTitle = a[1].toLowerCase();
150
+    const rightTitle = b[1].toLowerCase();
151
+    if (leftTitle === rightTitle) return 0;
152
+    return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
153
+  }
154
+  return leftScore > rightScore ? 1 : -1;
155
+};
156
+
157
+/**
158
+ * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
159
+ * custom function per language.
160
+ *
161
+ * The regular expression works by splitting the string on consecutive characters
162
+ * that are not Unicode letters, numbers, underscores, or emoji characters.
163
+ * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
164
+ */
165
+if (typeof splitQuery === "undefined") {
166
+  var splitQuery = (query) => query
167
+      .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
168
+      .filter(term => term)  // remove remaining empty strings
48
 }
169
 }
49
 
170
 
50
 /**
171
 /**
51
  * Search Module
172
  * Search Module
52
  */
173
  */
53
-var Search = {
54
-
55
-  _index : null,
56
-  _queued_query : null,
57
-  _pulse_status : -1,
58
-
59
-  init : function() {
60
-      var params = $.getQueryParameters();
61
-      if (params.q) {
62
-          var query = params.q[0];
63
-          $('input[name="q"]')[0].value = query;
64
-          this.performSearch(query);
65
-      }
174
+const Search = {
175
+  _index: null,
176
+  _queued_query: null,
177
+  _pulse_status: -1,
178
+
179
+  htmlToText: (htmlString, anchor) => {
180
+    const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
181
+    for (const removalQuery of [".headerlink", "script", "style"]) {
182
+      htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
183
+    }
184
+    if (anchor) {
185
+      const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
186
+      if (anchorContent) return anchorContent.textContent;
187
+
188
+      console.warn(
189
+        `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
190
+      );
191
+    }
192
+
193
+    // if anchor not specified or not found, fall back to main content
194
+    const docContent = htmlElement.querySelector('[role="main"]');
195
+    if (docContent) return docContent.textContent;
196
+
197
+    console.warn(
198
+      "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
199
+    );
200
+    return "";
66
   },
201
   },
67
 
202
 
68
-  loadIndex : function(url) {
69
-    $.ajax({type: "GET", url: url, data: null,
70
-            dataType: "script", cache: true,
71
-            complete: function(jqxhr, textstatus) {
72
-              if (textstatus != "success") {
73
-                document.getElementById("searchindexloader").src = url;
74
-              }
75
-            }});
203
+  init: () => {
204
+    const query = new URLSearchParams(window.location.search).get("q");
205
+    document
206
+      .querySelectorAll('input[name="q"]')
207
+      .forEach((el) => (el.value = query));
208
+    if (query) Search.performSearch(query);
76
   },
209
   },
77
 
210
 
78
-  setIndex : function(index) {
79
-    var q;
80
-    this._index = index;
81
-    if ((q = this._queued_query) !== null) {
82
-      this._queued_query = null;
83
-      Search.query(q);
211
+  loadIndex: (url) =>
212
+    (document.body.appendChild(document.createElement("script")).src = url),
213
+
214
+  setIndex: (index) => {
215
+    Search._index = index;
216
+    if (Search._queued_query !== null) {
217
+      const query = Search._queued_query;
218
+      Search._queued_query = null;
219
+      Search.query(query);
84
     }
220
     }
85
   },
221
   },
86
 
222
 
87
-  hasIndex : function() {
88
-      return this._index !== null;
89
-  },
223
+  hasIndex: () => Search._index !== null,
90
 
224
 
91
-  deferQuery : function(query) {
92
-      this._queued_query = query;
93
-  },
225
+  deferQuery: (query) => (Search._queued_query = query),
94
 
226
 
95
-  stopPulse : function() {
96
-      this._pulse_status = 0;
97
-  },
227
+  stopPulse: () => (Search._pulse_status = -1),
98
 
228
 
99
-  startPulse : function() {
100
-    if (this._pulse_status >= 0)
101
-        return;
102
-    function pulse() {
103
-      var i;
229
+  startPulse: () => {
230
+    if (Search._pulse_status >= 0) return;
231
+
232
+    const pulse = () => {
104
       Search._pulse_status = (Search._pulse_status + 1) % 4;
233
       Search._pulse_status = (Search._pulse_status + 1) % 4;
105
-      var dotString = '';
106
-      for (i = 0; i < Search._pulse_status; i++)
107
-        dotString += '.';
108
-      Search.dots.text(dotString);
109
-      if (Search._pulse_status > -1)
110
-        window.setTimeout(pulse, 500);
111
-    }
234
+      Search.dots.innerText = ".".repeat(Search._pulse_status);
235
+      if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
236
+    };
112
     pulse();
237
     pulse();
113
   },
238
   },
114
 
239
 
115
   /**
240
   /**
116
    * perform a search for something (or wait until index is loaded)
241
    * perform a search for something (or wait until index is loaded)
117
    */
242
    */
118
-  performSearch : function(query) {
243
+  performSearch: (query) => {
119
     // create the required interface elements
244
     // create the required interface elements
120
-    this.out = $('#search-results');
121
-    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
122
-    this.dots = $('<span></span>').appendTo(this.title);
123
-    this.status = $('<p style="display: none"></p>').appendTo(this.out);
124
-    this.output = $('<ul class="search"/>').appendTo(this.out);
125
-
126
-    $('#search-progress').text(_('Preparing search...'));
127
-    this.startPulse();
245
+    const searchText = document.createElement("h2");
246
+    searchText.textContent = _("Searching");
247
+    const searchSummary = document.createElement("p");
248
+    searchSummary.classList.add("search-summary");
249
+    searchSummary.innerText = "";
250
+    const searchList = document.createElement("ul");
251
+    searchList.classList.add("search");
252
+
253
+    const out = document.getElementById("search-results");
254
+    Search.title = out.appendChild(searchText);
255
+    Search.dots = Search.title.appendChild(document.createElement("span"));
256
+    Search.status = out.appendChild(searchSummary);
257
+    Search.output = out.appendChild(searchList);
258
+
259
+    const searchProgress = document.getElementById("search-progress");
260
+    // Some themes don't use the search progress node
261
+    if (searchProgress) {
262
+      searchProgress.innerText = _("Preparing search...");
263
+    }
264
+    Search.startPulse();
128
 
265
 
129
     // index already loaded, the browser was quick!
266
     // index already loaded, the browser was quick!
130
-    if (this.hasIndex())
131
-      this.query(query);
132
-    else
133
-      this.deferQuery(query);
267
+    if (Search.hasIndex()) Search.query(query);
268
+    else Search.deferQuery(query);
134
   },
269
   },
135
 
270
 
136
-  /**
137
-   * execute search (requires search index to be loaded)
138
-   */
139
-  query : function(query) {
140
-    var i;
141
-
142
-    // stem the searchterms and add them to the correct list
143
-    var stemmer = new Stemmer();
144
-    var searchterms = [];
145
-    var excluded = [];
146
-    var hlterms = [];
147
-    var tmp = splitQuery(query);
148
-    var objectterms = [];
149
-    for (i = 0; i < tmp.length; i++) {
150
-      if (tmp[i] !== "") {
151
-          objectterms.push(tmp[i].toLowerCase());
152
-      }
271
+  _parseQuery: (query) => {
272
+    // stem the search terms and add them to the correct list
273
+    const stemmer = new Stemmer();
274
+    const searchTerms = new Set();
275
+    const excludedTerms = new Set();
276
+    const highlightTerms = new Set();
277
+    const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
278
+    splitQuery(query.trim()).forEach((queryTerm) => {
279
+      const queryTermLower = queryTerm.toLowerCase();
280
+
281
+      // maybe skip this "word"
282
+      // stopwords array is from language_data.js
283
+      if (
284
+        stopwords.indexOf(queryTermLower) !== -1 ||
285
+        queryTerm.match(/^\d+$/)
286
+      )
287
+        return;
153
 
288
 
154
-      if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
155
-          tmp[i] === "") {
156
-        // skip this "word"
157
-        continue;
158
-      }
159
       // stem the word
289
       // stem the word
160
-      var word = stemmer.stemWord(tmp[i].toLowerCase());
161
-      // prevent stemmer from cutting word smaller than two chars
162
-      if(word.length < 3 && tmp[i].length >= 3) {
163
-        word = tmp[i];
164
-      }
165
-      var toAppend;
290
+      let word = stemmer.stemWord(queryTermLower);
166
       // select the correct list
291
       // select the correct list
167
-      if (word[0] == '-') {
168
-        toAppend = excluded;
169
-        word = word.substr(1);
170
-      }
292
+      if (word[0] === "-") excludedTerms.add(word.substr(1));
171
       else {
293
       else {
172
-        toAppend = searchterms;
173
-        hlterms.push(tmp[i].toLowerCase());
294
+        searchTerms.add(word);
295
+        highlightTerms.add(queryTermLower);
174
       }
296
       }
175
-      // only add if not already in the list
176
-      if (!$u.contains(toAppend, word))
177
-        toAppend.push(word);
297
+    });
298
+
299
+    if (SPHINX_HIGHLIGHT_ENABLED) {  // set in sphinx_highlight.js
300
+      localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
178
     }
301
     }
179
-    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
180
 
302
 
181
-    // console.debug('SEARCH: searching for:');
182
-    // console.info('required: ', searchterms);
183
-    // console.info('excluded: ', excluded);
303
+    // console.debug("SEARCH: searching for:");
304
+    // console.info("required: ", [...searchTerms]);
305
+    // console.info("excluded: ", [...excludedTerms]);
184
 
306
 
185
-    // prepare search
186
-    var terms = this._index.terms;
187
-    var titleterms = this._index.titleterms;
307
+    return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
308
+  },
188
 
309
 
189
-    // array of [filename, title, anchor, descr, score]
190
-    var results = [];
191
-    $('#search-progress').empty();
310
+  /**
311
+   * execute search (requires search index to be loaded)
312
+   */
313
+  _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
314
+    const filenames = Search._index.filenames;
315
+    const docNames = Search._index.docnames;
316
+    const titles = Search._index.titles;
317
+    const allTitles = Search._index.alltitles;
318
+    const indexEntries = Search._index.indexentries;
319
+
320
+    // Collect multiple result groups to be sorted separately and then ordered.
321
+    // Each is an array of [docname, title, anchor, descr, score, filename].
322
+    const normalResults = [];
323
+    const nonMainIndexResults = [];
324
+
325
+    _removeChildren(document.getElementById("search-progress"));
326
+
327
+    const queryLower = query.toLowerCase().trim();
328
+    for (const [title, foundTitles] of Object.entries(allTitles)) {
329
+      if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
330
+        for (const [file, id] of foundTitles) {
331
+          const score = Math.round(Scorer.title * queryLower.length / title.length);
332
+          const boost = titles[file] === title ? 1 : 0;  // add a boost for document titles
333
+          normalResults.push([
334
+            docNames[file],
335
+            titles[file] !== title ? `${titles[file]} > ${title}` : title,
336
+            id !== null ? "#" + id : "",
337
+            null,
338
+            score + boost,
339
+            filenames[file],
340
+          ]);
341
+        }
342
+      }
343
+    }
192
 
344
 
193
-    // lookup as object
194
-    for (i = 0; i < objectterms.length; i++) {
195
-      var others = [].concat(objectterms.slice(0, i),
196
-                             objectterms.slice(i+1, objectterms.length));
197
-      results = results.concat(this.performObjectSearch(objectterms[i], others));
345
+    // search for explicit entries in index directives
346
+    for (const [entry, foundEntries] of Object.entries(indexEntries)) {
347
+      if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
348
+        for (const [file, id, isMain] of foundEntries) {
349
+          const score = Math.round(100 * queryLower.length / entry.length);
350
+          const result = [
351
+            docNames[file],
352
+            titles[file],
353
+            id ? "#" + id : "",
354
+            null,
355
+            score,
356
+            filenames[file],
357
+          ];
358
+          if (isMain) {
359
+            normalResults.push(result);
360
+          } else {
361
+            nonMainIndexResults.push(result);
362
+          }
363
+        }
364
+      }
198
     }
365
     }
199
 
366
 
367
+    // lookup as object
368
+    objectTerms.forEach((term) =>
369
+      normalResults.push(...Search.performObjectSearch(term, objectTerms))
370
+    );
371
+
200
     // lookup as search terms in fulltext
372
     // lookup as search terms in fulltext
201
-    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
373
+    normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
202
 
374
 
203
     // let the scorer override scores with a custom scoring function
375
     // let the scorer override scores with a custom scoring function
204
     if (Scorer.score) {
376
     if (Scorer.score) {
205
-      for (i = 0; i < results.length; i++)
206
-        results[i][4] = Scorer.score(results[i]);
377
+      normalResults.forEach((item) => (item[4] = Scorer.score(item)));
378
+      nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
207
     }
379
     }
208
 
380
 
209
-    // now sort the results by score (in opposite order of appearance, since the
210
-    // display function below uses pop() to retrieve items) and then
211
-    // alphabetically
212
-    results.sort(function(a, b) {
213
-      var left = a[4];
214
-      var right = b[4];
215
-      if (left > right) {
216
-        return 1;
217
-      } else if (left < right) {
218
-        return -1;
219
-      } else {
220
-        // same score: sort alphabetically
221
-        left = a[1].toLowerCase();
222
-        right = b[1].toLowerCase();
223
-        return (left > right) ? -1 : ((left < right) ? 1 : 0);
381
+    // Sort each group of results by score and then alphabetically by name.
382
+    normalResults.sort(_orderResultsByScoreThenName);
383
+    nonMainIndexResults.sort(_orderResultsByScoreThenName);
384
+
385
+    // Combine the result groups in (reverse) order.
386
+    // Non-main index entries are typically arbitrary cross-references,
387
+    // so display them after other results.
388
+    let results = [...nonMainIndexResults, ...normalResults];
389
+
390
+    // remove duplicate search results
391
+    // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
392
+    let seen = new Set();
393
+    results = results.reverse().reduce((acc, result) => {
394
+      let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
395
+      if (!seen.has(resultStr)) {
396
+        acc.push(result);
397
+        seen.add(resultStr);
224
       }
398
       }
225
-    });
399
+      return acc;
400
+    }, []);
401
+
402
+    return results.reverse();
403
+  },
404
+
405
+  query: (query) => {
406
+    const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
407
+    const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
226
 
408
 
227
     // for debugging
409
     // for debugging
228
     //Search.lastresults = results.slice();  // a copy
410
     //Search.lastresults = results.slice();  // a copy
229
-    //console.info('search results:', Search.lastresults);
411
+    // console.info("search results:", Search.lastresults);
230
 
412
 
231
     // print the results
413
     // print the results
232
-    var resultCount = results.length;
233
-    function displayNextItem() {
234
-      // results left, load the summary and display it
235
-      if (results.length) {
236
-        var item = results.pop();
237
-        var listItem = $('<li style="display:none"></li>');
238
-        if (DOCUMENTATION_OPTIONS.FILE_SUFFIX === '') {
239
-          // dirhtml builder
240
-          var dirname = item[0] + '/';
241
-          if (dirname.match(/\/index\/$/)) {
242
-            dirname = dirname.substring(0, dirname.length-6);
243
-          } else if (dirname == 'index/') {
244
-            dirname = '';
245
-          }
246
-          listItem.append($('<a/>').attr('href',
247
-            DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
248
-            highlightstring + item[2]).html(item[1]));
249
-        } else {
250
-          // normal html builders
251
-          listItem.append($('<a/>').attr('href',
252
-            item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
253
-            highlightstring + item[2]).html(item[1]));
254
-        }
255
-        if (item[3]) {
256
-          listItem.append($('<span> (' + item[3] + ')</span>'));
257
-          Search.output.append(listItem);
258
-          listItem.slideDown(5, function() {
259
-            displayNextItem();
260
-          });
261
-        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
262
-          var suffix = DOCUMENTATION_OPTIONS.SOURCELINK_SUFFIX;
263
-          if (suffix === undefined) {
264
-            suffix = '.txt';
265
-          }
266
-          $.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[5] + (item[5].slice(-suffix.length) === suffix ? '' : suffix),
267
-                  dataType: "text",
268
-                  complete: function(jqxhr, textstatus) {
269
-                    var data = jqxhr.responseText;
270
-                    if (data !== '' && data !== undefined) {
271
-                      listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
272
-                    }
273
-                    Search.output.append(listItem);
274
-                    listItem.slideDown(5, function() {
275
-                      displayNextItem();
276
-                    });
277
-                  }});
278
-        } else {
279
-          // no source available, just display title
280
-          Search.output.append(listItem);
281
-          listItem.slideDown(5, function() {
282
-            displayNextItem();
283
-          });
284
-        }
285
-      }
286
-      // search finished, update title and status message
287
-      else {
288
-        Search.stopPulse();
289
-        Search.title.text(_('Search Results'));
290
-        if (!resultCount)
291
-          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
292
-        else
293
-            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
294
-        Search.status.fadeIn(500);
295
-      }
296
-    }
297
-    displayNextItem();
414
+    _displayNextItem(results, results.length, searchTerms, highlightTerms);
298
   },
415
   },
299
 
416
 
300
   /**
417
   /**
301
    * search for object names
418
    * search for object names
302
    */
419
    */
303
-  performObjectSearch : function(object, otherterms) {
304
-    var filenames = this._index.filenames;
305
-    var docnames = this._index.docnames;
306
-    var objects = this._index.objects;
307
-    var objnames = this._index.objnames;
308
-    var titles = this._index.titles;
309
-
310
-    var i;
311
-    var results = [];
312
-
313
-    for (var prefix in objects) {
314
-      for (var name in objects[prefix]) {
315
-        var fullname = (prefix ? prefix + '.' : '') + name;
316
-        if (fullname.toLowerCase().indexOf(object) > -1) {
317
-          var score = 0;
318
-          var parts = fullname.split('.');
319
-          // check for different match types: exact matches of full name or
320
-          // "last name" (i.e. last dotted part)
321
-          if (fullname == object || parts[parts.length - 1] == object) {
322
-            score += Scorer.objNameMatch;
323
-          // matches in last name
324
-          } else if (parts[parts.length - 1].indexOf(object) > -1) {
325
-            score += Scorer.objPartialMatch;
326
-          }
327
-          var match = objects[prefix][name];
328
-          var objname = objnames[match[1]][2];
329
-          var title = titles[match[0]];
330
-          // If more than one term searched for, we require other words to be
331
-          // found in the name/title/description
332
-          if (otherterms.length > 0) {
333
-            var haystack = (prefix + ' ' + name + ' ' +
334
-                            objname + ' ' + title).toLowerCase();
335
-            var allfound = true;
336
-            for (i = 0; i < otherterms.length; i++) {
337
-              if (haystack.indexOf(otherterms[i]) == -1) {
338
-                allfound = false;
339
-                break;
340
-              }
341
-            }
342
-            if (!allfound) {
343
-              continue;
344
-            }
345
-          }
346
-          var descr = objname + _(', in ') + title;
347
-
348
-          var anchor = match[3];
349
-          if (anchor === '')
350
-            anchor = fullname;
351
-          else if (anchor == '-')
352
-            anchor = objnames[match[1]][1] + '-' + fullname;
353
-          // add custom score for some objects according to scorer
354
-          if (Scorer.objPrio.hasOwnProperty(match[2])) {
355
-            score += Scorer.objPrio[match[2]];
356
-          } else {
357
-            score += Scorer.objPrioDefault;
358
-          }
359
-          results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
360
-        }
420
+  performObjectSearch: (object, objectTerms) => {
421
+    const filenames = Search._index.filenames;
422
+    const docNames = Search._index.docnames;
423
+    const objects = Search._index.objects;
424
+    const objNames = Search._index.objnames;
425
+    const titles = Search._index.titles;
426
+
427
+    const results = [];
428
+
429
+    const objectSearchCallback = (prefix, match) => {
430
+      const name = match[4]
431
+      const fullname = (prefix ? prefix + "." : "") + name;
432
+      const fullnameLower = fullname.toLowerCase();
433
+      if (fullnameLower.indexOf(object) < 0) return;
434
+
435
+      let score = 0;
436
+      const parts = fullnameLower.split(".");
437
+
438
+      // check for different match types: exact matches of full name or
439
+      // "last name" (i.e. last dotted part)
440
+      if (fullnameLower === object || parts.slice(-1)[0] === object)
441
+        score += Scorer.objNameMatch;
442
+      else if (parts.slice(-1)[0].indexOf(object) > -1)
443
+        score += Scorer.objPartialMatch; // matches in last name
444
+
445
+      const objName = objNames[match[1]][2];
446
+      const title = titles[match[0]];
447
+
448
+      // If more than one term searched for, we require other words to be
449
+      // found in the name/title/description
450
+      const otherTerms = new Set(objectTerms);
451
+      otherTerms.delete(object);
452
+      if (otherTerms.size > 0) {
453
+        const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
454
+        if (
455
+          [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
456
+        )
457
+          return;
361
       }
458
       }
362
-    }
363
 
459
 
460
+      let anchor = match[3];
461
+      if (anchor === "") anchor = fullname;
462
+      else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
463
+
464
+      const descr = objName + _(", in ") + title;
465
+
466
+      // add custom score for some objects according to scorer
467
+      if (Scorer.objPrio.hasOwnProperty(match[2]))
468
+        score += Scorer.objPrio[match[2]];
469
+      else score += Scorer.objPrioDefault;
470
+
471
+      results.push([
472
+        docNames[match[0]],
473
+        fullname,
474
+        "#" + anchor,
475
+        descr,
476
+        score,
477
+        filenames[match[0]],
478
+      ]);
479
+    };
480
+    Object.keys(objects).forEach((prefix) =>
481
+      objects[prefix].forEach((array) =>
482
+        objectSearchCallback(prefix, array)
483
+      )
484
+    );
364
     return results;
485
     return results;
365
   },
486
   },
366
 
487
 
367
   /**
488
   /**
368
    * search for full-text terms in the index
489
    * search for full-text terms in the index
369
    */
490
    */
370
-  performTermsSearch : function(searchterms, excluded, terms, titleterms) {
371
-    var docnames = this._index.docnames;
372
-    var filenames = this._index.filenames;
373
-    var titles = this._index.titles;
491
+  performTermsSearch: (searchTerms, excludedTerms) => {
492
+    // prepare search
493
+    const terms = Search._index.terms;
494
+    const titleTerms = Search._index.titleterms;
495
+    const filenames = Search._index.filenames;
496
+    const docNames = Search._index.docnames;
497
+    const titles = Search._index.titles;
374
 
498
 
375
-    var i, j, file;
376
-    var fileMap = {};
377
-    var scoreMap = {};
378
-    var results = [];
499
+    const scoreMap = new Map();
500
+    const fileMap = new Map();
379
 
501
 
380
     // perform the search on the required terms
502
     // perform the search on the required terms
381
-    for (i = 0; i < searchterms.length; i++) {
382
-      var word = searchterms[i];
383
-      var files = [];
384
-      var _o = [
385
-        {files: terms[word], score: Scorer.term},
386
-        {files: titleterms[word], score: Scorer.title}
503
+    searchTerms.forEach((word) => {
504
+      const files = [];
505
+      const arr = [
506
+        { files: terms[word], score: Scorer.term },
507
+        { files: titleTerms[word], score: Scorer.title },
387
       ];
508
       ];
509
+      // add support for partial matches
510
+      if (word.length > 2) {
511
+        const escapedWord = _escapeRegExp(word);
512
+        if (!terms.hasOwnProperty(word)) {
513
+          Object.keys(terms).forEach((term) => {
514
+            if (term.match(escapedWord))
515
+              arr.push({ files: terms[term], score: Scorer.partialTerm });
516
+          });
517
+        }
518
+        if (!titleTerms.hasOwnProperty(word)) {
519
+          Object.keys(titleTerms).forEach((term) => {
520
+            if (term.match(escapedWord))
521
+              arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
522
+          });
523
+        }
524
+      }
388
 
525
 
389
       // no match but word was a required one
526
       // no match but word was a required one
390
-      if ($u.every(_o, function(o){return o.files === undefined;})) {
391
-        break;
392
-      }
527
+      if (arr.every((record) => record.files === undefined)) return;
528
+
393
       // found search word in contents
529
       // found search word in contents
394
-      $u.each(_o, function(o) {
395
-        var _files = o.files;
396
-        if (_files === undefined)
397
-          return
398
-
399
-        if (_files.length === undefined)
400
-          _files = [_files];
401
-        files = files.concat(_files);
402
-
403
-        // set score for the word in each file to Scorer.term
404
-        for (j = 0; j < _files.length; j++) {
405
-          file = _files[j];
406
-          if (!(file in scoreMap))
407
-            scoreMap[file] = {}
408
-          scoreMap[file][word] = o.score;
409
-        }
530
+      arr.forEach((record) => {
531
+        if (record.files === undefined) return;
532
+
533
+        let recordFiles = record.files;
534
+        if (recordFiles.length === undefined) recordFiles = [recordFiles];
535
+        files.push(...recordFiles);
536
+
537
+        // set score for the word in each file
538
+        recordFiles.forEach((file) => {
539
+          if (!scoreMap.has(file)) scoreMap.set(file, {});
540
+          scoreMap.get(file)[word] = record.score;
541
+        });
410
       });
542
       });
411
 
543
 
412
       // create the mapping
544
       // create the mapping
413
-      for (j = 0; j < files.length; j++) {
414
-        file = files[j];
415
-        if (file in fileMap)
416
-          fileMap[file].push(word);
417
-        else
418
-          fileMap[file] = [word];
419
-      }
420
-    }
545
+      files.forEach((file) => {
546
+        if (!fileMap.has(file)) fileMap.set(file, [word]);
547
+        else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
548
+      });
549
+    });
421
 
550
 
422
     // now check if the files don't contain excluded terms
551
     // now check if the files don't contain excluded terms
423
-    for (file in fileMap) {
424
-      var valid = true;
425
-
552
+    const results = [];
553
+    for (const [file, wordList] of fileMap) {
426
       // check if all requirements are matched
554
       // check if all requirements are matched
427
-      if (fileMap[file].length != searchterms.length)
428
-          continue;
555
+
556
+      // as search terms with length < 3 are discarded
557
+      const filteredTermCount = [...searchTerms].filter(
558
+        (term) => term.length > 2
559
+      ).length;
560
+      if (
561
+        wordList.length !== searchTerms.size &&
562
+        wordList.length !== filteredTermCount
563
+      )
564
+        continue;
429
 
565
 
430
       // ensure that none of the excluded terms is in the search result
566
       // ensure that none of the excluded terms is in the search result
431
-      for (i = 0; i < excluded.length; i++) {
432
-        if (terms[excluded[i]] == file ||
433
-            titleterms[excluded[i]] == file ||
434
-            $u.contains(terms[excluded[i]] || [], file) ||
435
-            $u.contains(titleterms[excluded[i]] || [], file)) {
436
-          valid = false;
437
-          break;
438
-        }
439
-      }
567
+      if (
568
+        [...excludedTerms].some(
569
+          (term) =>
570
+            terms[term] === file ||
571
+            titleTerms[term] === file ||
572
+            (terms[term] || []).includes(file) ||
573
+            (titleTerms[term] || []).includes(file)
574
+        )
575
+      )
576
+        break;
440
 
577
 
441
-      // if we have still a valid result we can add it to the result list
442
-      if (valid) {
443
-        // select one (max) score for the file.
444
-        // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
445
-        var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
446
-        results.push([docnames[file], titles[file], '', null, score, filenames[file]]);
447
-      }
578
+      // select one (max) score for the file.
579
+      const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
580
+      // add result to the result list
581
+      results.push([
582
+        docNames[file],
583
+        titles[file],
584
+        "",
585
+        null,
586
+        score,
587
+        filenames[file],
588
+      ]);
448
     }
589
     }
449
     return results;
590
     return results;
450
   },
591
   },
452
   /**
593
   /**
453
    * helper function to return a node containing the
594
    * helper function to return a node containing the
454
    * search summary for a given text. keywords is a list
595
    * search summary for a given text. keywords is a list
455
-   * of stemmed words, hlwords is the list of normal, unstemmed
456
-   * words. the first one is used to find the occurrence, the
457
-   * latter for highlighting it.
596
+   * of stemmed words.
458
    */
597
    */
459
-  makeSearchSummary : function(text, keywords, hlwords) {
460
-    var textLower = text.toLowerCase();
461
-    var start = 0;
462
-    $.each(keywords, function() {
463
-      var i = textLower.indexOf(this.toLowerCase());
464
-      if (i > -1)
465
-        start = i;
466
-    });
467
-    start = Math.max(start - 120, 0);
468
-    var excerpt = ((start > 0) ? '...' : '') +
469
-      $.trim(text.substr(start, 240)) +
470
-      ((start + 240 - text.length) ? '...' : '');
471
-    var rv = $('<div class="context"></div>').text(excerpt);
472
-    $.each(hlwords, function() {
473
-      rv = rv.highlightText(this, 'highlighted');
474
-    });
475
-    return rv;
476
-  }
598
+  makeSearchSummary: (htmlText, keywords, anchor) => {
599
+    const text = Search.htmlToText(htmlText, anchor);
600
+    if (text === "") return null;
601
+
602
+    const textLower = text.toLowerCase();
603
+    const actualStartPosition = [...keywords]
604
+      .map((k) => textLower.indexOf(k.toLowerCase()))
605
+      .filter((i) => i > -1)
606
+      .slice(-1)[0];
607
+    const startWithContext = Math.max(actualStartPosition - 120, 0);
608
+
609
+    const top = startWithContext === 0 ? "" : "...";
610
+    const tail = startWithContext + 240 < text.length ? "..." : "";
611
+
612
+    let summary = document.createElement("p");
613
+    summary.classList.add("context");
614
+    summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
615
+
616
+    return summary;
617
+  },
477
 };
618
 };
478
 
619
 
479
-$(document).ready(function() {
480
-  Search.init();
481
-});
620
+_ready(Search.init);

+ 81
- 0
_docs_/_static/sidebar.js View File

1
+/*
2
+ * sidebar.js
3
+ * ~~~~~~~~~~
4
+ *
5
+ * This file is functionally identical to "sidebar.js" in Sphinx 5.0.
6
+ * When support for Sphinx 4 and earlier is dropped from the theme,
7
+ * this file can be removed.
8
+ *
9
+ * This script makes the Sphinx sidebar collapsible.
10
+ *
11
+ * .sphinxsidebar contains .sphinxsidebarwrapper.  This script adds
12
+ * in .sphinxsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
13
+ * used to collapse and expand the sidebar.
14
+ *
15
+ * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
16
+ * and the width of the sidebar and the margin-left of the document
17
+ * are decreased. When the sidebar is expanded the opposite happens.
18
+ * This script saves a per-browser/per-session cookie used to
19
+ * remember the position of the sidebar among the pages.
20
+ * Once the browser is closed the cookie is deleted and the position
21
+ * reset to the default (expanded).
22
+ *
23
+ * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
24
+ * :license: BSD, see LICENSE for details.
25
+ *
26
+ */
27
+
28
+const initialiseSidebar = () => {
29
+  // global elements used by the functions.
30
+  const bodyWrapper = document.getElementsByClassName("bodywrapper")[0]
31
+  const sidebar = document.getElementsByClassName("sphinxsidebar")[0]
32
+  const sidebarWrapper = document.getElementsByClassName("sphinxsidebarwrapper")[0]
33
+
34
+  // exit early if the document has no sidebar for some reason
35
+  if (typeof sidebar === "undefined") {
36
+    return
37
+  }
38
+
39
+
40
+
41
+  const sidebarButton = document.getElementById("sidebarbutton")
42
+  const sidebarArrow = sidebarButton.querySelector('span')
43
+
44
+
45
+  const collapse_sidebar = () => {
46
+    bodyWrapper.style.marginLeft = ".8em"
47
+    sidebar.style.width = ".8em"
48
+    sidebarWrapper.style.display = "none"
49
+    sidebarArrow.innerText = "»"
50
+    sidebarButton.title = _("Expand sidebar")
51
+    window.localStorage.setItem("sidebar", "collapsed")
52
+  }
53
+
54
+  const expand_sidebar = () => {
55
+    bodyWrapper.style.marginLeft = ""
56
+    sidebar.style.removeProperty("width")
57
+    sidebarWrapper.style.display = ""
58
+    sidebarArrow.innerText = "«"
59
+    sidebarButton.title = _("Collapse sidebar")
60
+    window.localStorage.setItem("sidebar", "expanded")
61
+  }
62
+
63
+  sidebarButton.addEventListener("click", () => {
64
+    (sidebarWrapper.style.display === "none") ? expand_sidebar() : collapse_sidebar()
65
+  })
66
+
67
+  const sidebar_state = window.localStorage.getItem("sidebar")
68
+  if (sidebar_state === "collapsed") {
69
+    collapse_sidebar()
70
+  }
71
+  else if (sidebar_state === "expanded") {
72
+    expand_sidebar()
73
+  }
74
+}
75
+
76
+if (document.readyState !== "loading") {
77
+  initialiseSidebar()
78
+}
79
+else {
80
+  document.addEventListener("DOMContentLoaded", initialiseSidebar)
81
+}

+ 154
- 0
_docs_/_static/sphinx_highlight.js View File

1
+/* Highlighting utilities for Sphinx HTML documentation. */
2
+"use strict";
3
+
4
+const SPHINX_HIGHLIGHT_ENABLED = true
5
+
6
+/**
7
+ * highlight a given string on a node by wrapping it in
8
+ * span elements with the given class name.
9
+ */
10
+const _highlight = (node, addItems, text, className) => {
11
+  if (node.nodeType === Node.TEXT_NODE) {
12
+    const val = node.nodeValue;
13
+    const parent = node.parentNode;
14
+    const pos = val.toLowerCase().indexOf(text);
15
+    if (
16
+      pos >= 0 &&
17
+      !parent.classList.contains(className) &&
18
+      !parent.classList.contains("nohighlight")
19
+    ) {
20
+      let span;
21
+
22
+      const closestNode = parent.closest("body, svg, foreignObject");
23
+      const isInSVG = closestNode && closestNode.matches("svg");
24
+      if (isInSVG) {
25
+        span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
26
+      } else {
27
+        span = document.createElement("span");
28
+        span.classList.add(className);
29
+      }
30
+
31
+      span.appendChild(document.createTextNode(val.substr(pos, text.length)));
32
+      const rest = document.createTextNode(val.substr(pos + text.length));
33
+      parent.insertBefore(
34
+        span,
35
+        parent.insertBefore(
36
+          rest,
37
+          node.nextSibling
38
+        )
39
+      );
40
+      node.nodeValue = val.substr(0, pos);
41
+      /* There may be more occurrences of search term in this node. So call this
42
+       * function recursively on the remaining fragment.
43
+       */
44
+      _highlight(rest, addItems, text, className);
45
+
46
+      if (isInSVG) {
47
+        const rect = document.createElementNS(
48
+          "http://www.w3.org/2000/svg",
49
+          "rect"
50
+        );
51
+        const bbox = parent.getBBox();
52
+        rect.x.baseVal.value = bbox.x;
53
+        rect.y.baseVal.value = bbox.y;
54
+        rect.width.baseVal.value = bbox.width;
55
+        rect.height.baseVal.value = bbox.height;
56
+        rect.setAttribute("class", className);
57
+        addItems.push({ parent: parent, target: rect });
58
+      }
59
+    }
60
+  } else if (node.matches && !node.matches("button, select, textarea")) {
61
+    node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
62
+  }
63
+};
64
+const _highlightText = (thisNode, text, className) => {
65
+  let addItems = [];
66
+  _highlight(thisNode, addItems, text, className);
67
+  addItems.forEach((obj) =>
68
+    obj.parent.insertAdjacentElement("beforebegin", obj.target)
69
+  );
70
+};
71
+
72
+/**
73
+ * Small JavaScript module for the documentation.
74
+ */
75
+const SphinxHighlight = {
76
+
77
+  /**
78
+   * highlight the search words provided in localstorage in the text
79
+   */
80
+  highlightSearchWords: () => {
81
+    if (!SPHINX_HIGHLIGHT_ENABLED) return;  // bail if no highlight
82
+
83
+    // get and clear terms from localstorage
84
+    const url = new URL(window.location);
85
+    const highlight =
86
+        localStorage.getItem("sphinx_highlight_terms")
87
+        || url.searchParams.get("highlight")
88
+        || "";
89
+    localStorage.removeItem("sphinx_highlight_terms")
90
+    url.searchParams.delete("highlight");
91
+    window.history.replaceState({}, "", url);
92
+
93
+    // get individual terms from highlight string
94
+    const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
95
+    if (terms.length === 0) return; // nothing to do
96
+
97
+    // There should never be more than one element matching "div.body"
98
+    const divBody = document.querySelectorAll("div.body");
99
+    const body = divBody.length ? divBody[0] : document.querySelector("body");
100
+    window.setTimeout(() => {
101
+      terms.forEach((term) => _highlightText(body, term, "highlighted"));
102
+    }, 10);
103
+
104
+    const searchBox = document.getElementById("searchbox");
105
+    if (searchBox === null) return;
106
+    searchBox.appendChild(
107
+      document
108
+        .createRange()
109
+        .createContextualFragment(
110
+          '<p class="highlight-link">' +
111
+            '<a href="javascript:SphinxHighlight.hideSearchWords()">' +
112
+            _("Hide Search Matches") +
113
+            "</a></p>"
114
+        )
115
+    );
116
+  },
117
+
118
+  /**
119
+   * helper function to hide the search marks again
120
+   */
121
+  hideSearchWords: () => {
122
+    document
123
+      .querySelectorAll("#searchbox .highlight-link")
124
+      .forEach((el) => el.remove());
125
+    document
126
+      .querySelectorAll("span.highlighted")
127
+      .forEach((el) => el.classList.remove("highlighted"));
128
+    localStorage.removeItem("sphinx_highlight_terms")
129
+  },
130
+
131
+  initEscapeListener: () => {
132
+    // only install a listener if it is really needed
133
+    if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
134
+
135
+    document.addEventListener("keydown", (event) => {
136
+      // bail for input elements
137
+      if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
138
+      // bail with special keys
139
+      if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
140
+      if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
141
+        SphinxHighlight.hideSearchWords();
142
+        event.preventDefault();
143
+      }
144
+    });
145
+  },
146
+};
147
+
148
+_ready(() => {
149
+  /* Do not call highlightSearchWords() when we are on the search page.
150
+   * It will highlight words from the *previous* search query.
151
+   */
152
+  if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords();
153
+  SphinxHighlight.initEscapeListener();
154
+});

+ 24
- 0
_docs_/_static/themetoggle.js View File

1
+const pydocthemeDark = document.getElementById('pydoctheme_dark_css')
2
+const pygmentsDark = document.getElementById('pygments_dark_css')
3
+const themeSelectors = document.getElementsByClassName('theme-selector')
4
+
5
+function activateTheme(theme) {
6
+  localStorage.setItem('currentTheme', theme);
7
+  [...themeSelectors].forEach(e => e.value = theme)
8
+  switch (theme) {
9
+    case 'light':
10
+      pydocthemeDark.media = 'not all'
11
+      pygmentsDark.media = 'not all'
12
+      break;
13
+    case 'dark':
14
+      pydocthemeDark.media = 'all'
15
+      pygmentsDark.media = 'all'
16
+      break;
17
+    default:
18
+      // auto
19
+      pydocthemeDark.media = '(prefers-color-scheme: dark)'
20
+      pygmentsDark.media = '(prefers-color-scheme: dark)'
21
+  }
22
+}
23
+
24
+activateTheme(localStorage.getItem('currentTheme') || 'auto')

+ 0
- 1692
_docs_/_static/underscore.js
File diff suppressed because it is too large
View File


+ 225
- 179
_docs_/genindex.html View File

1
-
2
-
3
-
4
 <!DOCTYPE html>
1
 <!DOCTYPE html>
5
-<html class="writer-html4" lang="en" >
6
-<head>
7
-  <meta charset="utf-8">
8
-  
9
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
-  
11
-  <title>Index &mdash; caching  documentation</title>
12
-  
13
-
14
-  
15
-  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
16
-  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
17
-
18
-  
19
-  
20
-  
21
-  
22
 
2
 
23
-  
24
-  <!--[if lt IE 9]>
25
-    <script src="_static/js/html5shiv.min.js"></script>
26
-  <![endif]-->
27
-  
3
+<html lang="en" data-content_root="./">
4
+  <head>
5
+    <meta charset="utf-8" />
6
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+    <title>Index &#8212; caching  documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
28
     
8
     
29
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
30
-        <script type="text/javascript" src="_static/jquery.js"></script>
31
-        <script type="text/javascript" src="_static/underscore.js"></script>
32
-        <script type="text/javascript" src="_static/doctools.js"></script>
33
-        <script type="text/javascript" src="_static/language_data.js"></script>
9
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=80d5e7a1" />
10
+    <link rel="stylesheet" type="text/css" href="_static/pydoctheme.css?v=41b4f12d" />
11
+    <link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="_static/pygments_dark.css?v=b20cc3f5" />
34
     
12
     
35
-    <script type="text/javascript" src="_static/js/theme.js"></script>
36
-
13
+    <script src="_static/documentation_options.js?v=5929fcd5"></script>
14
+    <script src="_static/doctools.js?v=9a2dae69"></script>
15
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
37
     
16
     
38
     <link rel="index" title="Index" href="#" />
17
     <link rel="index" title="Index" href="#" />
39
-    <link rel="search" title="Search" href="search.html" /> 
40
-</head>
41
-
42
-<body class="wy-body-for-nav">
43
-
44
-   
45
-  <div class="wy-grid-for-nav">
46
-    
47
-    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
48
-      <div class="wy-side-scroll">
49
-        <div class="wy-side-nav-search" >
50
-          
51
-
52
-          
53
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> caching
54
-          
55
-
56
-          
57
-          </a>
58
-
59
-          
60
-            
18
+    <link rel="search" title="Search" href="search.html" /><link rel="stylesheet" href="_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">
19
+    <link rel="shortcut icon" type="image/png" href="_static/py.svg" />
20
+            <script type="text/javascript" src="_static/copybutton.js"></script>
21
+            <script type="text/javascript" src="_static/menu.js"></script>
22
+            <script type="text/javascript" src="_static/search-focus.js"></script>
23
+            <script type="text/javascript" src="_static/themetoggle.js"></script> 
24
+  </head>
25
+<body>
26
+<div class="mobile-nav">
27
+    <input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
28
+           aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
29
+    <nav class="nav-content" role="navigation">
30
+        <label for="menuToggler" class="toggler__label">
31
+            <span></span>
32
+        </label>
33
+        <span class="nav-items-wrapper">
34
+            <a href="https://www.python.org/" class="nav-logo">
35
+                <img src="_static/py.svg" alt="Python logo"/>
36
+            </a>
37
+            <span class="version_switcher_placeholder"></span>
38
+            <form role="search" class="search" action="search.html" method="get">
39
+                <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
40
+                    <path fill-rule="nonzero" fill="currentColor" d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
41
+                </svg>
42
+                <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
43
+                <input type="submit" value="Go"/>
44
+            </form>
45
+        </span>
46
+    </nav>
47
+    <div class="menu-wrapper">
48
+        <nav class="menu" role="navigation" aria-label="main navigation">
49
+            <div class="language_switcher_placeholder"></div>
61
             
50
             
62
-          
63
-
64
-          
65
-<div role="search">
66
-  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
67
-    <input type="text" name="q" placeholder="Search docs" />
68
-    <input type="hidden" name="check_keywords" value="yes" />
69
-    <input type="hidden" name="area" value="default" />
70
-  </form>
51
+<label class="theme-selector-label">
52
+    Theme
53
+    <select class="theme-selector" oninput="activateTheme(this.value)">
54
+        <option value="auto" selected>Auto</option>
55
+        <option value="light">Light</option>
56
+        <option value="dark">Dark</option>
57
+    </select>
58
+</label>
59
+<search id="searchbox" style="display: none" role="search">
60
+  <h3 id="searchlabel">Quick search</h3>
61
+    <div class="searchformwrapper">
62
+    <form class="search" action="search.html" method="get">
63
+      <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
64
+      <input type="submit" value="Go" />
65
+    </form>
66
+    </div>
67
+</search>
68
+<script>document.getElementById('searchbox').style.display = "block"</script>
69
+        </nav>
70
+    </div>
71
 </div>
71
 </div>
72
-
73
-          
74
-        </div>
75
-
76
-        
77
-        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
78
-          
79
-            
80
-            
72
+  
73
+    <div class="related" role="navigation" aria-label="Related">
74
+      <h3>Navigation</h3>
75
+      <ul>
76
+        <li class="right" style="margin-right: 10px">
77
+          <a href="#" title="General Index"
78
+             accesskey="I">index</a></li>
79
+        <li class="right" >
80
+          <a href="py-modindex.html" title="Python Module Index"
81
+             >modules</a> |</li>
82
+          <li><img src="_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
83
+          <li><a href="https://www.python.org/">Python</a> &#187;</li>
84
+          <li class="switchers">
85
+            <div class="language_switcher_placeholder"></div>
86
+            <div class="version_switcher_placeholder"></div>
87
+          </li>
88
+          <li>
81
               
89
               
90
+              <a href="index.html">caching  documentation</a> &#187;
91
+              
92
+          </li>
93
+        <li class="nav-item nav-item-this"><a href="">Index</a></li>
94
+                <li class="right">
95
+                    
96
+
97
+    <div class="inline-search" role="search">
98
+        <form class="inline-search" action="search.html" method="get">
99
+          <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
100
+          <input type="submit" value="Go" />
101
+        </form>
102
+    </div>
103
+                     |
104
+                </li>
105
+            <li class="right">
106
+<label class="theme-selector-label">
107
+    Theme
108
+    <select class="theme-selector" oninput="activateTheme(this.value)">
109
+        <option value="auto" selected>Auto</option>
110
+        <option value="light">Light</option>
111
+        <option value="dark">Dark</option>
112
+    </select>
113
+</label> |</li>
82
             
114
             
83
-            
84
-              <!-- Local TOC -->
85
-              <div class="local-toc"></div>
86
-            
87
-          
88
-        </div>
89
-        
90
-      </div>
91
-    </nav>
92
-
93
-    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
94
-
95
-      
96
-      <nav class="wy-nav-top" aria-label="top navigation">
97
-        
98
-          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
99
-          <a href="index.html">caching</a>
100
-        
101
-      </nav>
102
-
103
-
104
-      <div class="wy-nav-content">
105
-        
106
-        <div class="rst-content">
107
-        
108
-          
109
-
110
-
111
-
112
-
113
-
114
-
115
-
116
-
117
-
118
-
119
-
120
-
121
-
122
-
123
-
124
-<div role="navigation" aria-label="breadcrumbs navigation">
125
-
126
-  <ul class="wy-breadcrumbs">
127
-    
128
-      <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
129
-        
130
-      <li>Index</li>
131
-    
132
-    
133
-      <li class="wy-breadcrumbs-aside">
134
-        
135
-            
136
-        
137
-      </li>
138
-    
139
-  </ul>
115
+      </ul>
116
+    </div>    
140
 
117
 
141
-  
142
-  <hr/>
143
-</div>
144
-          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
145
-           <div itemprop="articleBody">
118
+    <div class="document">
119
+      <div class="documentwrapper">
120
+        <div class="bodywrapper">
121
+          <div class="body" role="main">
146
             
122
             
147
 
123
 
148
 <h1 id="index">Index</h1>
124
 <h1 id="index">Index</h1>
149
 
125
 
150
 <div class="genindex-jumpbox">
126
 <div class="genindex-jumpbox">
151
- <a href="#C"><strong>C</strong></a>
127
+ <a href="#A"><strong>A</strong></a>
128
+ | <a href="#C"><strong>C</strong></a>
129
+ | <a href="#F"><strong>F</strong></a>
152
  | <a href="#G"><strong>G</strong></a>
130
  | <a href="#G"><strong>G</strong></a>
153
- | <a href="#K"><strong>K</strong></a>
131
+ | <a href="#M"><strong>M</strong></a>
154
  | <a href="#P"><strong>P</strong></a>
132
  | <a href="#P"><strong>P</strong></a>
155
  
133
  
156
 </div>
134
 </div>
135
+<h2 id="A">A</h2>
136
+<table style="width: 100%" class="indextable genindextable"><tr>
137
+  <td style="width: 33%; vertical-align: top;"><ul>
138
+      <li><a href="index.html#caching.property_cache_pickle.add_source_get_keys">add_source_get_keys() (caching.property_cache_pickle method)</a>
139
+</li>
140
+  </ul></td>
141
+</tr></table>
142
+
157
 <h2 id="C">C</h2>
143
 <h2 id="C">C</h2>
158
 <table style="width: 100%" class="indextable genindextable"><tr>
144
 <table style="width: 100%" class="indextable genindextable"><tr>
159
   <td style="width: 33%; vertical-align: top;"><ul>
145
   <td style="width: 33%; vertical-align: top;"><ul>
160
-      <li><a href="index.html#module-caching">caching (module)</a>
146
+      <li>
147
+    caching
148
+
149
+      <ul>
150
+        <li><a href="index.html#module-caching">module</a>
151
+</li>
152
+      </ul></li>
153
+  </ul></td>
154
+</tr></table>
155
+
156
+<h2 id="F">F</h2>
157
+<table style="width: 100%" class="indextable genindextable"><tr>
158
+  <td style="width: 33%; vertical-align: top;"><ul>
159
+      <li><a href="index.html#caching.property_cache_pickle.full_update">full_update() (caching.property_cache_pickle method)</a>
161
 </li>
160
 </li>
162
   </ul></td>
161
   </ul></td>
163
 </tr></table>
162
 </tr></table>
170
   </ul></td>
169
   </ul></td>
171
 </tr></table>
170
 </tr></table>
172
 
171
 
173
-<h2 id="K">K</h2>
172
+<h2 id="M">M</h2>
174
 <table style="width: 100%" class="indextable genindextable"><tr>
173
 <table style="width: 100%" class="indextable genindextable"><tr>
175
   <td style="width: 33%; vertical-align: top;"><ul>
174
   <td style="width: 33%; vertical-align: top;"><ul>
176
-      <li><a href="index.html#caching.property_cache_pickle.keys">keys() (caching.property_cache_pickle method)</a>
175
+      <li>
176
+    module
177
+
178
+      <ul>
179
+        <li><a href="index.html#module-caching">caching</a>
177
 </li>
180
 </li>
181
+      </ul></li>
178
   </ul></td>
182
   </ul></td>
179
 </tr></table>
183
 </tr></table>
180
 
184
 
192
 
196
 
193
 
197
 
194
 
198
 
195
-           </div>
196
-           
199
+            <div class="clearer"></div>
197
           </div>
200
           </div>
198
-          <footer>
199
-  
200
-
201
-  <hr/>
202
-
203
-  <div role="contentinfo">
204
-    <p>
205
-        
206
-        &copy; Copyright 2021, Dirk Alders
207
-
208
-    </p>
209
-  </div>
210
-    
211
-    
212
-    
213
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
214
-    
215
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
216
-    
217
-    provided by <a href="https://readthedocs.org">Read the Docs</a>. 
218
-
219
-</footer>
220
-
221
         </div>
201
         </div>
222
       </div>
202
       </div>
203
+      <div class="sphinxsidebar" role="navigation" aria-label="Main">
204
+        <div class="sphinxsidebarwrapper">
205
+<search id="searchbox" style="display: none" role="search">
206
+  <h3 id="searchlabel">Quick search</h3>
207
+    <div class="searchformwrapper">
208
+    <form class="search" action="search.html" method="get">
209
+      <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
210
+      <input type="submit" value="Go" />
211
+    </form>
212
+    </div>
213
+</search>
214
+<script>document.getElementById('searchbox').style.display = "block"</script>
215
+        </div>
216
+      </div>
217
+      <div class="clearer"></div>
218
+    </div>  
219
+    <div class="related" role="navigation" aria-label="Related">
220
+      <h3>Navigation</h3>
221
+      <ul>
222
+        <li class="right" style="margin-right: 10px">
223
+          <a href="#" title="General Index"
224
+             >index</a></li>
225
+        <li class="right" >
226
+          <a href="py-modindex.html" title="Python Module Index"
227
+             >modules</a> |</li>
228
+          <li><img src="_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
229
+          <li><a href="https://www.python.org/">Python</a> &#187;</li>
230
+          <li class="switchers">
231
+            <div class="language_switcher_placeholder"></div>
232
+            <div class="version_switcher_placeholder"></div>
233
+          </li>
234
+          <li>
235
+              
236
+              <a href="index.html">caching  documentation</a> &#187;
237
+              
238
+          </li>
239
+        <li class="nav-item nav-item-this"><a href="">Index</a></li>
240
+                <li class="right">
241
+                    
242
+
243
+    <div class="inline-search" role="search">
244
+        <form class="inline-search" action="search.html" method="get">
245
+          <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
246
+          <input type="submit" value="Go" />
247
+        </form>
248
+    </div>
249
+                     |
250
+                </li>
251
+            <li class="right">
252
+<label class="theme-selector-label">
253
+    Theme
254
+    <select class="theme-selector" oninput="activateTheme(this.value)">
255
+        <option value="auto" selected>Auto</option>
256
+        <option value="light">Light</option>
257
+        <option value="dark">Dark</option>
258
+    </select>
259
+</label> |</li>
260
+            
261
+      </ul>
262
+    </div>  
263
+    <div class="footer">
264
+    &copy; 
265
+    Copyright
266
+     2021, Dirk Alders.
267
+    <br />
268
+    This page is licensed under the Python Software Foundation License Version 2.
269
+    <br />
270
+    Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
271
+    <br />
272
+    
273
+    
274
+    <br />
223
 
275
 
224
-    </section>
225
-
226
-  </div>
227
-  
228
-
229
-  <script type="text/javascript">
230
-      jQuery(function () {
231
-          SphinxRtdTheme.Navigation.enable(true);
232
-      });
233
-  </script>
234
-
235
-  
236
-  
276
+    The Python Software Foundation is a non-profit corporation.
277
+<a href="https://www.python.org/psf/donations/">Please donate.</a>
278
+<br />
279
+    <br />
237
     
280
     
238
-   
281
+    <br />
282
+
283
+    Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.0.2.
284
+    </div>
239
 
285
 
240
-</body>
286
+  </body>
241
 </html>
287
 </html>

+ 516
- 466
_docs_/index.html
File diff suppressed because it is too large
View File


BIN
_docs_/objects.inv View File


+ 194
- 173
_docs_/py-modindex.html View File

1
-
2
-
3
 <!DOCTYPE html>
1
 <!DOCTYPE html>
4
-<html class="writer-html4" lang="en" >
5
-<head>
6
-  <meta charset="utf-8">
7
-  
8
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
9
-  
10
-  <title>Python Module Index &mdash; caching  documentation</title>
11
-  
12
-
13
-  
14
-  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
15
-  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
16
-
17
-  
18
-  
19
-  
20
-  
21
 
2
 
22
-  
23
-  <!--[if lt IE 9]>
24
-    <script src="_static/js/html5shiv.min.js"></script>
25
-  <![endif]-->
26
-  
3
+<html lang="en" data-content_root="./">
4
+  <head>
5
+    <meta charset="utf-8" />
6
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+    <title>Python Module Index &#8212; caching  documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
27
     
8
     
28
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
29
-        <script type="text/javascript" src="_static/jquery.js"></script>
30
-        <script type="text/javascript" src="_static/underscore.js"></script>
31
-        <script type="text/javascript" src="_static/doctools.js"></script>
32
-        <script type="text/javascript" src="_static/language_data.js"></script>
9
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=80d5e7a1" />
10
+    <link rel="stylesheet" type="text/css" href="_static/pydoctheme.css?v=41b4f12d" />
11
+    <link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="_static/pygments_dark.css?v=b20cc3f5" />
33
     
12
     
34
-    <script type="text/javascript" src="_static/js/theme.js"></script>
35
-
13
+    <script src="_static/documentation_options.js?v=5929fcd5"></script>
14
+    <script src="_static/doctools.js?v=9a2dae69"></script>
15
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
36
     
16
     
37
     <link rel="index" title="Index" href="genindex.html" />
17
     <link rel="index" title="Index" href="genindex.html" />
38
     <link rel="search" title="Search" href="search.html" />
18
     <link rel="search" title="Search" href="search.html" />
39
- 
40
-
41
-    <script type="text/javascript">
19
+<link rel="stylesheet" href="_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">
20
+    <link rel="shortcut icon" type="image/png" href="_static/py.svg" />
21
+            <script type="text/javascript" src="_static/copybutton.js"></script>
22
+            <script type="text/javascript" src="_static/menu.js"></script>
23
+            <script type="text/javascript" src="_static/search-focus.js"></script>
24
+            <script type="text/javascript" src="_static/themetoggle.js"></script> 
25
+
26
+    <script>
42
       DOCUMENTATION_OPTIONS.COLLAPSE_INDEX = true;
27
       DOCUMENTATION_OPTIONS.COLLAPSE_INDEX = true;
43
     </script>
28
     </script>
44
 
29
 
45
 
30
 
46
-</head>
47
-
48
-<body class="wy-body-for-nav">
49
-
50
-   
51
-  <div class="wy-grid-for-nav">
52
-    
53
-    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
54
-      <div class="wy-side-scroll">
55
-        <div class="wy-side-nav-search" >
56
-          
57
-
58
-          
59
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> caching
60
-          
61
-
62
-          
63
-          </a>
64
-
65
-          
66
-            
31
+  </head>
32
+<body>
33
+<div class="mobile-nav">
34
+    <input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
35
+           aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
36
+    <nav class="nav-content" role="navigation">
37
+        <label for="menuToggler" class="toggler__label">
38
+            <span></span>
39
+        </label>
40
+        <span class="nav-items-wrapper">
41
+            <a href="https://www.python.org/" class="nav-logo">
42
+                <img src="_static/py.svg" alt="Python logo"/>
43
+            </a>
44
+            <span class="version_switcher_placeholder"></span>
45
+            <form role="search" class="search" action="search.html" method="get">
46
+                <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
47
+                    <path fill-rule="nonzero" fill="currentColor" d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
48
+                </svg>
49
+                <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
50
+                <input type="submit" value="Go"/>
51
+            </form>
52
+        </span>
53
+    </nav>
54
+    <div class="menu-wrapper">
55
+        <nav class="menu" role="navigation" aria-label="main navigation">
56
+            <div class="language_switcher_placeholder"></div>
67
             
57
             
68
-          
69
-
70
-          
71
-<div role="search">
72
-  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
73
-    <input type="text" name="q" placeholder="Search docs" />
74
-    <input type="hidden" name="check_keywords" value="yes" />
75
-    <input type="hidden" name="area" value="default" />
76
-  </form>
58
+<label class="theme-selector-label">
59
+    Theme
60
+    <select class="theme-selector" oninput="activateTheme(this.value)">
61
+        <option value="auto" selected>Auto</option>
62
+        <option value="light">Light</option>
63
+        <option value="dark">Dark</option>
64
+    </select>
65
+</label>
66
+<search id="searchbox" style="display: none" role="search">
67
+  <h3 id="searchlabel">Quick search</h3>
68
+    <div class="searchformwrapper">
69
+    <form class="search" action="search.html" method="get">
70
+      <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
71
+      <input type="submit" value="Go" />
72
+    </form>
73
+    </div>
74
+</search>
75
+<script>document.getElementById('searchbox').style.display = "block"</script>
76
+        </nav>
77
+    </div>
77
 </div>
78
 </div>
78
-
79
-          
80
-        </div>
81
-
82
-        
83
-        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
84
-          
85
-            
86
-            
79
+  
80
+    <div class="related" role="navigation" aria-label="Related">
81
+      <h3>Navigation</h3>
82
+      <ul>
83
+        <li class="right" style="margin-right: 10px">
84
+          <a href="genindex.html" title="General Index"
85
+             accesskey="I">index</a></li>
86
+        <li class="right" >
87
+          <a href="#" title="Python Module Index"
88
+             >modules</a> |</li>
89
+          <li><img src="_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
90
+          <li><a href="https://www.python.org/">Python</a> &#187;</li>
91
+          <li class="switchers">
92
+            <div class="language_switcher_placeholder"></div>
93
+            <div class="version_switcher_placeholder"></div>
94
+          </li>
95
+          <li>
87
               
96
               
97
+              <a href="index.html">caching  documentation</a> &#187;
98
+              
99
+          </li>
100
+        <li class="nav-item nav-item-this"><a href="">Python Module Index</a></li>
101
+                <li class="right">
102
+                    
103
+
104
+    <div class="inline-search" role="search">
105
+        <form class="inline-search" action="search.html" method="get">
106
+          <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
107
+          <input type="submit" value="Go" />
108
+        </form>
109
+    </div>
110
+                     |
111
+                </li>
112
+            <li class="right">
113
+<label class="theme-selector-label">
114
+    Theme
115
+    <select class="theme-selector" oninput="activateTheme(this.value)">
116
+        <option value="auto" selected>Auto</option>
117
+        <option value="light">Light</option>
118
+        <option value="dark">Dark</option>
119
+    </select>
120
+</label> |</li>
88
             
121
             
89
-            
90
-              <!-- Local TOC -->
91
-              <div class="local-toc"></div>
92
-            
93
-          
94
-        </div>
95
-        
96
-      </div>
97
-    </nav>
98
-
99
-    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
100
-
101
-      
102
-      <nav class="wy-nav-top" aria-label="top navigation">
103
-        
104
-          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
105
-          <a href="index.html">caching</a>
106
-        
107
-      </nav>
108
-
109
-
110
-      <div class="wy-nav-content">
111
-        
112
-        <div class="rst-content">
113
-        
114
-          
115
-
116
-
117
-
122
+      </ul>
123
+    </div>    
118
 
124
 
119
-
120
-
121
-
122
-
123
-
124
-
125
-
126
-
127
-
128
-
129
-
130
-<div role="navigation" aria-label="breadcrumbs navigation">
131
-
132
-  <ul class="wy-breadcrumbs">
133
-    
134
-      <li><a href="index.html" class="icon icon-home"></a> &raquo;</li>
135
-        
136
-      <li>Python Module Index</li>
137
-    
138
-    
139
-      <li class="wy-breadcrumbs-aside">
140
-        
141
-      </li>
142
-    
143
-  </ul>
144
-
145
-  
146
-  <hr/>
147
-</div>
148
-          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
149
-           <div itemprop="articleBody">
125
+    <div class="document">
126
+      <div class="documentwrapper">
127
+        <div class="bodywrapper">
128
+          <div class="body" role="main">
150
             
129
             
151
 
130
 
152
    <h1>Python Module Index</h1>
131
    <h1>Python Module Index</h1>
167
    </table>
146
    </table>
168
 
147
 
169
 
148
 
170
-           </div>
171
-           
149
+            <div class="clearer"></div>
172
           </div>
150
           </div>
173
-          <footer>
174
-  
175
-
176
-  <hr/>
177
-
178
-  <div role="contentinfo">
179
-    <p>
180
-        
181
-        &copy; Copyright 2021, Dirk Alders
182
-
183
-    </p>
184
-  </div>
185
-    
186
-    
187
-    
188
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
189
-    
190
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
191
-    
192
-    provided by <a href="https://readthedocs.org">Read the Docs</a>. 
193
-
194
-</footer>
195
-
196
         </div>
151
         </div>
197
       </div>
152
       </div>
153
+      <div class="sphinxsidebar" role="navigation" aria-label="Main">
154
+        <div class="sphinxsidebarwrapper">
155
+<search id="searchbox" style="display: none" role="search">
156
+  <h3 id="searchlabel">Quick search</h3>
157
+    <div class="searchformwrapper">
158
+    <form class="search" action="search.html" method="get">
159
+      <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
160
+      <input type="submit" value="Go" />
161
+    </form>
162
+    </div>
163
+</search>
164
+<script>document.getElementById('searchbox').style.display = "block"</script>
165
+        </div>
166
+      </div>
167
+      <div class="clearer"></div>
168
+    </div>  
169
+    <div class="related" role="navigation" aria-label="Related">
170
+      <h3>Navigation</h3>
171
+      <ul>
172
+        <li class="right" style="margin-right: 10px">
173
+          <a href="genindex.html" title="General Index"
174
+             >index</a></li>
175
+        <li class="right" >
176
+          <a href="#" title="Python Module Index"
177
+             >modules</a> |</li>
178
+          <li><img src="_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
179
+          <li><a href="https://www.python.org/">Python</a> &#187;</li>
180
+          <li class="switchers">
181
+            <div class="language_switcher_placeholder"></div>
182
+            <div class="version_switcher_placeholder"></div>
183
+          </li>
184
+          <li>
185
+              
186
+              <a href="index.html">caching  documentation</a> &#187;
187
+              
188
+          </li>
189
+        <li class="nav-item nav-item-this"><a href="">Python Module Index</a></li>
190
+                <li class="right">
191
+                    
192
+
193
+    <div class="inline-search" role="search">
194
+        <form class="inline-search" action="search.html" method="get">
195
+          <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
196
+          <input type="submit" value="Go" />
197
+        </form>
198
+    </div>
199
+                     |
200
+                </li>
201
+            <li class="right">
202
+<label class="theme-selector-label">
203
+    Theme
204
+    <select class="theme-selector" oninput="activateTheme(this.value)">
205
+        <option value="auto" selected>Auto</option>
206
+        <option value="light">Light</option>
207
+        <option value="dark">Dark</option>
208
+    </select>
209
+</label> |</li>
210
+            
211
+      </ul>
212
+    </div>  
213
+    <div class="footer">
214
+    &copy; 
215
+    Copyright
216
+     2021, Dirk Alders.
217
+    <br />
218
+    This page is licensed under the Python Software Foundation License Version 2.
219
+    <br />
220
+    Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
221
+    <br />
222
+    
223
+    
224
+    <br />
198
 
225
 
199
-    </section>
200
-
201
-  </div>
202
-  
203
-
204
-  <script type="text/javascript">
205
-      jQuery(function () {
206
-          SphinxRtdTheme.Navigation.enable(true);
207
-      });
208
-  </script>
209
-
210
-  
211
-  
226
+    The Python Software Foundation is a non-profit corporation.
227
+<a href="https://www.python.org/psf/donations/">Please donate.</a>
228
+<br />
229
+    <br />
212
     
230
     
213
-   
231
+    <br />
232
+
233
+    Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.0.2.
234
+    </div>
214
 
235
 
215
-</body>
236
+  </body>
216
 </html>
237
 </html>

+ 0
- 0
_docs_/search.html View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save