home » zplus/dokk.org.git
Author zPlus <zplus@peers.community> 2023-07-08 04:57:06
Committer zPlus <zplus@peers.community> 2023-07-08 04:57:06
Commit fd076d6 (patch)
Tree 163a1b7
Parent(s)

Add Python Bottle app.


commits diff: 5396a98..fd076d6
25 files changed, 4063 insertions, 39 deletionsdownload


Diffstat
-rw-r--r-- .gitignore 2
-rwxr-xr-x app.py 462
-rw-r--r-- dokk.png 0
-rw-r--r-- dokk.svg 317
-rw-r--r-- favicon.ico 0
?--------- index.html 39
-rw-r--r-- requirements.txt 5
-rw-r--r-- static/css/asciidoctor.css 2420
-rw-r--r-- static/css/dokk.css 90
-rw-r--r-- static/css/mandoc.css 368
-rw-r--r-- templates/article.html 24
-rw-r--r-- templates/articles.html 21
-rw-r--r-- templates/base.html 12
-rw-r--r-- templates/index.html 33
-rw-r--r-- templates/library.html 32
-rw-r--r-- templates/library_item.html 37
-rw-r--r-- templates/license.html 22
-rw-r--r-- templates/licenses.html 17
-rw-r--r-- templates/manpage.html 24
-rw-r--r-- templates/manpage_disambiguation.html 40
-rw-r--r-- templates/manpages.html 29
-rw-r--r-- templates/manpages_distribution.html 27
-rw-r--r-- templates/manpages_package.html 28
-rw-r--r-- templates/mimi_and_eunice.html 16
-rw-r--r-- templates/mimi_and_eunice_strip.html 37

Diff options
View
Side
Whitespace
Context lines
Inter-hunk lines
+2/-0 M   .gitignore
index e69de29..4d43738
old size: 0B - new size: 18B
@@ -0,0 +1,2 @@
1 + __pycache__
2 + /venv

+462/-0 A   app.py
index 0000000..056a737
old size: 0B - new size: 12K
new file mode: -rwxr-xr-x
@@ -0,0 +1,462 @@
1 + #!/usr/bin/env python3
2 +
3 + import bottle
4 + import datetime
5 + import dateutil
6 + import functools
7 + import jinja2
8 + import pyld
9 + import re
10 + import requests
11 +
12 + from bottle import jinja2_template as template, request, response
13 + from string import Template
14 +
15 + # This only exists for exporting the bottle app object for a WSGI server such as Gunicorn
16 + application = bottle.app()
17 +
18 + # Directories to search for HTML templates
19 + bottle.TEMPLATE_PATH = [ './templates' ]
20 +
21 + def query(query_string, jsonld_frame=None):
22 + """
23 + Send query to Fuseki via HTTP.
24 + Return the query results.
25 + """
26 +
27 + http_request = requests.post(
28 + 'http://localhost:7000/dokk',
29 + data = { 'format': 'json', 'query': query_string})
30 +
31 + results = http_request.json()
32 +
33 + if jsonld_frame:
34 + results = pyld.jsonld.frame(results, jsonld_frame, options={'omitGraph':False})
35 +
36 + return results
37 +
38 + def human_size(bytes, B=False):
39 + """
40 + Convert a file size in bytes to a human friendly form.
41 + This is only used in templates when showing file sizes.
42 + """
43 +
44 + for unit in [ 'B' if B else '', 'K', 'M', 'G', 'T', 'P' ]:
45 + if bytes < 1024: break
46 + bytes = bytes / 1024
47 +
48 + return '{}{}'.format(round(bytes), unit).rjust(5)
49 +
50 + template = functools.partial(template, template_settings = {
51 + 'filters': {
52 + 'datetime': lambda date: dateutil.parser.parse(date).strftime('%b %-d, %Y - %H:%M%z%Z'),
53 + 'human_size': human_size
54 + },
55 + 'globals': {
56 + 'now': lambda: datetime.datetime.now(datetime.timezone.utc),
57 + 'request': request,
58 + 'url': application.get_url,
59 + },
60 + 'autoescape': True
61 + })
62 +
63 + @bottle.error(404)
64 + def error404(error):
65 + """
66 + Custom 404 page.
67 +
68 + :param error: bottle.HTTPError given by Bottle when calling abort(404).
69 + """
70 +
71 + return '[404] {}'.format(error.body)
72 +
73 + @bottle.get('/static/<filename:path>', name='static')
74 + def static(filename):
75 + """
76 + Path for serving static files.
77 + """
78 +
79 + return bottle.static_file(filename, root='./static/')
80 +
81 + @bottle.get('/', name='homepage')
82 + def homepage():
83 + """
84 + """
85 +
86 + return template('index.html')
87 +
88 + @bottle.get('/library', name='library')
89 + def library():
90 + """
91 + """
92 +
93 + data = query(
94 + '''
95 + PREFIX library: <dokk:library:>
96 + PREFIX license: <dokk:license:>
97 +
98 + CONSTRUCT {
99 + ?item library:title ?title;
100 + library:author ?author ;
101 + library:license ?license .
102 + ?license license:id ?license_id ;
103 + license:name ?license_name .
104 + }
105 + WHERE {
106 + ?item library:title ?title ;
107 + library:author ?author ;
108 + library:license ?license .
109 +
110 + OPTIONAL {
111 + ?license license:id ?license_id_optional ;
112 + license:name ?license_name_optional .
113 + }
114 +
115 + BIND(COALESCE(?license_id_optional, SUBSTR(STR(?license), 14)) AS ?license_id)
116 + BIND(COALESCE(?license_name_optional, SUBSTR(STR(?license), 14)) AS ?license_name)
117 + }
118 + ORDER BY UCASE(?title)
119 + ''',
120 + {
121 + '@context': {
122 + 'library': 'dokk:library:',
123 + 'license': 'dokk:license:',
124 + 'library:author': { '@container': '@set' },
125 + 'library:license': { '@container': '@set' }
126 + },
127 + 'library:title': {}
128 + })
129 +
130 + return template('library.html', data=data)
131 +
132 + @bottle.get('/library/<item_id>', name='library_item')
133 + def library_item(item_id):
134 + """
135 + """
136 +
137 + item_iri = '<dokk:library:' + item_id + '>'
138 +
139 + try:
140 + with open('../blob.dokk.org/pdf_to_text/' + item_id + '.txt', 'r') as file:
141 + item_plaintext = file.read()
142 + except:
143 + item_plaintext = ''
144 +
145 + data = query(f'''
146 + PREFIX library: <dokk:library:>
147 + PREFIX license: <dokk:license:>
148 +
149 + CONSTRUCT {{
150 + ?item library:title ?title ;
151 + library:author ?author ;
152 + library:license ?license .
153 +
154 + ?license license:id ?license_id ;
155 + license:name ?license_name .
156 + }}
157 + WHERE {{
158 + ?item
159 + library:title ?title ;
160 + library:author ?author ;
161 + library:license ?license .
162 +
163 + FILTER (?item = {item_iri})
164 +
165 + OPTIONAL {{
166 + ?license license:id ?license_id_optional ;
167 + license:name ?license_name_optional .
168 + }}
169 +
170 + BIND(COALESCE(?license_id_optional, SUBSTR(STR(?license), 14)) AS ?license_id)
171 + BIND(COALESCE(?license_name_optional, SUBSTR(STR(?license), 14)) AS ?license_name)
172 + }}
173 + ''',
174 + {
175 + '@context': {
176 + 'library': 'dokk:library:',
177 + 'license': 'dokk:license:',
178 + 'library:author': { '@container': '@set' },
179 + 'library:license': { '@container': '@set' }
180 + },
181 + 'library:title': {}
182 + })
183 +
184 + return template('library_item.html', data=data['@graph'][0], item_id=item_id, plaintext=item_plaintext)
185 +
186 + @bottle.get('/license', name='licenses')
187 + def licenses():
188 + """
189 + """
190 +
191 + data = query(
192 + '''
193 + PREFIX license: <dokk:license:>
194 +
195 + SELECT *
196 + WHERE {
197 + ?license license:id ?id ;
198 + license:name ?name.
199 + }
200 + ORDER BY ASC(UCASE(?name))
201 + ''')
202 +
203 + return template('licenses.html', data=data)
204 +
205 + @bottle.get('/manpages', name='manpages')
206 + def manpages():
207 + """
208 + """
209 +
210 + data = query(
211 + '''
212 + PREFIX mp: <dokk:manpages:>
213 +
214 + SELECT DISTINCT ?distribution ?version
215 + WHERE {
216 + [] mp:source [
217 + mp:distribution_version ?version ;
218 + mp:distribution_name ?distribution ;
219 + ] .
220 + }
221 + ORDER BY ?distribution ?version
222 + ''')
223 +
224 + return template('manpages.html', data=data)
225 +
226 + @bottle.get('/manpages/<distribution>/<version>', name='manpages_distribution')
227 + def manpages_distribution(distribution, version):
228 + """
229 + List packages by distribution.
230 + """
231 +
232 + data = query(
233 + f'''
234 + PREFIX mp: <dokk:manpages:>
235 +
236 + SELECT DISTINCT ?package
237 + WHERE {{
238 + ?id mp:source [
239 + mp:distribution_name "{distribution}" ;
240 + mp:distribution_version "{version}" ;
241 + mp:package ?package ;
242 + ] .
243 + }}
244 + ORDER BY ?package
245 + ''')
246 +
247 + return template('manpages_distribution.html', data=data, distribution=distribution, version=version)
248 +
249 + @bottle.get('/manpages/<distribution>/<version>/<package>', name='manpages_package')
250 + def manpages_package(distribution, version, package):
251 + """
252 + List manpages by package.
253 + """
254 +
255 + data = query(
256 + f'''
257 + PREFIX mp: <dokk:manpages:>
258 +
259 + SELECT ?id ?filename
260 + WHERE {{
261 + ?id mp:source [
262 + mp:package "{package}" ;
263 + mp:distribution_version "{version}" ;
264 + mp:distribution_name "{distribution}" ;
265 + mp:filename ?filename ;
266 + ] .
267 + }}
268 + ORDER BY ?filename
269 + ''')
270 +
271 + return template('manpages_package.html', data=data, distribution=distribution, version=version, package=package)
272 +
273 + @bottle.get('/manpages/<distribution>/<version>/<package>/<name>.<section>.<lang>', name='manpages_page')
274 + def manpages_page(distribution, version, package, name, section, lang):
275 + """
276 + Display a single manpage.
277 + """
278 +
279 + page_id = f'<dokk:manpages:{distribution}/{version}/{package}/{name}.{section}.{lang}>'
280 +
281 + # These characters where url-encoded when creating the RDF data because they
282 + # make invalid URIs. This means for example that in the graph the URIs will be
283 + # encoded with %23 instead of #
284 + page_id = page_id.replace(' ', '_') \
285 + .replace('[', '%5B') \
286 + .replace(']', '%5D') \
287 + .replace('#', '%23')
288 +
289 + data = query(
290 + f'''
291 + PREFIX mp: <dokk:manpages:>
292 +
293 + DESCRIBE {page_id}
294 + ''',
295 + {
296 + '@context': {
297 + 'mp': 'dokk:manpages:',
298 + },
299 + 'mp:source': {},
300 + })
301 +
302 + # Replace references to other manpages with links.
303 + # Manpages have a section "See also" at the bottom where they suggest other pages.
304 + # For example:
305 + # SEE ALSO
306 + # cdk(3), cdk_screen(3), cdk_display(3), cdk_binding(3), cdk_util(3)
307 + # We convert these strings to links to other pages.
308 + # Example: ls(1) -> <a href="...">ls(1)</a>
309 + # regex explanation:
310 + # - some manpages use a bold or italic name, so we match an optional <b>
311 + # <i> tag
312 + # - match valid characters for a manpage, assign name <page>
313 + # - match optional closing </em> or </strong> tags
314 + # - match '('
315 + # - match number, assign name <section>
316 + # - match ')'
317 + html = data['@graph'][0]['mp:html']
318 + html = re.sub (
319 + '(?:<b>|<i>)?(?P<page>[\w_.:-]+)(?:</b>|</i>)?\((?P<section>[0-9]\w*)\)',
320 + lambda match:
321 + f'''<a href="{application.get_url('manpages_disambiguation',
322 + name=match.group('page'), section=match.group('section')).lower()}"
323 + >{match.group('page')}({match.group('section')})</a>''',
324 + html)
325 +
326 + data['@graph'][0]['mp:html'] = html
327 +
328 + return template('manpage.html', data=data['@graph'][0], distribution=distribution,
329 + version=version, package=package, name=name, section=section, lang=lang)
330 +
331 + @bottle.get('/manpages/<name>.<section>', name='manpages_disambiguation')
332 + def manpages_disambiguation(name, section):
333 + """
334 + Show a list of manpages that match <name> and <section>
335 + """
336 +
337 + data = query(
338 + f'''
339 + PREFIX mp: <dokk:manpages:>
340 +
341 + DESCRIBE ?page
342 + WHERE {{
343 + ?page mp:name_lowercase "{name}" ;
344 + mp:section_lowercase "{section}" .
345 + }}
346 + ''',
347 + {
348 + '@context': {
349 + 'mp': 'dokk:manpages:',
350 + },
351 + 'mp:source': {},
352 + })
353 +
354 + return template('manpage_disambiguation.html', name=name, section=section, data=data)
355 +
356 + @bottle.get('/license/<id>', name='license')
357 + def license(id):
358 + """
359 + """
360 +
361 + license_iri = 'license:' + id
362 +
363 + data = query(Template(
364 + '''
365 + PREFIX license: <dokk:license:>
366 +
367 + DESCRIBE $license
368 + ''').substitute(license=license_iri))
369 +
370 + return template('license.html', data=data)
371 +
372 + @bottle.get('/mimi_and_eunice', name='mimi_and_eunice')
373 + def mimi_and_eunice():
374 + """
375 + """
376 +
377 + data = query(
378 + '''
379 + PREFIX mimi_eunice: <dokk:mimi_and_eunice:>
380 + PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
381 +
382 + SELECT ?number ?title
383 + WHERE {
384 + ?id mimi_eunice:title ?title .
385 + BIND (SUBSTR(STR(?id), 22) as ?number)
386 + }
387 + ORDER BY ?number
388 + ''')
389 +
390 + return template('mimi_and_eunice.html', data=data)
391 +
392 + @bottle.get('/mimi_and_eunice/<number>', name='mimi_and_eunice_strip')
393 + def mimi_and_eunice_strip(number):
394 + """
395 + """
396 +
397 + iri = '<dokk:mimi_and_eunice:' + number + '>'
398 +
399 + data = query(Template(
400 + '''
401 + PREFIX license: <dokk:license:>
402 + PREFIX mimi_eunice: <dokk:mimi_and_eunice:>
403 +
404 + DESCRIBE $iri ?license
405 + WHERE {
406 + $iri mimi_eunice:license ?license
407 + }
408 + ''').substitute(iri=iri),
409 + {
410 + '@context': {
411 + 'license': 'dokk:license:',
412 + 'mimi_eunice': 'dokk:mimi_and_eunice:',
413 + 'mimi_eunice:tag': { '@container': '@set' },
414 + 'mimi_eunice:transcript': { '@container': '@set' }
415 + },
416 + 'mimi_eunice:license': {},
417 + 'mimi_eunice:transcript': {
418 + 'mimi_eunice:order': {}
419 + }
420 + })
421 +
422 + return template('mimi_and_eunice_strip.html', data=data['@graph'][0])
423 +
424 + @bottle.get('/articles', name='articles')
425 + def articles():
426 + """
427 + """
428 +
429 + data = query(
430 + '''
431 + PREFIX : <dokk:articles:>
432 +
433 + SELECT ?iri ?title
434 + WHERE {
435 + ?iri :title ?title
436 + }
437 + ORDER BY ?title
438 + ''')
439 +
440 + return template('articles.html', data=data)
441 +
442 + @bottle.get('/<id>', name='article')
443 + def article(id):
444 + """
445 + """
446 +
447 + data = query(
448 + f'''
449 + PREFIX : <dokk:articles:>
450 +
451 + DESCRIBE <dokk:articles:{id}>
452 + ''',
453 + {
454 + '@context': {
455 + 'a': 'dokk:articles:'
456 + }
457 + })
458 +
459 + if '@graph' not in data or len(data['@graph']) < 1:
460 + bottle.abort(404, "Article doesn't exist.")
461 +
462 + return template('article.html', data=data['@graph'][0])

