Explorar el Código

docs, examples and logging updated

master
Dirk Alders hace 3 meses
padre
commit
cc06fae9cd
Se han modificado 100 ficheros con 3686 adiciones y 19117 borrados
  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 Ver fichero

@@ -45,28 +45,39 @@ __INTERPRETER__ = (3, )
45 45
 
46 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 60
     :param source_instance: The source instance holding the data
51 61
     :type source_instance: instance
52 62
     :param cache_filename: File name, where the properties are stored as cache
53 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 82
     **Example:**
72 83
 
@@ -76,11 +87,10 @@ class property_cache_pickle(object):
76 87
 
77 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 92
     .. literalinclude:: caching/_examples_/property_cache_pickle_2.log
82 93
     """
83
-    LOG_PREFIX = 'PickCache:'
84 94
     DATA_VERSION_TAG = '_property_cache_data_version_'
85 95
     STORAGE_VERSION_TAG = '_storage_version_'
86 96
     UID_TAG = '_property_cache_uid_'
@@ -100,9 +110,31 @@ class property_cache_pickle(object):
100 110
         self._source_get_keys = []
101 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 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 139
         :param key: key for value to get.
108 140
         :param default: value to be returned, if key does not exists.
@@ -118,34 +150,26 @@ class property_cache_pickle(object):
118 150
                 if cache_old:
119 151
                     logger.debug("The cached value is old, cached value will be ignored")
120 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 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 155
                 if self._store_on_get:
124 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 158
                     self._cached_props[self.DATA_TAG][self._key_filter(key)] = val
127 159
                     self._cached_props[self.AGE_TAG][self._key_filter(key)] = tm
128 160
                     self._save_cache()
129 161
                 else:
130 162
                     return val
131 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 165
             return self._cached_props[self.DATA_TAG].get(self._key_filter(key), default)
135 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 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 173
     def _data_version(self):
150 174
         if self._cached_props is None:
151 175
             return None
@@ -173,11 +197,11 @@ class property_cache_pickle(object):
173 197
         if not load_cache or uid or data_version or storage_version:
174 198
             if load_cache:
175 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 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 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 205
             self._cached_props = {self.AGE_TAG: {}, self.DATA_TAG: {}}
182 206
             if self._load_all_on_init:
183 207
                 self._load_source()
@@ -190,10 +214,10 @@ class property_cache_pickle(object):
190 214
         if os.path.exists(self._cache_filename):
191 215
             with open(self._cache_filename, 'rb') as fh:
192 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 218
             return True
195 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 221
         return False
198 222
 
199 223
     def _key_filter(self, key):
@@ -202,7 +226,7 @@ class property_cache_pickle(object):
202 226
     def _load_source(self):
203 227
         if self._cached_props is None:
204 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 230
         for key in self.keys():
207 231
             if key not in self._source_get_keys:
208 232
                 self._cached_props[self.DATA_TAG][self._key_filter(key)] = self._source_instance.get(key)
@@ -211,9 +235,9 @@ class property_cache_pickle(object):
211 235
     def _save_cache(self):
212 236
         with open(self._cache_filename, 'wb') as fh:
213 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 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 242
     def _uid(self):
219 243
         if self._cached_props is None:
@@ -221,12 +245,6 @@ class property_cache_pickle(object):
221 245
         else:
222 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 248
     def __getattribute__(self, name):
231 249
         try:
232 250
             return super().__getattribute__(name)
@@ -236,32 +254,13 @@ class property_cache_pickle(object):
236 254
 
237 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 260
         * This class uses json. You should **only** use keys of type string!
252 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 265
     **Example:**
267 266
 
@@ -271,25 +270,23 @@ class property_cache_json(property_cache_pickle):
271 270
 
272 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 275
     .. literalinclude:: caching/_examples_/property_cache_json_2.log
277 276
     """
278
-    LOG_PREFIX = 'JsonCache:'
279
-
280 277
     def _load_cache(self):
281 278
         if os.path.exists(self._cache_filename):
282 279
             with open(self._cache_filename, 'r') as fh:
283 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 282
             return True
286 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 285
         return False
289 286
 
290 287
     def _save_cache(self):
291 288
         with open(self._cache_filename, 'w') as fh:
292 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 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 Ver fichero

@@ -1,4 +1,4 @@
1 1
 # Sphinx build info version 1
2 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 4
 tags: 645f666f9bcd5a90fca523b33c5a78b7

BIN
_docs_/_downloads/f5f51665bfc67c10ccc039770b738067/unittest.pdf Ver fichero


+ 1
- 0
_docs_/_sources/index.rst.txt Ver fichero

@@ -10,6 +10,7 @@ Welcome to cachings's documentation!
10 10
    :members:
11 11
 
12 12
 .. toctree::
13
+   :orphan: LICENSE.rst
13 14
    :maxdepth: 2
14 15
    :caption: Contents:
15 16
 

+ 301
- 52
_docs_/_static/basic.css Ver fichero

@@ -4,7 +4,7 @@
4 4
  *
5 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 8
  * :license: BSD, see LICENSE for details.
9 9
  *
10 10
  */
@@ -15,6 +15,12 @@ div.clearer {
15 15
     clear: both;
16 16
 }
17 17
 
18
+div.section::after {
19
+    display: block;
20
+    content: '';
21
+    clear: left;
22
+}
23
+
18 24
 /* -- relbar ---------------------------------------------------------------- */
19 25
 