+0/-0 A   dokk.png
index 0000000..126555a
old size: 0B - new size: 3K
new file mode: -rw-r--r--
Binary file

+317/-0 A   dokk.svg
index 0000000..ccc56b4
old size: 0B - new size: 10K
new file mode: -rw-r--r--
@@ -0,0 +1,317 @@
1 + <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 + <!-- Created with Inkscape (http://www.inkscape.org/) -->
3 +
4 + <svg
5 + xmlns:dc="http://purl.org/dc/elements/1.1/"
6 + xmlns:cc="http://creativecommons.org/ns#"
7 + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 + xmlns:svg="http://www.w3.org/2000/svg"
9 + xmlns="http://www.w3.org/2000/svg"
10 + xmlns:xlink="http://www.w3.org/1999/xlink"
11 + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12 + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13 + width="256mm"
14 + height="256mm"
15 + viewBox="0 0 256 256"
16 + version="1.1"
17 + id="svg8"
18 + inkscape:version="0.92.1 r15371"
19 + sodipodi:docname="dokk.svg">
20 + <defs
21 + id="defs2">
22 + <linearGradient
23 + inkscape:collect="always"
24 + id="linearGradient7722">
25 + <stop
26 + style="stop-color:#960018;stop-opacity:1"
27 + offset="0"
28 + id="stop7718" />
29 + <stop
30 + style="stop-color:#960018;stop-opacity:1"
31 + offset="1"
32 + id="stop7720" />
33 + </linearGradient>
34 + <linearGradient
35 + id="linearGradient7668"
36 + inkscape:collect="always">
37 + <stop
38 + id="stop7656"
39 + offset="0"
40 + style="stop-color:#800000;stop-opacity:1" />
41 + <stop
42 + style="stop-color:#800000;stop-opacity:1"
43 + offset="0.2944124"
44 + id="stop7658" />
45 + <stop
46 + style="stop-color:#800000;stop-opacity:1"
47 + offset="0.49397635"
48 + id="stop7660" />
49 + <stop
50 + id="stop7662"
51 + offset="0.59749377"
52 + style="stop-color:#800000;stop-opacity:1" />
53 + <stop
54 + style="stop-color:#800000;stop-opacity:1"
55 + offset="0.76509178"
56 + id="stop7664" />
57 + <stop
58 + id="stop7666"
59 + offset="1"
60 + style="stop-color:#800000;stop-opacity:1" />
61 + </linearGradient>
62 + <linearGradient
63 + inkscape:collect="always"
64 + id="linearGradient6754">
65 + <stop
66 + style="stop-color:#ff0000;stop-opacity:1"
67 + offset="0"
68 + id="stop6750" />
69 + <stop
70 + id="stop7614"
71 + offset="0.21580039"
72 + style="stop-color:#ffffff;stop-opacity:1" />
73 + <stop
74 + id="stop7604"
75 + offset="0.42594036"
76 + style="stop-color:#ffaaaa;stop-opacity:1" />
77 + <stop
78 + style="stop-color:#ffff00;stop-opacity:1"
79 + offset="0.64945233"
80 + id="stop7610" />
81 + <stop
82 + id="stop7612"
83 + offset="0.84571576"
84 + style="stop-color:#e9c6af;stop-opacity:1" />
85 + <stop
86 + style="stop-color:#ff00ff;stop-opacity:1"
87 + offset="1"
88 + id="stop6752" />
89 + </linearGradient>
90 + <linearGradient
91 + inkscape:collect="always"
92 + xlink:href="#linearGradient6754"
93 + id="linearGradient6756"
94 + x1="-4.2763124"
95 + y1="261.3454"
96 + x2="260.32053"
97 + y2="-1.6478174"
98 + gradientUnits="userSpaceOnUse" />
99 + <mask
100 + maskUnits="userSpaceOnUse"
101 + id="mask7616">
102 + <g
103 + id="g7652">
104 + <circle
105 + r="38.486809"
106 + cy="88.689285"
107 + cx="53.453903"
108 + id="circle7618"
109 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" />
110 + <circle
111 + r="33.94323"
112 + cy="217.78046"
113 + cx="105.03693"
114 + id="circle7620"
115 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" />
116 + <circle
117 + r="25.925144"
118 + cy="165.39563"
119 + cx="36.081387"
120 + id="circle7622"
121 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" />
122 + <circle
123 + r="35.546844"
124 + cy="83.076622"
125 + cx="194.83949"
126 + id="circle7624"
127 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.1708232" />
128 + <circle
129 + r="9.3544331"
130 + cy="30.157255"
131 + cx="178.26877"
132 + id="circle7626"
133 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" />
134 + <circle
135 + r="17.372519"
136 + cy="24.277325"
137 + cx="119.46947"
138 + id="circle7628"
139 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" />
140 + <circle
141 + r="7.4835467"
142 + cy="31.493601"
143 + cx="69.490074"
144 + id="circle7630"
145 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" />
146 + <circle
147 + r="18.174328"
148 + cy="216.44412"
149 + cx="184.9505"
150 + id="circle7632"
151 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" />
152 + <circle
153 + r="20.045216"
154 + cy="139.20323"
155 + cx="115.72771"
156 + id="circle7634"
157 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" />
158 + <circle
159 + r="8.5526247"
160 + cy="188.11354"
161 + cx="227.71362"
162 + id="circle7636"
163 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" />
164 + <circle
165 + r="10.423512"
166 + cy="72.385841"
167 + cx="119.46948"
168 + id="circle7638"
169 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" />
170 + <circle
171 + r="20.847023"
172 + cy="148.55766"
173 + cx="226.64456"
174 + id="circle7640"
175 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" />
176 + <circle
177 + r="14.165285"
178 + cy="158.44662"
179 + cx="170.25069"
180 + id="circle7642"
181 + style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" />
182 + <path
183 + inkscape:connector-curvature="0"
184 + id="path7644"
185 + d="M 119.73675,21.871901 51.850287,87.085664 35.279578,168.3356"
186 + style="fill:none;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
187 + <path
188 + inkscape:connector-curvature="0"
189 + id="path7646"
190 + d="M 51.850287,87.085664 117.59859,140.00503"
191 + style="fill:none;stroke:#ffffff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
192 + <path
193 + sodipodi:nodetypes="ccc"
194 + inkscape:connector-curvature="0"
195 + id="path7648"
196 + d="m 192.43406,75.325805 37.41773,77.508165 -44.36674,66.28284"
197 + style="fill:none;stroke:#ffffff;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
198 + <path
199 + inkscape:connector-curvature="0"
200 + id="path7650"
201 + d="m 104.23511,218.58227 64.67923,-61.47199"
202 + style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
203 + </g>
204 + </mask>
205 + <linearGradient
206 + inkscape:collect="always"
207 + xlink:href="#linearGradient7668"
208 + id="linearGradient7654"
209 + gradientUnits="userSpaceOnUse"
210 + x1="15.501633"
211 + y1="181.69908"
212 + x2="234.66266"
213 + y2="58.755096" />
214 + <linearGradient
215 + inkscape:collect="always"
216 + xlink:href="#linearGradient6754"
217 + id="linearGradient7698"
218 + x1="-4.2763124"
219 + y1="129.8488"
220 + x2="260.32053"
221 + y2="129.8488"
222 + gradientUnits="userSpaceOnUse" />
223 + <linearGradient
224 + inkscape:collect="always"
225 + xlink:href="#linearGradient7722"
226 + id="linearGradient7724"
227 + x1="6.949008"
228 + y1="251.72371"
229 + x2="249.0952"
230 + y2="5.8357401"
231 + gradientUnits="userSpaceOnUse" />
232 + </defs>
233 + <sodipodi:namedview
234 + id="base"
235 + pagecolor="#ffffff"
236 + bordercolor="#666666"
237 + borderopacity="1.0"
238 + inkscape:pageopacity="0.0"
239 + inkscape:pageshadow="2"
240 + inkscape:zoom="0.49497475"
241 + inkscape:cx="337.61577"
242 + inkscape:cy="490.99178"
243 + inkscape:document-units="mm"
244 + inkscape:current-layer="layer4"
245 + showgrid="false"
246 + inkscape:pagecheckerboard="true"
247 + inkscape:window-width="1366"
248 + inkscape:window-height="730"
249 + inkscape:window-x="0"
250 + inkscape:window-y="38"
251 + inkscape:window-maximized="0" />
252 + <metadata
253 + id="metadata5">
254 + <rdf:RDF>
255 + <cc:Work
256 + rdf:about="">
257 + <dc:format>image/svg+xml</dc:format>
258 + <dc:type
259 + rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
260 + <dc:title></dc:title>
261 + <cc:license
262 + rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
263 + </cc:Work>
264 + <cc:License
265 + rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
266 + <cc:permits
267 + rdf:resource="http://creativecommons.org/ns#Reproduction" />
268 + <cc:permits
269 + rdf:resource="http://creativecommons.org/ns#Distribution" />
270 + <cc:requires
271 + rdf:resource="http://creativecommons.org/ns#Notice" />
272 + <cc:requires
273 + rdf:resource="http://creativecommons.org/ns#Attribution" />
274 + <cc:permits
275 + rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
276 + <cc:requires
277 + rdf:resource="http://creativecommons.org/ns#ShareAlike" />
278 + </cc:License>
279 + </rdf:RDF>
280 + </metadata>
281 + <g
282 + inkscape:label="Boundaries"
283 + inkscape:groupmode="layer"
284 + id="layer1"
285 + transform="translate(0,-41)"
286 + sodipodi:insensitive="true"
287 + style="display:none">
288 + <circle
289 + style="opacity:1;fill:#00ff00;fill-opacity:1;stroke-width:0.26458332"
290 + id="path4504"
291 + cx="129.09119"
292 + cy="170.58151"
293 + r="126.95302" />
294 + </g>
295 + <g
296 + inkscape:groupmode="layer"
297 + id="layer4"
298 + inkscape:label="Gradient"
299 + style="display:inline">
300 + <rect
301 + style="opacity:1;fill:url(#linearGradient7724);fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-rule:nonzero"
302 + id="rect6681"
303 + width="264.59683"
304 + height="262.99323"
305 + x="-4.2763124"
306 + y="-1.6478174"
307 + mask="url(#mask7616)"
308 + inkscape:export-xdpi="6.1399999"
309 + inkscape:export-ydpi="6.1399999"
310 + inkscape:export-filename="/home/zplus/zPlus/projects/dokk/dokk.org/website/dokk/static/dokk.png" />
311 + </g>
312 + <g
313 + inkscape:groupmode="layer"
314 + id="layer3"
315 + inkscape:label="Nodes"
316 + style="display:inline" />
317 + </svg>

+0/-0 A   favicon.ico
index 0000000..84562f6
old size: 0B - new size: 17K
new file mode: -rw-r--r--
Binary file

+0/-39 D   index.html
index 715fa78..0000000
old size: 1K - new size: 0B
deleted file mode: -rw-r--r--
@@ -1,39 +0,0 @@
1 - <!DOCTYPE html>
2 - <html lang="en">
3 - <head>
4 - <meta charset="utf-8">
5 - <meta name="viewport" content="width=device-width, initial-scale=1">
6 - <title>DOKK</title>
7 -
8 - <style>
9 - html, body {
10 -
11 - font-size: 1rem;
12 - height: 100%;
13 - margin: 0;
14 - padding: 0;
15 - width: 100%;
16 - }
17 -
18 - body {
19 - padding: 1% 5%;
20 - }
21 - </style>
22 - </head>
23 - <body>
24 - <p>
25 - <i>DOKK</i> is a free, community-curated data repository.
26 - </p>
27 - <p>
28 - Join the
29 - <a href="https://clif.peers.community/dokk/dokk.mlist">mailing list</a>
30 - or download the
31 - <a href="https://clif.peers.community/dokk/data.git">data</a>,
32 - and participate to create a free database of the world's knowledge.
33 - Let's build it together!
34 -
35 - <br /><br /><br /><br />
36 - IRC: #<a href="https://peers.community">peers</a> at irc.libera.chat
37 - </p>
38 - </body>
39 - </html>

+5/-0 A   requirements.txt
index 0000000..1e37561
old size: 0B - new size: 44B
new file mode: -rw-r--r--
@@ -0,0 +1,5 @@
1 + bottle
2 + jinja2
3 + pyld
4 + python-dateutil
5 + requests

+2420/-0 A   static/css/asciidoctor.css
index 0000000..6b63163
old size: 0B - new size: 35K
new file mode: -rw-r--r--
@@ -0,0 +1,2420 @@
1 + /*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
2 + /* Uncomment the following line when using as a custom stylesheet */
3 + /* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
4 + html {
5 + font-family: sans-serif;
6 + -webkit-text-size-adjust: 100%;
7 + }
8 +
9 + a {
10 + background: none;
11 + }
12 +
13 + a:focus {
14 + outline: thin dotted;
15 + }
16 +
17 + a:active,
18 + a:hover {
19 + outline: 0;
20 + }
21 +
22 + h1 {
23 + font-size: 2em;
24 + margin: 0.67em 0;
25 + }
26 +
27 + b,
28 + strong {
29 + font-weight: bold;
30 + }
31 +
32 + abbr {
33 + font-size: 0.9em;
34 + }
35 +
36 + abbr[title] {
37 + cursor: help;
38 + border-bottom: 1px dotted #dddddf;
39 + text-decoration: none;
40 + }
41 +
42 + dfn {
43 + font-style: italic;
44 + }
45 +
46 + hr {
47 + height: 0;
48 + }
49 +
50 + mark {
51 + background: #ff0;
52 + color: #000;
53 + }
54 +
55 + code,
56 + kbd,
57 + pre,
58 + samp {
59 + font-family: monospace;
60 + font-size: 1em;
61 + }
62 +
63 + pre {
64 + white-space: pre-wrap;
65 + }
66 +
67 + q {
68 + quotes: "\201C" "\201D" "\2018" "\2019";
69 + }
70 +
71 + small {
72 + font-size: 80%;
73 + }
74 +
75 + sub,
76 + sup {
77 + font-size: 75%;
78 + line-height: 0;
79 + position: relative;
80 + vertical-align: baseline;
81 + }
82 +
83 + sup {
84 + top: -0.5em;
85 + }
86 +
87 + sub {
88 + bottom: -0.25em;
89 + }
90 +
91 + img {
92 + border: 0;
93 + }
94 +
95 + svg:not(:root) {
96 + overflow: hidden;
97 + }
98 +
99 + figure {
100 + margin: 0;
101 + }
102 +
103 + audio,
104 + video {
105 + display: inline-block;
106 + }
107 +
108 + audio:not([controls]) {
109 + display: none;
110 + height: 0;
111 + }
112 +
113 + fieldset {
114 + border: 1px solid silver;
115 + margin: 0 2px;
116 + padding: 0.35em 0.625em 0.75em;
117 + }
118 +
119 + legend {
120 + border: 0;
121 + padding: 0;
122 + }
123 +
124 + button,
125 + input,
126 + select,
127 + textarea {
128 + font-family: inherit;
129 + font-size: 100%;
130 + margin: 0;
131 + }
132 +
133 + button,
134 + input {
135 + line-height: normal;
136 + }
137 +
138 + button,
139 + select {
140 + text-transform: none;
141 + }
142 +
143 + button,
144 + html input[type=button],
145 + input[type=reset],
146 + input[type=submit] {
147 + -webkit-appearance: button;
148 + cursor: pointer;
149 + }
150 +
151 + button[disabled],
152 + html input[disabled] {
153 + cursor: default;
154 + }
155 +
156 + input[type=checkbox],
157 + input[type=radio] {
158 + padding: 0;
159 + }
160 +
161 + button::-moz-focus-inner,
162 + input::-moz-focus-inner {
163 + border: 0;
164 + padding: 0;
165 + }
166 +
167 + textarea {
168 + overflow: auto;
169 + vertical-align: top;
170 + }
171 +
172 + table {
173 + border-collapse: collapse;
174 + border-spacing: 0;
175 + }
176 +
177 + *,
178 + ::before,
179 + ::after {
180 + box-sizing: border-box;
181 + }
182 +
183 + html,
184 + body {
185 + font-size: 100%;
186 + }
187 +
188 + body {
189 + background: #fff;
190 + color: rgba(0, 0, 0, 0.8);
191 + padding: 0;
192 + margin: 0;
193 + font-family: "Noto Serif", "DejaVu Serif", serif;
194 + line-height: 1;
195 + position: relative;
196 + cursor: auto;
197 + tab-size: 4;
198 + word-wrap: anywhere;
199 + -moz-osx-font-smoothing: grayscale;
200 + -webkit-font-smoothing: antialiased;
201 + }
202 +
203 + a:hover {
204 + cursor: pointer;
205 + }
206 +
207 + img,
208 + object,
209 + embed {
210 + max-width: 100%;
211 + height: auto;
212 + }
213 +
214 + object,
215 + embed {
216 + height: 100%;
217 + }
218 +
219 + img {
220 + -ms-interpolation-mode: bicubic;
221 + }
222 +
223 + .left {
224 + float: left !important;
225 + }
226 +
227 + .right {
228 + float: right !important;
229 + }
230 +
231 + .text-left {
232 + text-align: left !important;
233 + }
234 +
235 + .text-right {
236 + text-align: right !important;
237 + }
238 +
239 + .text-center {
240 + text-align: center !important;
241 + }
242 +
243 + .text-justify {
244 + text-align: justify !important;
245 + }
246 +
247 + .hide {
248 + display: none;
249 + }
250 +
251 + img,
252 + object,
253 + svg {
254 + display: inline-block;
255 + vertical-align: middle;
256 + }
257 +
258 + textarea {
259 + height: auto;
260 + min-height: 50px;
261 + }
262 +
263 + select {
264 + width: 100%;
265 + }
266 +
267 + .subheader,
268 + .admonitionblock td.content > .title,
269 + .audioblock > .title,
270 + .exampleblock > .title,
271 + .imageblock > .title,
272 + .listingblock > .title,
273 + .literalblock > .title,
274 + .stemblock > .title,
275 + .openblock > .title,
276 + .paragraph > .title,
277 + .quoteblock > .title,
278 + table.tableblock > .title,
279 + .verseblock > .title,
280 + .videoblock > .title,
281 + .dlist > .title,
282 + .olist > .title,
283 + .ulist > .title,
284 + .qlist > .title,
285 + .hdlist > .title {
286 + line-height: 1.45;
287 + color: #7a2518;
288 + font-weight: 400;
289 + margin-top: 0;
290 + margin-bottom: 0.25em;
291 + }
292 +
293 + div,
294 + dl,
295 + dt,
296 + dd,
297 + ul,
298 + ol,
299 + li,
300 + h1,
301 + h2,
302 + h3,
303 + #toctitle,
304 + .sidebarblock > .content > .title,
305 + h4,
306 + h5,
307 + h6,
308 + pre,
309 + form,
310 + p,
311 + blockquote,
312 + th,
313 + td {
314 + margin: 0;
315 + padding: 0;
316 + }
317 +
318 + a {
319 + color: #2156a5;
320 + text-decoration: underline;
321 + line-height: inherit;
322 + }
323 +
324 + a:hover,
325 + a:focus {
326 + color: #1d4b8f;
327 + }
328 +
329 + a img {
330 + border: 0;
331 + }
332 +
333 + p {
334 + line-height: 1.6;
335 + margin-bottom: 1.25em;
336 + text-rendering: optimizeLegibility;
337 + }
338 +
339 + p aside {
340 + font-size: 0.875em;
341 + line-height: 1.35;
342 + font-style: italic;
343 + }
344 +
345 + h1,
346 + h2,
347 + h3,
348 + #toctitle,
349 + .sidebarblock > .content > .title,
350 + h4,
351 + h5,
352 + h6 {
353 + font-family: "Open Sans", "DejaVu Sans", sans-serif;
354 + font-weight: 300;
355 + font-style: normal;
356 + color: #ba3925;
357 + text-rendering: optimizeLegibility;
358 + margin-top: 1em;
359 + margin-bottom: 0.5em;
360 + line-height: 1.0125em;
361 + }
362 +
363 + h1 small,
364 + h2 small,
365 + h3 small,
366 + #toctitle small,
367 + .sidebarblock > .content > .title small,
368 + h4 small,
369 + h5 small,
370 + h6 small {
371 + font-size: 60%;
372 + color: #e99b8f;
373 + line-height: 0;
374 + }
375 +
376 + h1 {
377 + font-size: 2.125em;
378 + }
379 +
380 + h2 {
381 + font-size: 1.6875em;
382 + }
383 +
384 + h3,
385 + #toctitle,
386 + .sidebarblock > .content > .title {
387 + font-size: 1.375em;
388 + }
389 +
390 + h4,
391 + h5 {
392 + font-size: 1.125em;
393 + }
394 +
395 + h6 {
396 + font-size: 1em;
397 + }
398 +
399 + hr {
400 + border: solid #dddddf;
401 + border-width: 1px 0 0;
402 + clear: both;
403 + margin: 1.25em 0 1.1875em;
404 + }
405 +
406 + em,
407 + i {
408 + font-style: italic;
409 + line-height: inherit;
410 + }
411 +
412 + strong,
413 + b {
414 + font-weight: bold;
415 + line-height: inherit;
416 + }
417 +
418 + small {
419 + font-size: 60%;
420 + line-height: inherit;
421 + }
422 +
423 + code {
424 + font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace;
425 + font-weight: 400;
426 + color: rgba(0, 0, 0, 0.9);
427 + }
428 +
429 + ul,
430 + ol,
431 + dl {
432 + line-height: 1.6;
433 + margin-bottom: 1.25em;
434 + list-style-position: outside;
435 + font-family: inherit;
436 + }
437 +
438 + ul,
439 + ol {
440 + margin-left: 1.5em;
441 + }
442 +
443 + ul li ul,
444 + ul li ol {
445 + margin-left: 1.25em;
446 + margin-bottom: 0;
447 + }
448 +
449 + ul.circle {
450 + list-style-type: circle;
451 + }
452 +
453 + ul.disc {
454 + list-style-type: disc;
455 + }
456 +
457 + ul.square {
458 + list-style-type: square;
459 + }
460 +
461 + ul.circle ul:not([class]),
462 + ul.disc ul:not([class]),
463 + ul.square ul:not([class]) {
464 + list-style: inherit;
465 + }
466 +
467 + ol li ul,
468 + ol li ol {
469 + margin-left: 1.25em;
470 + margin-bottom: 0;
471 + }
472 +
473 + dl dt {
474 + margin-bottom: 0.3125em;
475 + font-weight: bold;
476 + }
477 +
478 + dl dd {
479 + margin-bottom: 1.25em;
480 + }
481 +
482 + blockquote {
483 + margin: 0 0 1.25em;
484 + padding: 0.5625em 1.25em 0 1.1875em;
485 + border-left: 1px solid #ddd;
486 + }
487 +
488 + blockquote,
489 + blockquote p {
490 + line-height: 1.6;
491 + color: rgba(0, 0, 0, 0.85);
492 + }
493 +
494 + @media screen and (min-width: 768px) {
495 + h1,
496 + h2,
497 + h3,
498 + #toctitle,
499 + .sidebarblock > .content > .title,
500 + h4,
501 + h5,
502 + h6 {
503 + line-height: 1.2;
504 + }
505 +
506 + h1 {
507 + font-size: 2.75em;
508 + }
509 +
510 + h2 {
511 + font-size: 2.3125em;
512 + }
513 +
514 + h3,
515 + #toctitle,
516 + .sidebarblock > .content > .title {
517 + font-size: 1.6875em;
518 + }
519 +
520 + h4 {
521 + font-size: 1.4375em;
522 + }
523 + }
524 +
525 + table {
526 + background: #fff;
527 + margin-bottom: 1.25em;
528 + border: 1px solid #dedede;
529 + word-wrap: normal;
530 + }
531 +
532 + table thead,
533 + table tfoot {
534 + background: #f7f8f7;
535 + }
536 +
537 + table thead tr th,
538 + table thead tr td,
539 + table tfoot tr th,
540 + table tfoot tr td {
541 + padding: 0.5em 0.625em 0.625em;
542 + font-size: inherit;
543 + color: rgba(0, 0, 0, 0.8);
544 + text-align: left;
545 + }
546 +
547 + table tr th,
548 + table tr td {
549 + padding: 0.5625em 0.625em;
550 + font-size: inherit;
551 + color: rgba(0, 0, 0, 0.8);
552 + }
553 +
554 + table tr.even,
555 + table tr.alt {
556 + background: #f8f8f7;
557 + }
558 +
559 + table thead tr th,
560 + table tfoot tr th,
561 + table tbody tr td,
562 + table tr td,
563 + table tfoot tr td {
564 + line-height: 1.6;
565 + }
566 +
567 + h1,
568 + h2,
569 + h3,
570 + #toctitle,
571 + .sidebarblock > .content > .title,
572 + h4,
573 + h5,
574 + h6 {
575 + line-height: 1.2;
576 + word-spacing: -0.05em;
577 + }
578 +
579 + h1 strong,
580 + h2 strong,
581 + h3 strong,
582 + #toctitle strong,
583 + .sidebarblock > .content > .title strong,
584 + h4 strong,
585 + h5 strong,
586 + h6 strong {
587 + font-weight: 400;
588 + }
589 +
590 + .center {
591 + margin-left: auto;
592 + margin-right: auto;
593 + }
594 +
595 + .stretch {
596 + width: 100%;
597 + }
598 +
599 + .clearfix::before,
600 + .clearfix::after,
601 + .float-group::before,
602 + .float-group::after {
603 + content: " ";
604 + display: table;
605 + }
606 +
607 + .clearfix::after,
608 + .float-group::after {
609 + clear: both;
610 + }
611 +
612 + :not(pre).nobreak {
613 + word-wrap: normal;
614 + }
615 +
616 + :not(pre).nowrap {
617 + white-space: nowrap;
618 + }
619 +
620 + :not(pre).pre-wrap {
621 + white-space: pre-wrap;
622 + }
623 +
624 + :not(pre):not([class^=L]) > code {
625 + font-size: 0.9375em;
626 + font-style: normal !important;
627 + letter-spacing: 0;
628 + padding: 0.1em 0.5ex;
629 + word-spacing: -0.15em;
630 + background: #f7f7f8;
631 + border-radius: 4px;
632 + line-height: 1.45;
633 + text-rendering: optimizeSpeed;
634 + }
635 +
636 + pre {
637 + color: rgba(0, 0, 0, 0.9);
638 + font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace;
639 + line-height: 1.45;
640 + text-rendering: optimizeSpeed;
641 + }
642 +
643 + pre code,
644 + pre pre {
645 + color: inherit;
646 + font-size: inherit;
647 + line-height: inherit;
648 + }
649 +
650 + pre > code {
651 + display: block;
652 + }
653 +
654 + pre.nowrap,
655 + pre.nowrap pre {
656 + white-space: pre;
657 + word-wrap: normal;
658 + }
659 +
660 + em em {
661 + font-style: normal;
662 + }
663 +
664 + strong strong {
665 + font-weight: 400;
666 + }
667 +
668 + .keyseq {
669 + color: rgba(51, 51, 51, 0.8);
670 + }
671 +
672 + kbd {
673 + font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace;
674 + display: inline-block;
675 + color: rgba(0, 0, 0, 0.8);
676 + font-size: 0.65em;
677 + line-height: 1.45;
678 + background: #f7f7f7;
679 + border: 1px solid #ccc;
680 + border-radius: 3px;
681 + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em #fff inset;
682 + margin: 0 0.15em;
683 + padding: 0.2em 0.5em;
684 + vertical-align: middle;
685 + position: relative;
686 + top: -0.1em;
687 + white-space: nowrap;
688 + }
689 +
690 + .keyseq kbd:first-child {
691 + margin-left: 0;
692 + }
693 +
694 + .keyseq kbd:last-child {
695 + margin-right: 0;
696 + }
697 +
698 + .menuseq,
699 + .menuref {
700 + color: #000;
701 + }
702 +
703 + .menuseq b:not(.caret),
704 + .menuref {
705 + font-weight: inherit;
706 + }
707 +
708 + .menuseq {
709 + word-spacing: -0.02em;
710 + }
711 +
712 + .menuseq b.caret {
713 + font-size: 1.25em;
714 + line-height: 0.8;
715 + }
716 +
717 + .menuseq i.caret {
718 + font-weight: bold;
719 + text-align: center;
720 + width: 0.45em;
721 + }
722 +
723 + b.button::before,
724 + b.button::after {
725 + position: relative;
726 + top: -1px;
727 + font-weight: 400;
728 + }
729 +
730 + b.button::before {
731 + content: "[";
732 + padding: 0 3px 0 2px;
733 + }
734 +
735 + b.button::after {
736 + content: "]";
737 + padding: 0 2px 0 3px;
738 + }
739 +
740 + p a > code:hover {
741 + color: rgba(0, 0, 0, 0.9);
742 + }
743 +
744 + #header,
745 + #content,
746 + #footnotes,
747 + #footer {
748 + width: 100%;
749 + margin: 0 auto;
750 + max-width: 62.5em;
751 + *zoom: 1;
752 + position: relative;
753 + padding-left: 0.9375em;
754 + padding-right: 0.9375em;
755 + }
756 +
757 + #header::before,
758 + #header::after,
759 + #content::before,
760 + #content::after,
761 + #footnotes::before,
762 + #footnotes::after,
763 + #footer::before,
764 + #footer::after {
765 + content: " ";
766 + display: table;
767 + }
768 +
769 + #header::after,
770 + #content::after,
771 + #footnotes::after,
772 + #footer::after {
773 + clear: both;
774 + }
775 +
776 + #content {
777 + margin-top: 1.25em;
778 + }
779 +
780 + #content::before {
781 + content: none;
782 + }
783 +
784 + #header > h1:first-child {
785 + color: rgba(0, 0, 0, 0.85);
786 + margin-top: 2.25rem;
787 + margin-bottom: 0;
788 + }
789 +
790 + #header > h1:first-child + #toc {
791 + margin-top: 8px;
792 + border-top: 1px solid #dddddf;
793 + }
794 +
795 + #header > h1:only-child,
796 + body.toc2 #header > h1:nth-last-child(2) {
797 + border-bottom: 1px solid #dddddf;
798 + padding-bottom: 8px;
799 + }
800 +
801 + #header .details {
802 + border-bottom: 1px solid #dddddf;
803 + line-height: 1.45;
804 + padding-top: 0.25em;
805 + padding-bottom: 0.25em;
806 + padding-left: 0.25em;
807 + color: rgba(0, 0, 0, 0.6);
808 + display: flex;
809 + flex-flow: row wrap;
810 + }
811 +
812 + #header .details span:first-child {
813 + margin-left: -0.125em;
814 + }
815 +
816 + #header .details span.email a {
817 + color: rgba(0, 0, 0, 0.85);
818 + }
819 +
820 + #header .details br {
821 + display: none;
822 + }
823 +
824 + #header .details br + span::before {
825 + content: "\00a0\2013\00a0";
826 + }
827 +
828 + #header .details br + span.author::before {
829 + content: "\00a0\22c5\00a0";
830 + color: rgba(0, 0, 0, 0.85);
831 + }
832 +
833 + #header .details br + span#revremark::before {
834 + content: "\00a0|\00a0";
835 + }
836 +
837 + #header #revnumber {
838 + text-transform: capitalize;
839 + }
840 +
841 + #header #revnumber::after {
842 + content: "\00a0";
843 + }
844 +
845 + #content > h1:first-child:not([class]) {
846 + color: rgba(0, 0, 0, 0.85);
847 + border-bottom: 1px solid #dddddf;
848 + padding-bottom: 8px;
849 + margin-top: 0;
850 + padding-top: 1rem;
851 + margin-bottom: 1.25rem;
852 + }
853 +
854 + #toc {
855 + border-bottom: 1px solid #e7e7e9;
856 + padding-bottom: 0.5em;
857 + }
858 +
859 + #toc > ul {
860 + margin-left: 0.125em;
861 + }
862 +
863 + #toc ul.sectlevel0 > li > a {
864 + font-style: italic;
865 + }
866 +
867 + #toc ul.sectlevel0 ul.sectlevel1 {
868 + margin: 0.5em 0;
869 + }
870 +
871 + #toc ul {
872 + font-family: "Open Sans", "DejaVu Sans", sans-serif;
873 + list-style-type: none;
874 + }
875 +
876 + #toc li {
877 + line-height: 1.3334;
878 + margin-top: 0.3334em;
879 + }
880 +
881 + #toc a {
882 + text-decoration: none;
883 + }
884 +
885 + #toc a:active {
886 + text-decoration: underline;
887 + }
888 +
889 + #toctitle {
890 + color: #7a2518;
891 + font-size: 1.2em;
892 + }
893 +
894 + @media screen and (min-width: 768px) {
895 + #toctitle {
896 + font-size: 1.375em;
897 + }
898 +
899 + body.toc2 {
900 + padding-left: 15em;
901 + padding-right: 0;
902 + }
903 +
904 + #toc.toc2 {
905 + margin-top: 0 !important;
906 + background: #f8f8f7;
907 + position: fixed;
908 + width: 15em;
909 + left: 0;
910 + top: 0;
911 + border-right: 1px solid #e7e7e9;
912 + border-top-width: 0 !important;
913 + border-bottom-width: 0 !important;
914 + z-index: 1000;
915 + padding: 1.25em 1em;
916 + height: 100%;
917 + overflow: auto;
918 + }
919 +
920 + #toc.toc2 #toctitle {
921 + margin-top: 0;
922 + margin-bottom: 0.8rem;
923 + font-size: 1.2em;
924 + }
925 +
926 + #toc.toc2 > ul {
927 + font-size: 0.9em;
928 + margin-bottom: 0;
929 + }
930 +
931 + #toc.toc2 ul ul {
932 + margin-left: 0;
933 + padding-left: 1em;
934 + }
935 +
936 + #toc.toc2 ul.sectlevel0 ul.sectlevel1 {
937 + padding-left: 0;
938 + margin-top: 0.5em;
939 + margin-bottom: 0.5em;
940 + }
941 +
942 + body.toc2.toc-right {
943 + padding-left: 0;
944 + padding-right: 15em;
945 + }
946 +
947 + body.toc2.toc-right #toc.toc2 {
948 + border-right-width: 0;
949 + border-left: 1px solid #e7e7e9;
950 + left: auto;
951 + right: 0;
952 + }
953 + }
954 +
955 + @media screen and (min-width: 1280px) {
956 + body.toc2 {
957 + padding-left: 20em;
958 + padding-right: 0;
959 + }
960 +
961 + #toc.toc2 {
962 + width: 20em;
963 + }
964 +
965 + #toc.toc2 #toctitle {
966 + font-size: 1.375em;
967 + }
968 +
969 + #toc.toc2 > ul {
970 + font-size: 0.95em;
971 + }
972 +
973 + #toc.toc2 ul ul {
974 + padding-left: 1.25em;
975 + }
976 +
977 + body.toc2.toc-right {
978 + padding-left: 0;
979 + padding-right: 20em;
980 + }
981 + }
982 +
983 + #content #toc {
984 + border: 1px solid #e0e0dc;
985 + margin-bottom: 1.25em;
986 + padding: 1.25em;
987 + background: #f8f8f7;
988 + border-radius: 4px;
989 + }
990 +
991 + #content #toc > :first-child {
992 + margin-top: 0;
993 + }
994 +
995 + #content #toc > :last-child {
996 + margin-bottom: 0;
997 + }
998 +
999 + #footer {
1000 + max-width: none;
1001 + background: rgba(0, 0, 0, 0.8);
1002 + padding: 1.25em;
1003 + }
1004 +
1005 + #footer-text {
1006 + color: rgba(255, 255, 255, 0.8);
1007 + line-height: 1.44;
1008 + }
1009 +
1010 + #content {
1011 + margin-bottom: 0.625em;
1012 + }
1013 +
1014 + .sect1 {
1015 + padding-bottom: 0.625em;
1016 + }
1017 +
1018 + @media screen and (min-width: 768px) {
1019 + #content {
1020 + margin-bottom: 1.25em;
1021 + }
1022 +
1023 + .sect1 {
1024 + padding-bottom: 1.25em;
1025 + }
1026 + }
1027 +
1028 + .sect1:last-child {
1029 + padding-bottom: 0;
1030 + }
1031 +
1032 + .sect1 + .sect1 {
1033 + border-top: 1px solid #e7e7e9;
1034 + }
1035 +
1036 + #content h1 > a.anchor,
1037 + h2 > a.anchor,
1038 + h3 > a.anchor,
1039 + #toctitle > a.anchor,
1040 + .sidebarblock > .content > .title > a.anchor,
1041 + h4 > a.anchor,
1042 + h5 > a.anchor,
1043 + h6 > a.anchor {
1044 + position: absolute;
1045 + z-index: 1001;
1046 + width: 1.5ex;
1047 + margin-left: -1.5ex;
1048 + display: block;
1049 + text-decoration: none !important;
1050 + visibility: hidden;
1051 + text-align: center;
1052 + font-weight: 400;
1053 + }
1054 +
1055 + #content h1 > a.anchor::before,
1056 + h2 > a.anchor::before,
1057 + h3 > a.anchor::before,
1058 + #toctitle > a.anchor::before,
1059 + .sidebarblock > .content > .title > a.anchor::before,
1060 + h4 > a.anchor::before,
1061 + h5 > a.anchor::before,
1062 + h6 > a.anchor::before {
1063 + content: "\00A7";
1064 + font-size: 0.85em;
1065 + display: block;
1066 + padding-top: 0.1em;
1067 + }
1068 +
1069 + #content h1:hover > a.anchor,
1070 + #content h1 > a.anchor:hover,
1071 + h2:hover > a.anchor,
1072 + h2 > a.anchor:hover,
1073 + h3:hover > a.anchor,
1074 + #toctitle:hover > a.anchor,
1075 + .sidebarblock > .content > .title:hover > a.anchor,
1076 + h3 > a.anchor:hover,
1077 + #toctitle > a.anchor:hover,
1078 + .sidebarblock > .content > .title > a.anchor:hover,
1079 + h4:hover > a.anchor,
1080 + h4 > a.anchor:hover,
1081 + h5:hover > a.anchor,
1082 + h5 > a.anchor:hover,
1083 + h6:hover > a.anchor,
1084 + h6 > a.anchor:hover {
1085 + visibility: visible;
1086 + }
1087 +
1088 + #content h1 > a.link,
1089 + h2 > a.link,
1090 + h3 > a.link,
1091 + #toctitle > a.link,
1092 + .sidebarblock > .content > .title > a.link,
1093 + h4 > a.link,
1094 + h5 > a.link,
1095 + h6 > a.link {
1096 + color: #ba3925;
1097 + text-decoration: none;
1098 + }
1099 +
1100 + #content h1 > a.link:hover,
1101 + h2 > a.link:hover,
1102 + h3 > a.link:hover,
1103 + #toctitle > a.link:hover,
1104 + .sidebarblock > .content > .title > a.link:hover,
1105 + h4 > a.link:hover,
1106 + h5 > a.link:hover,
1107 + h6 > a.link:hover {
1108 + color: #a53221;
1109 + }
1110 +
1111 + details,
1112 + .audioblock,
1113 + .imageblock,
1114 + .literalblock,
1115 + .listingblock,
1116 + .stemblock,
1117 + .videoblock {
1118 + margin-bottom: 1.25em;
1119 + }
1120 +
1121 + details {
1122 + margin-left: 1.25rem;
1123 + }
1124 +
1125 + details > summary {
1126 + cursor: pointer;
1127 + display: block;
1128 + position: relative;
1129 + line-height: 1.6;
1130 + margin-bottom: 0.625rem;
1131 + outline: none;
1132 + -webkit-tap-highlight-color: transparent;
1133 + }
1134 +
1135 + details > summary::-webkit-details-marker {
1136 + display: none;
1137 + }
1138 +
1139 + details > summary::before {
1140 + content: "";
1141 + border: solid transparent;
1142 + border-left-color: currentColor;
1143 + border-width: 0.3em 0 0.3em 0.5em;
1144 + position: absolute;
1145 + top: 0.5em;
1146 + left: -1.25rem;
1147 + transform: translateX(15%);
1148 + }
1149 +
1150 + details[open] > summary::before {
1151 + border: solid transparent;
1152 + border-top-color: currentColor;
1153 + border-width: 0.5em 0.3em 0;
1154 + transform: translateY(15%);
1155 + }
1156 +
1157 + details > summary::after {
1158 + content: "";
1159 + width: 1.25rem;
1160 + height: 1em;
1161 + position: absolute;
1162 + top: 0.3em;
1163 + left: -1.25rem;
1164 + }
1165 +
1166 + .admonitionblock td.content > .title,
1167 + .audioblock > .title,
1168 + .exampleblock > .title,
1169 + .imageblock > .title,
1170 + .listingblock > .title,
1171 + .literalblock > .title,
1172 + .stemblock > .title,
1173 + .openblock > .title,
1174 + .paragraph > .title,
1175 + .quoteblock > .title,
1176 + table.tableblock > .title,
1177 + .verseblock > .title,
1178 + .videoblock > .title,
1179 + .dlist > .title,
1180 + .olist > .title,
1181 + .ulist > .title,
1182 + .qlist > .title,
1183 + .hdlist > .title {
1184 + text-rendering: optimizeLegibility;
1185 + text-align: left;
1186 + font-family: "Noto Serif", "DejaVu Serif", serif;
1187 + font-size: 1rem;
1188 + font-style: italic;
1189 + }
1190 +
1191 + table.tableblock.fit-content > caption.title {
1192 + white-space: nowrap;
1193 + width: 0;
1194 + }
1195 +
1196 + .paragraph.lead > p,
1197 + #preamble > .sectionbody > [class=paragraph]:first-of-type p {
1198 + font-size: 1.21875em;
1199 + line-height: 1.6;
1200 + color: rgba(0, 0, 0, 0.85);
1201 + }
1202 +
1203 + .admonitionblock > table {
1204 + border-collapse: separate;
1205 + border: 0;
1206 + background: none;
1207 + width: 100%;
1208 + }
1209 +
1210 + .admonitionblock > table td.icon {
1211 + text-align: center;
1212 + width: 80px;
1213 + }
1214 +
1215 + .admonitionblock > table td.icon img {
1216 + max-width: none;
1217 + }
1218 +
1219 + .admonitionblock > table td.icon .title {
1220 + font-weight: bold;
1221 + font-family: "Open Sans", "DejaVu Sans", sans-serif;
1222 + text-transform: uppercase;
1223 + }
1224 +
1225 + .admonitionblock > table td.content {
1226 + padding-left: 1.125em;
1227 + padding-right: 1.25em;
1228 + border-left: 1px solid #dddddf;
1229 + color: rgba(0, 0, 0, 0.6);
1230 + word-wrap: anywhere;
1231 + }
1232 +
1233 + .admonitionblock > table td.content > :last-child > :last-child {
1234 + margin-bottom: 0;
1235 + }
1236 +
1237 + .exampleblock > .content {
1238 + border: 1px solid #e6e6e6;
1239 + margin-bottom: 1.25em;
1240 + padding: 1.25em;
1241 + background: #fff;
1242 + border-radius: 4px;
1243 + }
1244 +
1245 + .sidebarblock {
1246 + border: 1px solid #dbdbd6;
1247 + margin-bottom: 1.25em;
1248 + padding: 1.25em;
1249 + background: #f3f3f2;
1250 + border-radius: 4px;
1251 + }
1252 +
1253 + .sidebarblock > .content > .title {
1254 + color: #7a2518;
1255 + margin-top: 0;
1256 + text-align: center;
1257 + }
1258 +
1259 + .exampleblock > .content > :first-child,
1260 + .sidebarblock > .content > :first-child {
1261 + margin-top: 0;
1262 + }
1263 +
1264 + .exampleblock > .content > :last-child,
1265 + .exampleblock > .content > :last-child > :last-child,
1266 + .exampleblock > .content .olist > ol > li:last-child > :last-child,
1267 + .exampleblock > .content .ulist > ul > li:last-child > :last-child,
1268 + .exampleblock > .content .qlist > ol > li:last-child > :last-child,
1269 + .sidebarblock > .content > :last-child,
1270 + .sidebarblock > .content > :last-child > :last-child,
1271 + .sidebarblock > .content .olist > ol > li:last-child > :last-child,
1272 + .sidebarblock > .content .ulist > ul > li:last-child > :last-child,
1273 + .sidebarblock > .content .qlist > ol > li:last-child > :last-child {
1274 + margin-bottom: 0;
1275 + }
1276 +
1277 + .literalblock pre,
1278 + .listingblock > .content > pre {
1279 + border-radius: 4px;
1280 + overflow-x: auto;
1281 + padding: 1em;
1282 + font-size: 0.8125em;
1283 + }
1284 +
1285 + @media screen and (min-width: 768px) {
1286 + .literalblock pre,
1287 + .listingblock > .content > pre {
1288 + font-size: 0.90625em;
1289 + }
1290 + }
1291 +
1292 + @media screen and (min-width: 1280px) {
1293 + .literalblock pre,
1294 + .listingblock > .content > pre {
1295 + font-size: 1em;
1296 + }
1297 + }
1298 +
1299 + .literalblock pre,
1300 + .listingblock > .content > pre:not(.highlight),
1301 + .listingblock > .content > pre[class=highlight],
1302 + .listingblock > .content > pre[class^="highlight "] {
1303 + background: #f7f7f8;
1304 + }
1305 +
1306 + .literalblock.output pre {
1307 + color: #f7f7f8;
1308 + background: rgba(0, 0, 0, 0.9);
1309 + }
1310 +
1311 + .listingblock > .content {
1312 + position: relative;
1313 + }
1314 +
1315 + .listingblock code[data-lang]::before {
1316 + display: none;
1317 + content: attr(data-lang);
1318 + position: absolute;
1319 + font-size: 0.75em;
1320 + top: 0.425rem;
1321 + right: 0.5rem;
1322 + line-height: 1;
1323 + text-transform: uppercase;
1324 + color: inherit;
1325 + opacity: 0.5;
1326 + }
1327 +
1328 + .listingblock:hover code[data-lang]::before {
1329 + display: block;
1330 + }
1331 +
1332 + .listingblock.terminal pre .command::before {
1333 + content: attr(data-prompt);
1334 + padding-right: 0.5em;
1335 + color: inherit;
1336 + opacity: 0.5;
1337 + }
1338 +
1339 + .listingblock.terminal pre .command:not([data-prompt])::before {
1340 + content: "$";
1341 + }
1342 +
1343 + .listingblock pre.highlightjs {
1344 + padding: 0;
1345 + }
1346 +
1347 + .listingblock pre.highlightjs > code {
1348 + padding: 1em;
1349 + border-radius: 4px;
1350 + }
1351 +
1352 + .listingblock pre.prettyprint {
1353 + border-width: 0;
1354 + }
1355 +
1356 + .prettyprint {
1357 + background: #f7f7f8;
1358 + }
1359 +
1360 + pre.prettyprint .linenums {
1361 + line-height: 1.45;
1362 + margin-left: 2em;
1363 + }
1364 +
1365 + pre.prettyprint li {
1366 + background: none;
1367 + list-style-type: inherit;
1368 + padding-left: 0;
1369 + }
1370 +
1371 + pre.prettyprint li code[data-lang]::before {
1372 + opacity: 1;
1373 + }
1374 +
1375 + pre.prettyprint li:not(:first-child) code[data-lang]::before {
1376 + display: none;
1377 + }
1378 +
1379 + table.linenotable {
1380 + border-collapse: separate;
1381 + border: 0;
1382 + margin-bottom: 0;
1383 + background: none;
1384 + }
1385 +
1386 + table.linenotable td[class] {
1387 + color: inherit;
1388 + vertical-align: top;
1389 + padding: 0;
1390 + line-height: inherit;
1391 + white-space: normal;
1392 + }
1393 +
1394 + table.linenotable td.code {
1395 + padding-left: 0.75em;
1396 + }
1397 +
1398 + table.linenotable td.linenos,
1399 + pre.pygments .linenos {
1400 + border-right: 1px solid;
1401 + opacity: 0.35;
1402 + padding-right: 0.5em;
1403 + user-select: none;
1404 + }
1405 +
1406 + pre.pygments span.linenos {
1407 + display: inline-block;
1408 + margin-right: 0.75em;
1409 + }
1410 +
1411 + .quoteblock {
1412 + margin: 0 1em 1.25em 1.5em;
1413 + display: table;
1414 + }
1415 +
1416 + .quoteblock:not(.excerpt) > .title {
1417 + margin-left: -1.5em;
1418 + margin-bottom: 0.75em;
1419 + }
1420 +
1421 + .quoteblock blockquote,
1422 + .quoteblock p {
1423 + color: rgba(0, 0, 0, 0.85);
1424 + font-size: 1.15rem;
1425 + line-height: 1.75;
1426 + word-spacing: 0.1em;
1427 + letter-spacing: 0;
1428 + font-style: italic;
1429 + text-align: justify;
1430 + }
1431 +
1432 + .quoteblock blockquote {
1433 + margin: 0;
1434 + padding: 0;
1435 + border: 0;
1436 + }
1437 +
1438 + .quoteblock blockquote::before {
1439 + content: "\201c";
1440 + float: left;
1441 + font-size: 2.75em;
1442 + font-weight: bold;
1443 + line-height: 0.6em;
1444 + margin-left: -0.6em;
1445 + color: #7a2518;
1446 + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
1447 + }
1448 +
1449 + .quoteblock blockquote > .paragraph:last-child p {
1450 + margin-bottom: 0;
1451 + }
1452 +
1453 + .quoteblock .attribution {
1454 + margin-top: 0.75em;
1455 + margin-right: 0.5ex;
1456 + text-align: right;
1457 + }
1458 +
1459 + .verseblock {
1460 + margin: 0 1em 1.25em;
1461 + }
1462 +
1463 + .verseblock pre {
1464 + font-family: "Open Sans", "DejaVu Sans", sans-serif;
1465 + font-size: 1.15rem;
1466 + color: rgba(0, 0, 0, 0.85);
1467 + font-weight: 300;
1468 + text-rendering: optimizeLegibility;
1469 + }
1470 +
1471 + .verseblock pre strong {
1472 + font-weight: 400;
1473 + }
1474 +
1475 + .verseblock .attribution {
1476 + margin-top: 1.25rem;
1477 + margin-left: 0.5ex;
1478 + }
1479 +
1480 + .quoteblock .attribution,
1481 + .verseblock .attribution {
1482 + font-size: 0.9375em;
1483 + line-height: 1.45;
1484 + font-style: italic;
1485 + }
1486 +
1487 + .quoteblock .attribution br,
1488 + .verseblock .attribution br {
1489 + display: none;
1490 + }
1491 +
1492 + .quoteblock .attribution cite,
1493 + .verseblock .attribution cite {
1494 + display: block;
1495 + letter-spacing: -0.025em;
1496 + color: rgba(0, 0, 0, 0.6);
1497 + }
1498 +
1499 + .quoteblock.abstract blockquote::before,
1500 + .quoteblock.excerpt blockquote::before,
1501 + .quoteblock .quoteblock blockquote::before {
1502 + display: none;
1503 + }
1504 +
1505 + .quoteblock.abstract blockquote,
1506 + .quoteblock.abstract p,
1507 + .quoteblock.excerpt blockquote,
1508 + .quoteblock.excerpt p,
1509 + .quoteblock .quoteblock blockquote,
1510 + .quoteblock .quoteblock p {
1511 + line-height: 1.6;
1512 + word-spacing: 0;
1513 + }
1514 +
1515 + .quoteblock.abstract {
1516 + margin: 0 1em 1.25em;
1517 + display: block;
1518 + }
1519 +
1520 + .quoteblock.abstract > .title {
1521 + margin: 0 0 0.375em;
1522 + font-size: 1.15em;
1523 + text-align: center;
1524 + }
1525 +
1526 + .quoteblock.excerpt > blockquote,
1527 + .quoteblock .quoteblock {
1528 + padding: 0 0 0.25em 1em;
1529 + border-left: 0.25em solid #dddddf;
1530 + }
1531 +
1532 + .quoteblock.excerpt,
1533 + .quoteblock .quoteblock {
1534 + margin-left: 0;
1535 + }
1536 +
1537 + .quoteblock.excerpt blockquote,
1538 + .quoteblock.excerpt p,
1539 + .quoteblock .quoteblock blockquote,
1540 + .quoteblock .quoteblock p {
1541 + color: inherit;
1542 + font-size: 1.0625rem;
1543 + }
1544 +
1545 + .quoteblock.excerpt .attribution,
1546 + .quoteblock .quoteblock .attribution {
1547 + color: inherit;
1548 + font-size: 0.85rem;
1549 + text-align: left;
1550 + margin-right: 0;
1551 + }
1552 +
1553 + p.tableblock:last-child {
1554 + margin-bottom: 0;
1555 + }
1556 +
1557 + td.tableblock > .content {
1558 + margin-bottom: 1.25em;
1559 + word-wrap: anywhere;
1560 + }
1561 +
1562 + td.tableblock > .content > :last-child {
1563 + margin-bottom: -1.25em;
1564 + }
1565 +
1566 + table.tableblock,
1567 + th.tableblock,
1568 + td.tableblock {
1569 + border: 0 solid #dedede;
1570 + }
1571 +
1572 + table.grid-all > * > tr > * {
1573 + border-width: 1px;
1574 + }
1575 +
1576 + table.grid-cols > * > tr > * {
1577 + border-width: 0 1px;
1578 + }
1579 +
1580 + table.grid-rows > * > tr > * {
1581 + border-width: 1px 0;
1582 + }
1583 +
1584 + table.frame-all {
1585 + border-width: 1px;
1586 + }
1587 +
1588 + table.frame-ends {
1589 + border-width: 1px 0;
1590 + }
1591 +
1592 + table.frame-sides {
1593 + border-width: 0 1px;
1594 + }
1595 +
1596 + table.frame-none > colgroup + * > :first-child > *,
1597 + table.frame-sides > colgroup + * > :first-child > * {
1598 + border-top-width: 0;
1599 + }
1600 +
1601 + table.frame-none > :last-child > :last-child > *,
1602 + table.frame-sides > :last-child > :last-child > * {
1603 + border-bottom-width: 0;
1604 + }
1605 +
1606 + table.frame-none > * > tr > :first-child,
1607 + table.frame-ends > * > tr > :first-child {
1608 + border-left-width: 0;
1609 + }
1610 +
1611 + table.frame-none > * > tr > :last-child,
1612 + table.frame-ends > * > tr > :last-child {
1613 + border-right-width: 0;
1614 + }
1615 +
1616 + table.stripes-all > * > tr,
1617 + table.stripes-odd > * > tr:nth-of-type(odd),
1618 + table.stripes-even > * > tr:nth-of-type(even),
1619 + table.stripes-hover > * > tr:hover {
1620 + background: #f8f8f7;
1621 + }
1622 +
1623 + th.halign-left,
1624 + td.halign-left {
1625 + text-align: left;
1626 + }
1627 +
1628 + th.halign-right,
1629 + td.halign-right {
1630 + text-align: right;
1631 + }
1632 +
1633 + th.halign-center,
1634 + td.halign-center {
1635 + text-align: center;
1636 + }
1637 +
1638 + th.valign-top,
1639 + td.valign-top {
1640 + vertical-align: top;
1641 + }
1642 +
1643 + th.valign-bottom,
1644 + td.valign-bottom {
1645 + vertical-align: bottom;
1646 + }
1647 +
1648 + th.valign-middle,
1649 + td.valign-middle {
1650 + vertical-align: middle;
1651 + }
1652 +
1653 + table thead th,
1654 + table tfoot th {
1655 + font-weight: bold;
1656 + }
1657 +
1658 + tbody tr th {
1659 + background: #f7f8f7;
1660 + }
1661 +
1662 + tbody tr th,
1663 + tbody tr th p,
1664 + tfoot tr th,
1665 + tfoot tr th p {
1666 + color: rgba(0, 0, 0, 0.8);
1667 + font-weight: bold;
1668 + }
1669 +
1670 + p.tableblock > code:only-child {
1671 + background: none;
1672 + padding: 0;
1673 + }
1674 +
1675 + p.tableblock {
1676 + font-size: 1em;
1677 + }
1678 +
1679 + ol {
1680 + margin-left: 1.75em;
1681 + }
1682 +
1683 + ul li ol {
1684 + margin-left: 1.5em;
1685 + }
1686 +
1687 + dl dd {
1688 + margin-left: 1.125em;
1689 + }
1690 +
1691 + dl dd:last-child,
1692 + dl dd:last-child > :last-child {
1693 + margin-bottom: 0;
1694 + }
1695 +
1696 + li p,
1697 + ul dd,
1698 + ol dd,
1699 + .olist .olist,
1700 + .ulist .ulist,
1701 + .ulist .olist,
1702 + .olist .ulist {
1703 + margin-bottom: 0.625em;
1704 + }
1705 +
1706 + ul.checklist,
1707 + ul.none,
1708 + ol.none,
1709 + ul.no-bullet,
1710 + ol.no-bullet,
1711 + ol.unnumbered,
1712 + ul.unstyled,
1713 + ol.unstyled {
1714 + list-style-type: none;
1715 + }
1716 +
1717 + ul.no-bullet,
1718 + ol.no-bullet,
1719 + ol.unnumbered {
1720 + margin-left: 0.625em;
1721 + }
1722 +
1723 + ul.unstyled,
1724 + ol.unstyled {
1725 + margin-left: 0;
1726 + }
1727 +
1728 + li > p:empty:only-child::before {
1729 + content: "";
1730 + display: inline-block;
1731 + }
1732 +
1733 + ul.checklist > li > p:first-child {
1734 + margin-left: -1em;
1735 + }
1736 +
1737 + ul.checklist > li > p:first-child > .fa-square-o:first-child,
1738 + ul.checklist > li > p:first-child > .fa-check-square-o:first-child {
1739 + width: 1.25em;
1740 + font-size: 0.8em;
1741 + position: relative;
1742 + bottom: 0.125em;
1743 + }
1744 +
1745 + ul.checklist > li > p:first-child > input[type=checkbox]:first-child {
1746 + margin-right: 0.25em;
1747 + }
1748 +
1749 + ul.inline {
1750 + display: flex;
1751 + flex-flow: row wrap;
1752 + list-style: none;
1753 + margin: 0 0 0.625em -1.25em;
1754 + }
1755 +
1756 + ul.inline > li {
1757 + margin-left: 1.25em;
1758 + }
1759 +
1760 + .unstyled dl dt {
1761 + font-weight: 400;
1762 + font-style: normal;
1763 + }
1764 +
1765 + ol.arabic {
1766 + list-style-type: decimal;
1767 + }
1768 +
1769 + ol.decimal {
1770 + list-style-type: decimal-leading-zero;
1771 + }
1772 +
1773 + ol.loweralpha {
1774 + list-style-type: lower-alpha;
1775 + }
1776 +
1777 + ol.upperalpha {
1778 + list-style-type: upper-alpha;
1779 + }
1780 +
1781 + ol.lowerroman {
1782 + list-style-type: lower-roman;
1783 + }
1784 +
1785 + ol.upperroman {
1786 + list-style-type: upper-roman;
1787 + }
1788 +
1789 + ol.lowergreek {
1790 + list-style-type: lower-greek;
1791 + }
1792 +
1793 + .hdlist > table,
1794 + .colist > table {
1795 + border: 0;
1796 + background: none;
1797 + }
1798 +
1799 + .hdlist > table > tbody > tr,
1800 + .colist > table > tbody > tr {
1801 + background: none;
1802 + }
1803 +
1804 + td.hdlist1,
1805 + td.hdlist2 {
1806 + vertical-align: top;
1807 + padding: 0 0.625em;
1808 + }
1809 +
1810 + td.hdlist1 {
1811 + font-weight: bold;
1812 + padding-bottom: 1.25em;
1813 + }
1814 +
1815 + td.hdlist2 {
1816 + word-wrap: anywhere;
1817 + }
1818 +
1819 + .literalblock + .colist,
1820 + .listingblock + .colist {
1821 + margin-top: -0.5em;
1822 + }
1823 +
1824 + .colist td:not([class]):first-child {
1825 + padding: 0.4em 0.75em 0;
1826 + line-height: 1;
1827 + vertical-align: top;
1828 + }
1829 +
1830 + .colist td:not([class]):first-child img {
1831 + max-width: none;
1832 + }
1833 +
1834 + .colist td:not([class]):last-child {
1835 + padding: 0.25em 0;
1836 + }
1837 +
1838 + .thumb,
1839 + .th {
1840 + line-height: 0;
1841 + display: inline-block;
1842 + border: 4px solid #fff;
1843 + box-shadow: 0 0 0 1px #ddd;
1844 + }
1845 +
1846 + .imageblock.left {
1847 + margin: 0.25em 0.625em 1.25em 0;
1848 + }
1849 +
1850 + .imageblock.right {
1851 + margin: 0.25em 0 1.25em 0.625em;
1852 + }
1853 +
1854 + .imageblock > .title {
1855 + margin-bottom: 0;
1856 + }
1857 +
1858 + .imageblock.thumb,
1859 + .imageblock.th {
1860 + border-width: 6px;
1861 + }
1862 +
1863 + .imageblock.thumb > .title,
1864 + .imageblock.th > .title {
1865 + padding: 0 0.125em;
1866 + }
1867 +
1868 + .image.left,
1869 + .image.right {
1870 + margin-top: 0.25em;
1871 + margin-bottom: 0.25em;
1872 + display: inline-block;
1873 + line-height: 0;
1874 + }
1875 +
1876 + .image.left {
1877 + margin-right: 0.625em;
1878 + }
1879 +
1880 + .image.right {
1881 + margin-left: 0.625em;
1882 + }
1883 +
1884 + a.image {
1885 + text-decoration: none;
1886 + display: inline-block;
1887 + }
1888 +
1889 + a.image object {
1890 + pointer-events: none;
1891 + }
1892 +
1893 + sup.footnote,
1894 + sup.footnoteref {
1895 + font-size: 0.875em;
1896 + position: static;
1897 + vertical-align: super;
1898 + }
1899 +
1900 + sup.footnote a,
1901 + sup.footnoteref a {
1902 + text-decoration: none;
1903 + }
1904 +
1905 + sup.footnote a:active,
1906 + sup.footnoteref a:active {
1907 + text-decoration: underline;
1908 + }
1909 +
1910 + #footnotes {
1911 + padding-top: 0.75em;
1912 + padding-bottom: 0.75em;
1913 + margin-bottom: 0.625em;
1914 + }
1915 +
1916 + #footnotes hr {
1917 + width: 20%;
1918 + min-width: 6.25em;
1919 + margin: -0.25em 0 0.75em;
1920 + border-width: 1px 0 0;
1921 + }
1922 +
1923 + #footnotes .footnote {
1924 + padding: 0 0.375em 0 0.225em;
1925 + line-height: 1.3334;
1926 + font-size: 0.875em;
1927 + margin-left: 1.2em;
1928 + margin-bottom: 0.2em;
1929 + }
1930 +
1931 + #footnotes .footnote a:first-of-type {
1932 + font-weight: bold;
1933 + text-decoration: none;
1934 + margin-left: -1.05em;
1935 + }
1936 +
1937 + #footnotes .footnote:last-of-type {
1938 + margin-bottom: 0;
1939 + }
1940 +
1941 + #content #footnotes {
1942 + margin-top: -0.625em;
1943 + margin-bottom: 0;
1944 + padding: 0.75em 0;
1945 + }
1946 +
1947 + div.unbreakable {
1948 + page-break-inside: avoid;
1949 + }
1950 +
1951 + .big {
1952 + font-size: larger;
1953 + }
1954 +
1955 + .small {
1956 + font-size: smaller;
1957 + }
1958 +
1959 + .underline {
1960 + text-decoration: underline;
1961 + }
1962 +
1963 + .overline {
1964 + text-decoration: overline;
1965 + }
1966 +
1967 + .line-through {
1968 + text-decoration: line-through;
1969 + }
1970 +
1971 + .aqua {
1972 + color: #00bfbf;
1973 + }
1974 +
1975 + .aqua-background {
1976 + background: #00fafa;
1977 + }
1978 +
1979 + .black {
1980 + color: #000;
1981 + }
1982 +
1983 + .black-background {
1984 + background: #000;
1985 + }
1986 +
1987 + .blue {
1988 + color: #0000bf;
1989 + }
1990 +
1991 + .blue-background {
1992 + background: #0000fa;
1993 + }
1994 +
1995 + .fuchsia {
1996 + color: #bf00bf;
1997 + }
1998 +
1999 + .fuchsia-background {
2000 + background: #fa00fa;
2001 + }
2002 +
2003 + .gray {
2004 + color: #606060;
2005 + }
2006 +
2007 + .gray-background {
2008 + background: #7d7d7d;
2009 + }
2010 +
2011 + .green {
2012 + color: #006000;
2013 + }
2014 +
2015 + .green-background {
2016 + background: #007d00;
2017 + }
2018 +
2019 + .lime {
2020 + color: #00bf00;
2021 + }
2022 +
2023 + .lime-background {
2024 + background: #00fa00;
2025 + }
2026 +
2027 + .maroon {
2028 + color: #600000;
2029 + }
2030 +
2031 + .maroon-background {
2032 + background: #7d0000;
2033 + }
2034 +
2035 + .navy {
2036 + color: #000060;
2037 + }
2038 +
2039 + .navy-background {
2040 + background: #00007d;
2041 + }
2042 +
2043 + .olive {
2044 + color: #606000;
2045 + }
2046 +
2047 + .olive-background {
2048 + background: #7d7d00;
2049 + }
2050 +
2051 + .purple {
2052 + color: #600060;
2053 + }
2054 +
2055 + .purple-background {
2056 + background: #7d007d;
2057 + }
2058 +
2059 + .red {
2060 + color: #bf0000;
2061 + }
2062 +
2063 + .red-background {
2064 + background: #fa0000;
2065 + }
2066 +
2067 + .silver {
2068 + color: #909090;
2069 + }
2070 +
2071 + .silver-background {
2072 + background: #bcbcbc;
2073 + }
2074 +
2075 + .teal {
2076 + color: #006060;
2077 + }
2078 +
2079 + .teal-background {
2080 + background: #007d7d;
2081 + }
2082 +
2083 + .white {
2084 + color: #bfbfbf;
2085 + }
2086 +
2087 + .white-background {
2088 + background: #fafafa;
2089 + }
2090 +
2091 + .yellow {
2092 + color: #bfbf00;
2093 + }
2094 +
2095 + .yellow-background {
2096 + background: #fafa00;
2097 + }
2098 +
2099 + span.icon > .fa {
2100 + cursor: default;
2101 + }
2102 +
2103 + a span.icon > .fa {
2104 + cursor: inherit;
2105 + }
2106 +
2107 + .admonitionblock td.icon [class^="fa icon-"] {
2108 + font-size: 2.5em;
2109 + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
2110 + cursor: default;
2111 + }
2112 +
2113 + .admonitionblock td.icon .icon-note::before {
2114 + content: "\f05a";
2115 + color: #19407c;
2116 + }
2117 +
2118 + .admonitionblock td.icon .icon-tip::before {
2119 + content: "\f0eb";
2120 + text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8);
2121 + color: #111;
2122 + }
2123 +
2124 + .admonitionblock td.icon .icon-warning::before {
2125 + content: "\f071";
2126 + color: #bf6900;
2127 + }
2128 +
2129 + .admonitionblock td.icon .icon-caution::before {
2130 + content: "\f06d";
2131 + color: #bf3400;
2132 + }
2133 +
2134 + .admonitionblock td.icon .icon-important::before {
2135 + content: "\f06a";
2136 + color: #bf0000;
2137 + }
2138 +
2139 + .conum[data-value] {
2140 + display: inline-block;
2141 + color: #fff !important;
2142 + background: rgba(0, 0, 0, 0.8);
2143 + border-radius: 50%;
2144 + text-align: center;
2145 + font-size: 0.75em;
2146 + width: 1.67em;
2147 + height: 1.67em;
2148 + line-height: 1.67em;
2149 + font-family: "Open Sans", "DejaVu Sans", sans-serif;
2150 + font-style: normal;
2151 + font-weight: bold;
2152 + }
2153 +
2154 + .conum[data-value] * {
2155 + color: #fff !important;
2156 + }
2157 +
2158 + .conum[data-value] + b {
2159 + display: none;
2160 + }
2161 +
2162 + .conum[data-value]::after {
2163 + content: attr(data-value);
2164 + }
2165 +
2166 + pre .conum[data-value] {
2167 + position: relative;
2168 + top: -0.125em;
2169 + }
2170 +
2171 + b.conum * {
2172 + color: inherit !important;
2173 + }
2174 +
2175 + .conum:not([data-value]):empty {
2176 + display: none;
2177 + }
2178 +
2179 + dt,
2180 + th.tableblock,
2181 + td.content,
2182 + div.footnote {
2183 + text-rendering: optimizeLegibility;
2184 + }
2185 +
2186 + h1,
2187 + h2,
2188 + p,
2189 + td.content,
2190 + span.alt,
2191 + summary {
2192 + letter-spacing: -0.01em;
2193 + }
2194 +
2195 + p strong,
2196 + td.content strong,
2197 + div.footnote strong {
2198 + letter-spacing: -0.005em;
2199 + }
2200 +
2201 + p,
2202 + blockquote,
2203 + dt,
2204 + td.content,
2205 + td.hdlist1,
2206 + span.alt,
2207 + summary {
2208 + font-size: 1.0625rem;
2209 + }
2210 +
2211 + p {
2212 + margin-bottom: 1.25rem;
2213 + }
2214 +
2215 + .sidebarblock p,
2216 + .sidebarblock dt,
2217 + .sidebarblock td.content,
2218 + p.tableblock {
2219 + font-size: 1em;
2220 + }
2221 +
2222 + .exampleblock > .content {
2223 + background: #fffef7;
2224 + border-color: #e0e0dc;
2225 + box-shadow: 0 1px 4px #e0e0dc;
2226 + }
2227 +
2228 + .print-only {
2229 + display: none !important;
2230 + }
2231 +
2232 + @page {
2233 + margin: 1.25cm 0.75cm;
2234 + }
2235 +
2236 + @media print {
2237 + * {
2238 + box-shadow: none !important;
2239 + text-shadow: none !important;
2240 + }
2241 +
2242 + html {
2243 + font-size: 80%;
2244 + }
2245 +
2246 + a {
2247 + color: inherit !important;
2248 + text-decoration: underline !important;
2249 + }
2250 +
2251 + a.bare,
2252 + a[href^="#"],
2253 + a[href^="mailto:"] {
2254 + text-decoration: none !important;
2255 + }
2256 +
2257 + a[href^="http:"]:not(.bare)::after,
2258 + a[href^="https:"]:not(.bare)::after {
2259 + content: "(" attr(href) ")";
2260 + display: inline-block;
2261 + font-size: 0.875em;
2262 + padding-left: 0.25em;
2263 + }
2264 +
2265 + abbr[title] {
2266 + border-bottom: 1px dotted;
2267 + }
2268 +
2269 + abbr[title]::after {
2270 + content: " (" attr(title) ")";
2271 + }
2272 +
2273 + pre,
2274 + blockquote,
2275 + tr,
2276 + img,
2277 + object,
2278 + svg {
2279 + page-break-inside: avoid;
2280 + }
2281 +
2282 + thead {
2283 + display: table-header-group;
2284 + }
2285 +
2286 + svg {
2287 + max-width: 100%;
2288 + }
2289 +
2290 + p,
2291 + blockquote,
2292 + dt,
2293 + td.content {
2294 + font-size: 1em;
2295 + orphans: 3;
2296 + widows: 3;
2297 + }
2298 +
2299 + h2,
2300 + h3,
2301 + #toctitle,
2302 + .sidebarblock > .content > .title {
2303 + page-break-after: avoid;
2304 + }
2305 +
2306 + #header,
2307 + #content,
2308 + #footnotes,
2309 + #footer {
2310 + max-width: none;
2311 + }
2312 +
2313 + #toc,
2314 + .sidebarblock,
2315 + .exampleblock > .content {
2316 + background: none !important;
2317 + }
2318 +
2319 + #toc {
2320 + border-bottom: 1px solid #dddddf !important;
2321 + padding-bottom: 0 !important;
2322 + }
2323 +
2324 + body.book #header {
2325 + text-align: center;
2326 + }
2327 +
2328 + body.book #header > h1:first-child {
2329 + border: 0 !important;
2330 + margin: 2.5em 0 1em;
2331 + }
2332 +
2333 + body.book #header .details {
2334 + border: 0 !important;
2335 + display: block;
2336 + padding: 0 !important;
2337 + }
2338 +
2339 + body.book #header .details span:first-child {
2340 + margin-left: 0 !important;
2341 + }
2342 +
2343 + body.book #header .details br {
2344 + display: block;
2345 + }
2346 +
2347 + body.book #header .details br + span::before {
2348 + content: none !important;
2349 + }
2350 +
2351 + body.book #toc {
2352 + border: 0 !important;
2353 + text-align: left !important;
2354 + padding: 0 !important;
2355 + margin: 0 !important;
2356 + }
2357 +
2358 + body.book #toc,
2359 + body.book #preamble,
2360 + body.book h1.sect0,
2361 + body.book .sect1 > h2 {
2362 + page-break-before: always;
2363 + }
2364 +
2365 + .listingblock code[data-lang]::before {
2366 + display: block;
2367 + }
2368 +
2369 + #footer {
2370 + padding: 0 0.9375em;
2371 + }
2372 +
2373 + .hide-on-print {
2374 + display: none !important;
2375 + }
2376 +
2377 + .print-only {
2378 + display: block !important;
2379 + }
2380 +
2381 + .hide-for-print {
2382 + display: none !important;
2383 + }
2384 +
2385 + .show-for-print {
2386 + display: inherit !important;
2387 + }
2388 + }
2389 +
2390 + @media amzn-kf8, print {
2391 + #header > h1:first-child {
2392 + margin-top: 1.25rem;
2393 + }
2394 +
2395 + .sect1 {
2396 + padding: 0 !important;
2397 + }
2398 +
2399 + .sect1 + .sect1 {
2400 + border: 0;
2401 + }
2402 +
2403 + #footer {
2404 + background: none;
2405 + }
2406 +
2407 + #footer-text {
2408 + color: rgba(0, 0, 0, 0.6);
2409 + font-size: 0.9em;
2410 + }
2411 + }
2412 +
2413 + @media amzn-kf8 {
2414 + #header,
2415 + #content,
2416 + #footnotes,
2417 + #footer {
2418 + padding: 0;
2419 + }
2420 + }

+90/-0 A   static/css/dokk.css
index 0000000..587f6d2
old size: 0B - new size: 2K
new file mode: -rw-r--r--
@@ -0,0 +1,90 @@
1 + html, body {
2 + font-size: 1rem;
3 + height: 100%;
4 + margin: 0;
5 + padding: 0;
6 + width: 100%;
7 + }
8 +
9 + body > .index {
10 + padding: 1rem;
11 + }
12 +
13 + body > .library {
14 +
15 + }
16 +
17 + body > .library_item {
18 +
19 + }
20 +
21 + body > .library_item > .header {
22 + background: black;
23 + color: white;
24 + padding: .75rem 1rem;
25 + }
26 +
27 + body > .library_item > .header > a,
28 + body > .library_item > .header > a:hover,
29 + body > .library_item > .header > a:visited {
30 + color: inherit;
31 + font-size: 1rem;
32 + text-decoration: none;
33 + }
34 +
35 + body > .library_item object {
36 + box-shadow: 0 0 2rem 0 #AAA;
37 + height: 80vh;
38 + width: 100%;
39 + }
40 +
41 + body > .library_item > .details {
42 + padding: 3rem 5rem;
43 + }
44 +
45 + body > .mimi_and_eunice_strip {
46 + padding: 1rem;
47 + }
48 +
49 + body > .mimi_and_eunice_strip > img {
50 + width: 100%
51 + }
52 +
53 + /* manpages */
54 + .manpages {
55 + padding: 1rem;
56 + }
57 +
58 + .manpages > .path {
59 + margin-bottom: 2rem;
60 + }
61 +
62 + .manpages > .manpage {
63 + font-family: monospace;
64 + max-width: 80ch;
65 + }
66 +
67 + .manpages > .manpage > table.head {
68 + width: 100%;
69 + }
70 +
71 + .manpages > .manpage td.head-ltitle {
72 + text-align: left;
73 + }
74 +
75 + .manpages > .manpage td.head-vol {
76 + text-align: center;
77 + }
78 +
79 + .manpages > .manpage td.head-rtitle {
80 + text-align: right;
81 + }
82 +
83 + body > .articles {
84 + font-family: sans-serif;
85 + padding: 1rem;
86 + }
87 +
88 + body > .articles > .path {
89 + margin-bottom: 1rem;
90 + }

+368/-0 A   static/css/mandoc.css
index 0000000..1dae127
old size: 0B - new size: 9K
new file mode: -rw-r--r--
@@ -0,0 +1,368 @@
1 + /* $Id: mandoc.css,v 1.52 2022/07/06 14:34:59 schwarze Exp $ */
2 + /*
3 + * Standard style sheet for mandoc(1) -Thtml and man.cgi(8).
4 + *
5 + * Written by Ingo Schwarze <schwarze@openbsd.org>.
6 + * I place this file into the public domain.
7 + * Permission to use, copy, modify, and distribute it for any purpose
8 + * with or without fee is hereby granted, without any conditions.
9 + */
10 +
11 + /* Global defaults. */
12 +
13 + html { max-width: 65em;
14 + --bg: #FFFFFF;
15 + --fg: #000000; }
16 + body { background: var(--bg);
17 + color: var(--fg);
18 + font-family: Helvetica,Arial,sans-serif; }
19 + h1, h2 { font-size: 110%; }
20 + table { margin-top: 0em;
21 + margin-bottom: 0em;
22 + border-collapse: collapse; }
23 + /* Some browsers set border-color in a browser style for tbody,
24 + * but not for table, resulting in inconsistent border styling. */
25 + tbody { border-color: inherit; }
26 + tr { border-color: inherit; }
27 + td { vertical-align: top;
28 + padding-left: 0.2em;
29 + padding-right: 0.2em;
30 + border-color: inherit; }
31 + ul, ol, dl { margin-top: 0em;
32 + margin-bottom: 0em; }
33 + li, dt { margin-top: 1em; }
34 + pre { font-family: inherit; }
35 +
36 + .permalink { border-bottom: thin dotted;
37 + color: inherit;
38 + font: inherit;
39 + text-decoration: inherit; }
40 + * { clear: both }
41 +
42 + /* Search form and search results. */
43 +
44 + fieldset { border: thin solid silver;
45 + border-radius: 1em;
46 + text-align: center; }
47 + input[name=expr] {
48 + width: 25%; }
49 +
50 + table.results { margin-top: 1em;
51 + margin-left: 2em;
52 + font-size: smaller; }
53 +
54 + /* Header and footer lines. */
55 +
56 + div[role=doc-pageheader] {
57 + display: flex;
58 + border-bottom: 1px dotted #808080;
59 + margin-bottom: 1em;
60 + font-size: smaller; }
61 + .head-ltitle { flex: 1; }
62 + .head-vol { flex: 0 1 auto;
63 + text-align: center; }
64 + .head-rtitle { flex: 1;
65 + text-align: right; }
66 +
67 + div[role=doc-pagefooter] {
68 + display: flex;
69 + justify-content: space-between;
70 + border-top: 1px dotted #808080;
71 + margin-top: 1em;
72 + font-size: smaller; }
73 + .foot-left { flex: 1; }
74 + .foot-date { flex: 0 1 auto;
75 + text-align: center; }
76 + .foot-os { flex: 1;
77 + text-align: right; }
78 +
79 + /* Sections and paragraphs. */
80 +
81 + main { margin-left: 3.8em; }
82 + .Nd { }
83 + section.Sh { }
84 + h2.Sh { margin-top: 1.2em;
85 + margin-bottom: 0.6em;
86 + margin-left: -3.2em; }
87 + section.Ss { }
88 + h3.Ss { margin-top: 1.2em;
89 + margin-bottom: 0.6em;
90 + margin-left: -1.2em;
91 + font-size: 105%; }
92 + .Pp { margin: 0.6em 0em; }
93 + .Sx { }
94 + .Xr { }
95 +
96 + /* Displays and lists. */
97 +
98 + .Bd { }
99 + .Bd-indent { margin-left: 3.8em; }
100 +
101 + .Bl-bullet { list-style-type: disc;
102 + padding-left: 1em; }
103 + .Bl-bullet > li { }
104 + .Bl-dash { list-style-type: none;
105 + padding-left: 0em; }
106 + .Bl-dash > li:before {
107 + content: "\2014 "; }
108 + .Bl-item { list-style-type: none;
109 + padding-left: 0em; }
110 + .Bl-item > li { }
111 + .Bl-compact > li {
112 + margin-top: 0em; }
113 +
114 + .Bl-enum { padding-left: 2em; }
115 + .Bl-enum > li { }
116 + .Bl-compact > li {
117 + margin-top: 0em; }
118 +
119 + .Bl-diag { }
120 + .Bl-diag > dt {
121 + font-style: normal;
122 + font-weight: bold; }
123 + .Bl-diag > dd {
124 + margin-left: 0em; }
125 + .Bl-hang { }
126 + .Bl-hang > dt { }
127 + .Bl-hang > dd {
128 + margin-left: 5.5em; }
129 + .Bl-inset { }
130 + .Bl-inset > dt { }
131 + .Bl-inset > dd {
132 + margin-left: 0em; }
133 + .Bl-ohang { }
134 + .Bl-ohang > dt { }
135 + .Bl-ohang > dd {
136 + margin-left: 0em; }
137 + .Bl-tag { margin-top: 0.6em;
138 + margin-left: 5.5em; }
139 + .Bl-tag > dt {
140 + float: left;
141 + margin-top: 0em;
142 + margin-left: -5.5em;
143 + padding-right: 0.5em;
144 + vertical-align: top; }
145 + .Bl-tag > dd {
146 + clear: right;
147 + column-count: 1; /* Force block formatting context. */
148 + width: 100%;
149 + margin-top: 0em;
150 + margin-left: 0em;
151 + margin-bottom: 0.6em;
152 + vertical-align: top; }
153 + .Bl-compact { margin-top: 0em; }
154 + .Bl-compact > dd {
155 + margin-bottom: 0em; }
156 + .Bl-compact > dt {
157 + margin-top: 0em; }
158 +
159 + .Bl-column { }
160 + .Bl-column > tbody > tr { }
161 + .Bl-column > tbody > tr > td {
162 + margin-top: 1em; }
163 + .Bl-compact > tbody > tr > td {
164 + margin-top: 0em; }
165 +
166 + .Rs { font-style: normal;
167 + font-weight: normal; }
168 + .RsA { }
169 + .RsB { font-style: italic;
170 + font-weight: normal; }
171 + .RsC { }
172 + .RsD { }
173 + .RsI { font-style: italic;
174 + font-weight: normal; }
175 + .RsJ { font-style: italic;
176 + font-weight: normal; }
177 + .RsN { }
178 + .RsO { }
179 + .RsP { }
180 + .RsQ { }
181 + .RsR { }
182 + .RsT { text-decoration: underline; }
183 + .RsU { }
184 + .RsV { }
185 +
186 + .eqn { }
187 + .tbl td { vertical-align: middle; }
188 +
189 + .HP { margin-left: 3.8em;
190 + text-indent: -3.8em; }
191 +
192 + /* Semantic markup for command line utilities. */
193 +
194 + table.Nm { }
195 + code.Nm { font-style: normal;
196 + font-weight: bold;
197 + font-family: inherit; }
198 + .Fl { font-style: normal;
199 + font-weight: bold;
200 + font-family: inherit; }
201 + .Cm { font-style: normal;
202 + font-weight: bold;
203 + font-family: inherit; }
204 + .Ar { font-style: italic;
205 + font-weight: normal; }
206 + .Op { display: inline flow; }
207 + .Ic { font-style: normal;
208 + font-weight: bold;
209 + font-family: inherit; }
210 + .Ev { font-style: normal;
211 + font-weight: normal;
212 + font-family: monospace; }
213 + .Pa { font-style: italic;
214 + font-weight: normal; }
215 +
216 + /* Semantic markup for function libraries. */
217 +
218 + .Lb { }
219 + code.In { font-style: normal;
220 + font-weight: bold;
221 + font-family: inherit; }
222 + a.In { }
223 + .Fd { font-style: normal;
224 + font-weight: bold;
225 + font-family: inherit; }
226 + .Ft { font-style: italic;
227 + font-weight: normal; }
228 + .Fn { font-style: normal;
229 + font-weight: bold;
230 + font-family: inherit; }
231 + .Fa { font-style: italic;
232 + font-weight: normal; }
233 + .Vt { font-style: italic;
234 + font-weight: normal; }
235 + .Va { font-style: italic;
236 + font-weight: normal; }
237 + .Dv { font-style: normal;
238 + font-weight: normal;
239 + font-family: monospace; }
240 + .Er { font-style: normal;
241 + font-weight: normal;
242 + font-family: monospace; }
243 +
244 + /* Various semantic markup. */
245 +
246 + .An { }
247 + .Lk { }
248 + .Mt { }
249 + .Cd { font-style: normal;
250 + font-weight: bold;
251 + font-family: inherit; }
252 + .Ad { font-style: italic;
253 + font-weight: normal; }
254 + .Ms { font-style: normal;
255 + font-weight: bold; }
256 + .St { }
257 + .Ux { }
258 +
259 + /* Physical markup. */
260 +
261 + .Bf { display: inline flow; }
262 + .No { font-style: normal;
263 + font-weight: normal; }
264 + .Em { font-style: italic;
265 + font-weight: normal; }
266 + .Sy { font-style: normal;
267 + font-weight: bold; }
268 + .Li { font-style: normal;
269 + font-weight: normal;
270 + font-family: monospace; }
271 +
272 + /* Tooltip support. */
273 +
274 + h2.Sh, h3.Ss { position: relative; }
275 + .An, .Ar, .Cd, .Cm, .Dv, .Em, .Er, .Ev, .Fa, .Fd, .Fl, .Fn, .Ft,
276 + .Ic, code.In, .Lb, .Lk, .Ms, .Mt, .Nd, code.Nm, .Pa, .Rs,
277 + .St, .Sx, .Sy, .Va, .Vt, .Xr {
278 + display: inline flow;
279 + position: relative; }
280 +
281 + .An::before { content: "An"; }
282 + .Ar::before { content: "Ar"; }
283 + .Cd::before { content: "Cd"; }
284 + .Cm::before { content: "Cm"; }
285 + .Dv::before { content: "Dv"; }
286 + .Em::before { content: "Em"; }
287 + .Er::before { content: "Er"; }
288 + .Ev::before { content: "Ev"; }
289 + .Fa::before { content: "Fa"; }
290 + .Fd::before { content: "Fd"; }
291 + .Fl::before { content: "Fl"; }
292 + .Fn::before { content: "Fn"; }
293 + .Ft::before { content: "Ft"; }
294 + .Ic::before { content: "Ic"; }
295 + code.In::before { content: "In"; }
296 + .Lb::before { content: "Lb"; }
297 + .Lk::before { content: "Lk"; }
298 + .Ms::before { content: "Ms"; }
299 + .Mt::before { content: "Mt"; }
300 + .Nd::before { content: "Nd"; }
301 + code.Nm::before { content: "Nm"; }
302 + .Pa::before { content: "Pa"; }
303 + .Rs::before { content: "Rs"; }
304 + h2.Sh::before { content: "Sh"; }
305 + h3.Ss::before { content: "Ss"; }
306 + .St::before { content: "St"; }
307 + .Sx::before { content: "Sx"; }
308 + .Sy::before { content: "Sy"; }
309 + .Va::before { content: "Va"; }
310 + .Vt::before { content: "Vt"; }
311 + .Xr::before { content: "Xr"; }
312 +
313 + .An::before, .Ar::before, .Cd::before, .Cm::before,
314 + .Dv::before, .Em::before, .Er::before, .Ev::before,
315 + .Fa::before, .Fd::before, .Fl::before, .Fn::before, .Ft::before,
316 + .Ic::before, code.In::before, .Lb::before, .Lk::before,
317 + .Ms::before, .Mt::before, .Nd::before, code.Nm::before,
318 + .Pa::before, .Rs::before,
319 + h2.Sh::before, h3.Ss::before, .St::before, .Sx::before, .Sy::before,
320 + .Va::before, .Vt::before, .Xr::before {
321 + opacity: 0;
322 + transition: .15s ease opacity;
323 + pointer-events: none;
324 + position: absolute;
325 + bottom: 100%;
326 + box-shadow: 0 0 .35em var(--fg);
327 + padding: .15em .25em;
328 + white-space: nowrap;
329 + font-family: Helvetica,Arial,sans-serif;
330 + font-style: normal;
331 + font-weight: bold;
332 + background: var(--bg);
333 + color: var(--fg); }
334 + .An:hover::before, .Ar:hover::before, .Cd:hover::before, .Cm:hover::before,
335 + .Dv:hover::before, .Em:hover::before, .Er:hover::before, .Ev:hover::before,
336 + .Fa:hover::before, .Fd:hover::before, .Fl:hover::before, .Fn:hover::before,
337 + .Ft:hover::before, .Ic:hover::before, code.In:hover::before,
338 + .Lb:hover::before, .Lk:hover::before, .Ms:hover::before, .Mt:hover::before,
339 + .Nd:hover::before, code.Nm:hover::before, .Pa:hover::before,
340 + .Rs:hover::before, h2.Sh:hover::before, h3.Ss:hover::before, .St:hover::before,
341 + .Sx:hover::before, .Sy:hover::before, .Va:hover::before, .Vt:hover::before,
342 + .Xr:hover::before {
343 + opacity: 1;
344 + pointer-events: inherit; }
345 +
346 + /* Overrides to avoid excessive margins on small devices. */
347 +
348 + @media (max-width: 37.5em) {
349 + main { margin-left: 0.5em; }
350 + h2.Sh, h3.Ss { margin-left: 0em; }
351 + .Bd-indent { margin-left: 2em; }
352 + .Bl-hang > dd {
353 + margin-left: 2em; }
354 + .Bl-tag { margin-left: 2em; }
355 + .Bl-tag > dt {
356 + margin-left: -2em; }
357 + .HP { margin-left: 2em;
358 + text-indent: -2em; }
359 + }
360 +
361 + /* Overrides for a dark color scheme for accessibility. */
362 +
363 + @media (prefers-color-scheme: dark) {
364 + html { --bg: #1E1F21;
365 + --fg: #EEEFF1; }
366 + :link { color: #BAD7FF; }
367 + :visited { color: #F6BAFF; }
368 + }

+24/-0 A   templates/article.html
index 0000000..220af04
old size: 0B - new size: 482B
new file mode: -rw-r--r--
@@ -0,0 +1,24 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}{{ data["a:title"] }}{% endblock %}
4 + {% block stylesheets %}
5 + <link href="/static/css/asciidoctor.css" rel="stylesheet">
6 + {% endblock %}
7 +
8 + {% block body %}
9 +
10 + <div class="articles">
11 +
12 + <div class="path">
13 + <a href="{{ url('homepage') }}">DOKK</a> /
14 + <a href="{{ url('articles') }}">articles</a> /
15 + {{ data["a:title"] }}
16 + </div>
17 +
18 + <h1>{{ data["a:title"] }}</h1>
19 +
20 + {{ data["a:html"]|safe }}
21 +
22 + </div>
23 +
24 + {% endblock %}

+21/-0 A   templates/articles.html
index 0000000..7d2e94d
old size: 0B - new size: 443B
new file mode: -rw-r--r--
@@ -0,0 +1,21 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}Articles{% endblock %}
4 +
5 + {% block body %}
6 +
7 + <div class="articles">
8 +
9 + <div class="path">
10 + <a href="{{ url('homepage') }}">DOKK</a> /
11 + articles
12 + </div>
13 +
14 + {% for article in data["results"]["bindings"] %}
15 + <p>
16 + <a href="{{ url('article', id=article['iri']['value'][14:]) }}">{{ article['title']['value'] }}</a>
17 + </p>
18 + {% endfor %}
19 + </div>
20 +
21 + {% endblock %}

+12/-0 A   templates/base.html
index 0000000..84dc0eb
old size: 0B - new size: 390B
new file mode: -rw-r--r--
@@ -0,0 +1,12 @@
1 + <!DOCTYPE html>
2 + <html lang="en">
3 + <head>
4 + <meta charset="utf-8">
5 + <meta name="viewport" content="width=device-width, initial-scale=1">
6 + <title>{% block title %}{% endblock %} · DOKK</title>
7 +
8 + <link href="/static/css/dokk.css" rel="stylesheet">
9 + {% block stylesheets %}{% endblock %}
10 + </head>
11 + <body>{% block body %}{% endblock %}</body>
12 + </html>

+33/-0 A   templates/index.html
index 0000000..fad87a0
old size: 0B - new size: 964B
new file mode: -rw-r--r--
@@ -0,0 +1,33 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}{% endblock %}
4 +
5 + {% block body %}
6 +
7 + <div class="index">
8 + <p><i>DOKK</i></p>
9 +
10 + <p>- <a href="{{ url('articles') }}">Articles</a></p>
11 + <p>- <a href="{{ url('library') }}">Library</a></p>
12 + <p>- <a href="{{ url('licenses') }}">Licenses</a></p>
13 + <p>- <a href="{{ url('manpages') }}">Man pages</a></p>
14 + <p>- <a href="{{ url('mimi_and_eunice') }}">Mimi & Eunice comic strips</a></p>
15 +
16 + <br /><br /><br /><br />
17 +
18 + <p>The DOKK is a free/libre database.</p>
19 + <p>If the data is useful to you, please download it, use it in your projects, share it, improve it!</p>
20 +
21 + <p>
22 + <a href="https://clif.peers.community/dokk/data.git/tree/HEAD">data repository</a>
23 + ·
24 + <a href="https://clif.peers.community/dokk/dokk.org.git">website repository</a>
25 + ·
26 + <a href="https://freepo.st/c/dokk">freepost</a>
27 + ·
28 +
29 + #peers (irc.libera.chat)
30 + </p>
31 + </div>
32 +
33 + {% endblock %}

+32/-0 A   templates/library.html
index 0000000..5041e9e
old size: 0B - new size: 725B
new file mode: -rw-r--r--
@@ -0,0 +1,32 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}Library{% endblock %}
4 +
5 + {% block body %}
6 +
7 + <div class="library">
8 + {% for item in data["@graph"]|sort(attribute="library:title") %}
9 + <p>
10 + <div>
11 + <a href="/library/{{ item['@id'][8:] }}">{{ item['library:title'] }}</a>
12 + </div>
13 +
14 + <div>
15 + Authors:
16 + {% for author in item["library:author"]|sort() %}
17 + {{ author }}
18 + {% endfor%}
19 + </div>
20 +
21 + <div>
22 + License:
23 + {% for license in item["library:license"]|sort(attribute="license:id") %}
24 + {{ license['license:id'] }}
25 + {% endfor%}
26 + </div>
27 + </p>
28 + <br/><br/>
29 + {% endfor %}
30 + </div>
31 +
32 + {% endblock %}

+37/-0 A   templates/library_item.html
index 0000000..6e83ed6
old size: 0B - new size: 936B
new file mode: -rw-r--r--
@@ -0,0 +1,37 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}{{ data['library:title'] }}{% endblock %}
4 +
5 + {% block body %}
6 +
7 + <div class="library_item">
8 + <div class="header">
9 + <a href="{{ url('library') }}">DOKK Library</a>
10 + </div>
11 +
12 + <div>
13 + <object type="application/pdf" data="https://blob.dokk.org/pdf/{{ item_id }}.pdf">
14 + <pre>{{ plaintext }}</pre>
15 + </object>
16 + </div>
17 +
18 + <div class="details">
19 + <h1>{{ data["library:title"] }}</h1>
20 +
21 + <p>
22 + <b>Authors</b>
23 + {% for author in data["library:author"]|sort() %}
24 + {{ author }}
25 + {% endfor%}
26 + </p>
27 +
28 + <p>
29 + <b>License</b>
30 + {% for license in data["library:license"]|sort(attribute="license:id") %}
31 + <a href="{{ url('license', id=license['license:id']) }}">{{ license['license:id'] }}</a>
32 + {% endfor%}
33 + </p>
34 + </div>
35 + </div>
36 +
37 + {% endblock %}

+22/-0 A   templates/license.html
index 0000000..915978d
old size: 0B - new size: 361B
new file mode: -rw-r--r--
@@ -0,0 +1,22 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}{{ data['license:name'] }}{% endblock %}
4 +
5 + {% block body %}
6 +
7 + <div class="">
8 + <p>
9 + {{ data['license:name'] }}
10 + </p>
11 + <p>
12 + {{ data['license:id'] }}
13 + </p>
14 + <p>
15 + {{ data['license:header'] }}
16 + </p>
17 + <p>
18 + <pre>{{ data['license:text'] }}</pre>
19 + </p>
20 + </div>
21 +
22 + {% endblock %}

+17/-0 A   templates/licenses.html
index 0000000..d0f8ec3
old size: 0B - new size: 327B
new file mode: -rw-r--r--
@@ -0,0 +1,17 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}Licenses{% endblock %}
4 +
5 + {% block body %}
6 +
7 + <div class="">
8 + {% for license in data["results"]["bindings"] %}
9 + <p>
10 + <div>
11 + <a href="/license/{{ license['id']['value'] }}">{{ license['name']['value'] }}</a>
12 + </div>
13 + </p>
14 + {% endfor %}
15 + </div>
16 +
17 + {% endblock %}

+24/-0 A   templates/manpage.html
index 0000000..3545d06
old size: 0B - new size: 777B
new file mode: -rw-r--r--
@@ -0,0 +1,24 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}{{ data['mp:name'] }}({{ data['mp:section'] }}){% endblock %}
4 + {% block stylesheets %}
5 + <link href="/static/css/mandoc.css" rel="stylesheet">
6 + {% endblock %}
7 +
8 + {% block body %}
9 +
10 + <div class="manpages">
11 +
12 + <div class="path">
13 + <a href="{{ url('homepage') }}">DOKK</a> /
14 + <a href="{{ url('manpages') }}">manpages</a> /
15 + <a href="{{ url('manpages_distribution', distribution=distribution, version=version) }}">{{ distribution }} {{ version }}</a> /
16 + <a href="{{ url('manpages_package', distribution=distribution, version=version, package=package) }}">{{ package }}</a> /
17 + {{ data["mp:source"]["mp:filename"] }}
18 + </div>
19 +
20 + <div class="manpage">{{ data["mp:html"]|safe }}</div>
21 +
22 + </div>
23 +
24 + {% endblock %}