20 26
 div.related {
@@ -124,7 +130,7 @@ ul.search li a {
124 130
     font-weight: bold;
125 131
 }
126 132
 
127
-ul.search li div.context {
133
+ul.search li p.context {
128 134
     color: #888;
129 135
     margin: 2px 0 0 30px;
130 136
     text-align: left;
@@ -216,7 +222,7 @@ table.modindextable td {
216 222
 /* -- general body styles --------------------------------------------------- */
217 223
 
218 224
 div.body {
219
-    min-width: 450px;
225
+    min-width: 360px;
220 226
     max-width: 800px;
221 227
 }
222 228
 
@@ -231,6 +237,10 @@ a.headerlink {
231 237
     visibility: hidden;
232 238
 }
233 239
 
240
+a:visited {
241
+    color: #551A8B;
242
+}
243
+
234 244
 h1:hover > a.headerlink,
235 245
 h2:hover > a.headerlink,
236 246
 h3:hover > a.headerlink,
@@ -261,19 +271,25 @@ p.rubric {
261 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 275
     clear: left;
266 276
     float: left;
267 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 281
     clear: right;
272 282
     float: right;
273 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 293
   display: block;
278 294
   margin-left: auto;
279 295
   margin-right: auto;
@@ -287,30 +303,45 @@ img.align-center, .figure.align-center, object.align-center {
287 303
     text-align: center;
288 304
 }
289 305
 
306
+.align-default {
307
+    text-align: center;
308
+}
309
+
290 310
 .align-right {
291 311
     text-align: right;
292 312
 }
293 313
 
294 314
 /* -- sidebars -------------------------------------------------------------- */
295 315
 
296
-div.sidebar {
316
+div.sidebar,
317
+aside.sidebar {
297 318
     margin: 0 0 0.5em 1em;
298 319
     border: 1px solid #ddb;
299
-    padding: 7px 7px 0 7px;
320
+    padding: 7px;
300 321
     background-color: #ffe;
301 322
     width: 40%;
302 323
     float: right;
324
+    clear: right;
325
+    overflow-x: auto;
303 326
 }
304 327
 
305 328
 p.sidebar-title {
306 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 338
 /* -- topics ---------------------------------------------------------------- */
310 339
 
340
+nav.contents,
341
+aside.topic,
311 342
 div.topic {
312 343
     border: 1px solid #ccc;
313
-    padding: 7px 7px 0 7px;
344
+    padding: 7px;
314 345
     margin: 10px 0 10px 0;
315 346
 }
316 347
 
@@ -332,10 +363,6 @@ div.admonition dt {
332 363
     font-weight: bold;
333 364
 }
334 365
 
335
-div.admonition dl {
336
-    margin-bottom: 0;
337
-}
338
-
339 366
 p.admonition-title {
340 367
     margin: 0px 10px 5px 0px;
341 368
     font-weight: bold;
@@ -346,9 +373,34 @@ div.body p.centered {
346 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 399
 /* -- tables ---------------------------------------------------------------- */
350 400
 
351 401
 table.docutils {
402
+    margin-top: 10px;
403
+    margin-bottom: 10px;
352 404
     border: 0;
353 405
     border-collapse: collapse;
354 406
 }
@@ -358,6 +410,11 @@ table.align-center {
358 410
     margin-right: auto;
359 411
 }
360 412
 
413
+table.align-default {
414
+    margin-left: auto;
415
+    margin-right: auto;
416
+}
417
+
361 418
 table caption span.caption-number {
362 419
     font-style: italic;
363 420
 }
@@ -373,10 +430,6 @@ table.docutils td, table.docutils th {
373 430
     border-bottom: 1px solid #aaa;
374 431
 }
375 432
 
376
-table.footnote td, table.footnote th {
377
-    border: 0 !important;
378
-}
379
-
380 433
 th {
381 434
     text-align: left;
382 435
     padding-right: 5px;
@@ -391,22 +444,34 @@ table.citation td {
391 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 457
 /* -- figures --------------------------------------------------------------- */
395 458
 
396
-div.figure {
459
+div.figure, figure {
397 460
     margin: 0.5em;
398 461
     padding: 0.5em;
399 462
 }
400 463
 
401
-div.figure p.caption {
464
+div.figure p.caption, figcaption {
402 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 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 477
 /* -- field list styles ----------------------------------------------------- */
@@ -433,10 +498,71 @@ table.field-list td, table.field-list th {
433 498
 
434 499
 /* -- hlist styles ---------------------------------------------------------- */
435 500
 
501
+table.hlist {
502
+    margin: 1em 0;
503
+}
504
+
436 505
 table.hlist td {
437 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 567
 /* -- other body styles ----------------------------------------------------- */
442 568
 
@@ -460,11 +586,81 @@ ol.upperroman {
460 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 659
 dl {
464 660
     margin-bottom: 15px;
465 661
 }
466 662
 
467
-dd p {
663
+dd > :first-child {
468 664
     margin-top: 0px;
469 665
 }
470 666
 
@@ -478,6 +674,21 @@ dd {
478 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 692
 dt:target, span.highlighted {
482 693
     background-color: #fbe54e;
483 694
 }
@@ -491,14 +702,6 @@ dl.glossary dt {
491 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 705
 .versionmodified {
503 706
     font-style: italic;
504 707
 }
@@ -537,11 +740,26 @@ dl.glossary dt {
537 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 750
 abbr, acronym {
541 751
     border-bottom: dotted 1px;
542 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 763
 /* -- code displays --------------------------------------------------------- */
546 764
 
547 765
 pre {
@@ -549,29 +767,69 @@ pre {
549 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 774
 span.pre {
553 775
     -moz-hyphens: none;
554 776
     -ms-hyphens: none;
555 777
     -webkit-hyphens: none;
556 778
     hyphens: none;
779
+    white-space: nowrap;
780
+}
781
+
782
+div[class*="highlight-"] {
783
+    margin: 1em 0;
557 784
 }
558 785
 
559 786
 td.linenos pre {
560
-    padding: 5px 0px;
561 787
     border: 0;
562 788
     background-color: transparent;
563 789
     color: #aaa;
564 790
 }
565 791
 
566 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 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 831
 div.code-block-caption {
832
+    margin-top: 1em;
575 833
     padding: 2px 5px;
576 834
     font-size: small;
577 835
 }
@@ -580,8 +838,14 @@ div.code-block-caption code {
580 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 851
 div.code-block-caption span.caption-number {
@@ -593,21 +857,7 @@ div.code-block-caption span.caption-text {
593 857
 }
594 858
 
595 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 863
 code.xref, a code {
@@ -648,8 +898,7 @@ span.eqno {
648 898
 }
649 899
 
650 900
 span.eqno a.headerlink {
651
-    position: relative;
652
-    left: 0px;
901
+    position: absolute;
653 902
     z-index: 1;
654 903
 }
655 904
 

+ 269
- 0
_docs_/_static/classic.css Ver fichero

@@ -0,0 +1,269 @@
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 Ver fichero

@@ -0,0 +1,92 @@
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 Ver fichero

@@ -1 +0,0 @@
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 Ver fichero


BIN
_docs_/_static/css/fonts/Roboto-Slab-Bold.woff2 Ver fichero


BIN
_docs_/_static/css/fonts/Roboto-Slab-Regular.woff Ver fichero


BIN
_docs_/_static/css/fonts/Roboto-Slab-Regular.woff2 Ver fichero


BIN
_docs_/_static/css/fonts/fontawesome-webfont.eot Ver fichero


+ 0
- 2671
_docs_/_static/css/fonts/fontawesome-webfont.svg
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


BIN
_docs_/_static/css/fonts/fontawesome-webfont.ttf Ver fichero


BIN
_docs_/_static/css/fonts/fontawesome-webfont.woff Ver fichero


BIN
_docs_/_static/css/fonts/fontawesome-webfont.woff2 Ver fichero


BIN
_docs_/_static/css/fonts/lato-bold-italic.woff Ver fichero


BIN
_docs_/_static/css/fonts/lato-bold-italic.woff2 Ver fichero


BIN
_docs_/_static/css/fonts/lato-bold.woff Ver fichero


BIN
_docs_/_static/css/fonts/lato-bold.woff2 Ver fichero


BIN
_docs_/_static/css/fonts/lato-normal-italic.woff Ver fichero


BIN
_docs_/_static/css/fonts/lato-normal-italic.woff2 Ver fichero


BIN
_docs_/_static/css/fonts/lato-normal.woff Ver fichero


BIN
_docs_/_static/css/fonts/lato-normal.woff2 Ver fichero


+ 0
- 4
_docs_/_static/css/theme.css
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 1
- 0
_docs_/_static/default.css Ver fichero

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

+ 109
- 268
_docs_/_static/doctools.js Ver fichero

@@ -2,314 +2,155 @@
2 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 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 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 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 44
   // gettext and ngettext don't access this so that the functions
166 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 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 Ver fichero

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

BIN
_docs_/_static/fonts/FontAwesome.otf Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-bold.eot Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-bold.ttf Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-bold.woff Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-bold.woff2 Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-bolditalic.eot Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-bolditalic.ttf Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-bolditalic.woff Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-bolditalic.woff2 Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-italic.eot Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-italic.ttf Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-italic.woff Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-italic.woff2 Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-regular.eot Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-regular.ttf Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-regular.woff Ver fichero


BIN
_docs_/_static/fonts/Lato/lato-regular.woff2 Ver fichero


BIN
_docs_/_static/fonts/Roboto-Slab-Bold.woff Ver fichero


BIN
_docs_/_static/fonts/Roboto-Slab-Bold.woff2 Ver fichero


BIN
_docs_/_static/fonts/Roboto-Slab-Light.woff Ver fichero


BIN
_docs_/_static/fonts/Roboto-Slab-Light.woff2 Ver fichero


BIN
_docs_/_static/fonts/Roboto-Slab-Regular.woff Ver fichero


BIN
_docs_/_static/fonts/Roboto-Slab-Regular.woff2 Ver fichero


BIN
_docs_/_static/fonts/Roboto-Slab-Thin.woff Ver fichero


BIN
_docs_/_static/fonts/Roboto-Slab-Thin.woff2 Ver fichero


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot Ver fichero


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf Ver fichero


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff Ver fichero


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 Ver fichero


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot Ver fichero


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf Ver fichero


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff Ver fichero


BIN
_docs_/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 Ver fichero


BIN
_docs_/_static/fonts/fontawesome-webfont.eot Ver fichero


+ 0
- 2671
_docs_/_static/fonts/fontawesome-webfont.svg
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


BIN
_docs_/_static/fonts/fontawesome-webfont.ttf Ver fichero


BIN
_docs_/_static/fonts/fontawesome-webfont.woff Ver fichero


BIN
_docs_/_static/fonts/fontawesome-webfont.woff2 Ver fichero


BIN
_docs_/_static/fonts/lato-bold-italic.woff Ver fichero


BIN
_docs_/_static/fonts/lato-bold-italic.woff2 Ver fichero


BIN
_docs_/_static/fonts/lato-bold.woff Ver fichero


BIN
_docs_/_static/fonts/lato-bold.woff2 Ver fichero


BIN
_docs_/_static/fonts/lato-normal-italic.woff Ver fichero


BIN
_docs_/_static/fonts/lato-normal-italic.woff2 Ver fichero


BIN
_docs_/_static/fonts/lato-normal.woff Ver fichero


BIN
_docs_/_static/fonts/lato-normal.woff2 Ver fichero


+ 0
- 10365
_docs_/_static/jquery.js
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 0
- 1
_docs_/_static/js/badge_only.js Ver fichero

@@ -1 +0,0 @@
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 Ver fichero

@@ -1,4 +0,0 @@
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 Ver fichero

@@ -1,4 +0,0 @@
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
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 0
- 1
_docs_/_static/js/theme.js Ver fichero

@@ -1 +0,0 @@
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 Ver fichero

@@ -5,15 +5,16 @@
5 5
  * This script contains the language-specific data used by searchtools.js,
6 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 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 19
  * Porter Stemmer
19 20
  */
@@ -196,102 +197,3 @@ var Stemmer = function() {
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 Ver fichero

@@ -0,0 +1,57 @@
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 Ver fichero


+ 14
- 0
_docs_/_static/py.svg Ver fichero

@@ -0,0 +1,14 @@
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 Ver fichero

@@ -0,0 +1,756 @@
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 Ver fichero

@@ -0,0 +1,178 @@
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 Ver fichero

@@ -1,21 +1,27 @@
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 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 9
 .highlight .err { border: 1px solid #FF0000 } /* Error */
5 10
 .highlight .k { color: #008000; font-weight: bold } /* Keyword */
6 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 18
 .highlight .gd { color: #A00000 } /* Generic.Deleted */
14 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 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 25
 .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
20 26
 .highlight .gs { font-weight: bold } /* Generic.Strong */
21 27
 .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
@@ -28,15 +34,15 @@
28 34
 .highlight .kt { color: #B00040 } /* Keyword.Type */
29 35
 .highlight .m { color: #666666 } /* Literal.Number */
30 36
 .highlight .s { color: #BA2121 } /* Literal.String */
31
-.highlight .na { color: #7D9029 } /* Name.Attribute */
37
+.highlight .na { color: #687822 } /* Name.Attribute */
32 38
 .highlight .nb { color: #008000 } /* Name.Builtin */
33 39
 .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
34 40
 .highlight .no { color: #880000 } /* Name.Constant */
35 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 44
 .highlight .nf { color: #0000FF } /* Name.Function */
39
-.highlight .nl { color: #A0A000 } /* Name.Label */
45
+.highlight .nl { color: #767600 } /* Name.Label */
40 46
 .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
41 47
 .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
42 48
 .highlight .nv { color: #19177C } /* Name.Variable */
@@ -53,11 +59,11 @@
53 59
 .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
54 60
 .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
55 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 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 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 67
 .highlight .s1 { color: #BA2121 } /* Literal.String.Single */
62 68
 .highlight .ss { color: #19177C } /* Literal.String.Symbol */
63 69
 .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */

+ 85
- 0
_docs_/_static/pygments_dark.css Ver fichero

@@ -0,0 +1,85 @@
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 Ver fichero

@@ -0,0 +1,21 @@
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 Ver fichero

@@ -4,22 +4,24 @@
4 4
  *
5 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 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 17
   var Scorer = {
17 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 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,423 +30,562 @@ if (!Scorer) {
28 30
     // or matches in the last dotted part of the object name
29 31
     objPartialMatch: 6,
30 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 38
     //  Used when the priority is not in the mapping.
35 39
     objPrioDefault: 0,
36 40
 
37 41
     // query found in title
38 42
     title: 15,
43
+    partialTitle: 7,
39 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 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 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 237
     pulse();
113 238
   },
114 239
 
115 240
   /**
116 241
    * perform a search for something (or wait until index is loaded)
117 242
    */
118
-  performSearch : function(query) {
243
+  performSearch: (query) => {
119 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 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 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 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 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 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 375
     // let the scorer override scores with a custom scoring function
204 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 409
     // for debugging
228 410
     //Search.lastresults = results.slice();  // a copy
229
-    //console.info('search results:', Search.lastresults);
411
+    // console.info("search results:", Search.lastresults);
230 412
 
231 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 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 485
     return results;
365 486
   },
366 487
 
367 488
   /**
368 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 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 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 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 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 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 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 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 590
     return results;
450 591
   },
@@ -452,30 +593,28 @@ var Search = {
452 593
   /**
453 594
    * helper function to return a node containing the
454 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 Ver fichero

@@ -0,0 +1,81 @@
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 Ver fichero

@@ -0,0 +1,154 @@
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 Ver fichero

@@ -0,0 +1,24 @@
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
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 225
- 179
_docs_/genindex.html Ver fichero

@@ -1,163 +1,162 @@
1
-
2
-
3
-
4 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 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 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 124
 <h1 id="index">Index</h1>
149 125
 
150 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 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 132
  | <a href="#P"><strong>P</strong></a>
155 133
  
156 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 143
 <h2 id="C">C</h2>
158 144
 <table style="width: 100%" class="indextable genindextable"><tr>
159 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 160
 </li>
162 161
   </ul></td>
163 162
 </tr></table>
@@ -170,11 +169,16 @@
170 169
   </ul></td>
171 170
 </tr></table>
172 171
 
173
-<h2 id="K">K</h2>
172
+<h2 id="M">M</h2>
174 173
 <table style="width: 100%" class="indextable genindextable"><tr>
175 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 180
 </li>
181
+      </ul></li>
178 182
   </ul></td>
179 183
 </tr></table>
180 184
 
@@ -192,50 +196,92 @@
192 196
 
193 197
 
194 198
 
195
-           </div>
196
-           
199
+            <div class="clearer"></div>
197 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 201
         </div>
222 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 287
 </html>

+ 516
- 466
_docs_/index.html
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


BIN
_docs_/objects.inv Ver fichero


+ 194
- 173
_docs_/py-modindex.html Ver fichero

@@ -1,152 +1,131 @@
1
-
2
-
3 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 17
     <link rel="index" title="Index" href="genindex.html" />
38 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 27
       DOCUMENTATION_OPTIONS.COLLAPSE_INDEX = true;
43 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 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 131
    <h1>Python Module Index</h1>
@@ -167,50 +146,92 @@
167 146
    </table>
168 147
 
169 148
 
170
-           </div>
171
-           
149
+            <div class="clearer"></div>
172 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 151
         </div>
197 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 237
 </html>

+ 0
- 0
_docs_/search.html Ver fichero


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio

Loading…
Cancelar
Guardar