+40/-0 A   templates/manpage_disambiguation.html
index 0000000..5dfde0b
old size: 0B - new size: 964B
new file mode: -rw-r--r--
@@ -0,0 +1,40 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}Man pages named {{ name }} in section {{ section }}{% endblock %}
4 +
5 + {% block body %}
6 +
7 + <div class="manpages">
8 +
9 + <div class="path">
10 + <a href="{{ url('homepage') }}">DOKK</a> /
11 + <a href="{{ url('manpages') }}">manpages</a>
12 + </div>
13 +
14 + <p>
15 + Man pages matching name <b>{{ name }}</b> in section <b>{{ section }}</b>:
16 + </p>
17 +
18 + <p>
19 + <table>
20 + {% for page in data["@graph"] %}
21 + <tr>
22 + <td>
23 + <a href="{{ url('manpages') }}/{{ page['@id'][3:] }}">
24 + {{ page['mp:source']['mp:filename'] }}
25 + </a>
26 + </td>
27 + <td>
28 + {{ page['mp:source']['mp:distribution_name'] }}
29 + {{ page['mp:source']['mp:distribution_version'] }}
30 + /
31 + {{ page['mp:source']['mp:package'] }}
32 + </td>
33 + </tr>
34 + {% endfor %}
35 + </table>
36 + </p>
37 +
38 + </div>
39 +
40 + {% endblock %}

+29/-0 A   templates/manpages.html
index 0000000..f5c5fe6
old size: 0B - new size: 637B
new file mode: -rw-r--r--
@@ -0,0 +1,29 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}man pages{% endblock %}
4 +
5 + {% block body %}
6 +
7 + <div class="manpages">
8 +
9 + <div class="path">
10 + <a href="{{ url('homepage') }}">DOKK</a> /
11 + manpages
12 + </div>
13 +
14 + <p>
15 + Distributions:
16 + </p>
17 +
18 + {% for result in data["results"]["bindings"] %}
19 + <div>
20 + <a href="{{ url('manpages_distribution', distribution=result['distribution']['value'], version=result['version']['value']) }}">
21 + {{ result["distribution"]["value"] }}
22 + {{ result["version"]["value"] }}
23 + </a>
24 + </div>
25 + {% endfor %}
26 +
27 + </div>
28 +
29 + {% endblock %}

+27/-0 A   templates/manpages_distribution.html
index 0000000..61bd30e
old size: 0B - new size: 647B
new file mode: -rw-r--r--
@@ -0,0 +1,27 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}{{ distribution }} {{ version }} man pages{% endblock %}
4 +
5 + {% block body %}
6 +
7 + <div class="manpages">
8 +
9 + <div class="path">
10 + <a href="{{ url('homepage') }}">DOKK</a> /
11 + <a href="{{ url('manpages') }}">manpages</a> /
12 + {{ distribution }} {{ version }}
13 + </div>
14 +
15 + <p>
16 + Packages:
17 + </p>
18 +
19 + {% for page in data['results']['bindings'] %}
20 + <div>
21 + <a href="{{ url('manpages_package', distribution=distribution, version=version, package=page['package']['value']) }}">{{ page['package']['value'] }}</a>
22 + </div>
23 + {% endfor %}
24 +
25 + </div>
26 +
27 + {% endblock %}

+28/-0 A   templates/manpages_package.html
index 0000000..1dc761d
old size: 0B - new size: 711B
new file mode: -rw-r--r--
@@ -0,0 +1,28 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}{{ package }} ({{ distribution }} {{ version }}) man pages{% endblock %}
4 +
5 + {% block body %}
6 +
7 + <div class="manpages">
8 +
9 + <div class="path">
10 + <a href="{{ url('homepage') }}">DOKK</a> /
11 + <a href="{{ url('manpages') }}">manpages</a> /
12 + <a href="{{ url('manpages_distribution', distribution=distribution, version=version) }}">{{ distribution }} {{ version }}</a> /
13 + {{ package }}
14 + </div>
15 +
16 + <p>
17 + Pages:
18 + </p>
19 +
20 + {% for page in data['results']['bindings'] %}
21 + <div>
22 + <a href="/manpages/{{ page['id']['value'][14:] }}">{{ page['filename']['value'] }}</a>
23 + </div>
24 + {% endfor %}
25 +
26 + </div>
27 +
28 + {% endblock %}

+16/-0 A   templates/mimi_and_eunice.html
index 0000000..04144e8
old size: 0B - new size: 391B
new file mode: -rw-r--r--
@@ -0,0 +1,16 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}Mimi & Eunice{% endblock %}
4 +
5 + {% block body %}
6 +
7 + <div class="">
8 + {% for comic_strip in data["results"]["bindings"] %}
9 + <p>
10 + {{ comic_strip['number']['value'] }} -
11 + <a href="{{ url('mimi_and_eunice_strip', number=comic_strip['number']['value']) }}">{{ comic_strip['title']['value'] }}</a>
12 + </p>
13 + {% endfor %}
14 + </div>
15 +
16 + {% endblock %}

+37/-0 A   templates/mimi_and_eunice_strip.html
index 0000000..7aeccd0
old size: 0B - new size: 1005B
new file mode: -rw-r--r--
@@ -0,0 +1,37 @@
1 + {% extends "base.html" %}
2 +
3 + {% block title %}Mimi&Eunice {{ data['@id'][12:] }}: {{ data['mimi_eunice:title'] }}{% endblock %}
4 +
5 + {% block body %}
6 +
7 + <div class="mimi_and_eunice_strip">
8 + <h1>{{ data['mimi_eunice:title'] }}</h1>
9 +
10 + <p>
11 + Published: {{ data['mimi_eunice:published'] }}
12 + </p>
13 + <p>
14 + Liense:
15 + <a href="{{ url('license', id=data['mimi_eunice:license']['license:id']) }}">{{ data['mimi_eunice:license']['license:id'] }}</a>
16 + </p>
17 + <p>
18 + Tags:
19 + {% for tag in data['mimi_eunice:tag']|sort %}
20 + {{ tag }}
21 + {% endfor %}
22 + </p>
23 +
24 + <img src="https://blob.dokk.org/images/mimi_and_eunice/{{ data['@id'][12:] }}.png" alt="" />
25 +
26 + <p>
27 + Transcript
28 +
29 + {% for line in data['mimi_eunice:transcript']|sort(attribute='mimi_eunice:order.@value') %}
30 + <div>
31 + <b>{{ line['mimi_eunice:character'] }}</b>: {{ line['mimi_eunice:text'] }}
32 + </div>
33 + {% endfor %}
34 + </p>
35 + </div>
36 +
37 + {% endblock %}