pylode 3.2.3__tar.gz → 3.3.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. pylode-3.2.3/README.md → pylode-3.3.4/PKG-INFO +106 -26
  2. pylode-3.2.3/PKG-INFO → pylode-3.3.4/README.md +75 -46
  3. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/ontpub.py +2 -2
  4. pylode-3.3.4/pylode/profiles/supermodel/component/properties_table.py +344 -0
  5. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/dataset.py +5 -1
  6. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/html.py +10 -1
  7. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/model.py +21 -1
  8. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/query/__init__.py +5 -0
  9. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/query/property_shape.py +90 -10
  10. {pylode-3.2.3 → pylode-3.3.4}/pylode/pylode.css +3 -0
  11. {pylode-3.2.3 → pylode-3.3.4}/pylode/rdf_elements.py +1 -0
  12. pylode-3.3.4/pylode/server.py +163 -0
  13. {pylode-3.2.3 → pylode-3.3.4}/pylode/utils.py +21 -11
  14. pylode-3.3.4/pyproject.toml +63 -0
  15. pylode-3.2.3/LICENSE +0 -29
  16. pylode-3.2.3/pylode/profiles/supermodel/component/properties_table.py +0 -212
  17. pylode-3.2.3/pylode/rdf/refs.pickle +0 -0
  18. pylode-3.2.3/pylode/rdf/refs_titles.pickle +0 -0
  19. pylode-3.2.3/pyproject.toml +0 -30
  20. {pylode-3.2.3 → pylode-3.3.4}/pylode/__init__.py +0 -0
  21. {pylode-3.2.3 → pylode-3.3.4}/pylode/__main__.py +0 -0
  22. {pylode-3.2.3 → pylode-3.3.4}/pylode/cli.py +0 -0
  23. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/__init__.py +0 -0
  24. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/__init__.py +0 -0
  25. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/component/__init__.py +0 -0
  26. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/component/example.py +0 -0
  27. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/component/heading.py +0 -0
  28. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/component/link.py +0 -0
  29. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/component/preamble.py +0 -0
  30. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/component/tooltip.py +0 -0
  31. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/fragment.py +0 -0
  32. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/loader.py +0 -0
  33. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/namespace.py +0 -0
  34. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/query/common.py +0 -0
  35. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/random.py +0 -0
  36. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/supermodel/state.py +0 -0
  37. {pylode-3.2.3 → pylode-3.3.4}/pylode/profiles/vocpub.py +0 -0
  38. {pylode-3.2.3 → pylode-3.3.4}/pylode/rdf/dcterms-mod.ttl +0 -0
  39. {pylode-3.2.3 → pylode-3.3.4}/pylode/rdf/licenses.ttl +0 -0
  40. {pylode-3.2.3 → pylode-3.3.4}/pylode/rdf/ontdoc.ttl +0 -0
  41. {pylode-3.2.3 → pylode-3.3.4}/pylode/rdf/owl.ttl +0 -0
  42. {pylode-3.2.3 → pylode-3.3.4}/pylode/rdf/prov.ttl +0 -0
  43. {pylode-3.2.3 → pylode-3.3.4}/pylode/rdf/rdf.ttl +0 -0
  44. {pylode-3.2.3 → pylode-3.3.4}/pylode/rdf/rdfs-mod.ttl +0 -0
  45. {pylode-3.2.3 → pylode-3.3.4}/pylode/rdf/sdo-mod.ttl +0 -0
  46. {pylode-3.2.3 → pylode-3.3.4}/pylode/rdf/skos.ttl +0 -0
  47. {pylode-3.2.3 → pylode-3.3.4}/pylode/rdf/void.ttl +0 -0
  48. {pylode-3.2.3 → pylode-3.3.4}/pylode/static/asciidoc.css +0 -0
  49. {pylode-3.2.3 → pylode-3.3.4}/pylode/static/hierarchy.css +0 -0
  50. {pylode-3.2.3 → pylode-3.3.4}/pylode/static/hierarchy.js +0 -0
  51. {pylode-3.2.3 → pylode-3.3.4}/pylode/static/property-table-row.js +0 -0
  52. {pylode-3.2.3 → pylode-3.3.4}/pylode/static/pylode.css +0 -0
  53. {pylode-3.2.3 → pylode-3.3.4}/pylode/version.py +0 -0
@@ -1,3 +1,34 @@
1
+ Metadata-Version: 2.4
2
+ Name: pylode
3
+ Version: 3.3.4
4
+ Summary: An OWL ontology documentation tool using Python, based on LODE.
5
+ Author: Nicholas Car
6
+ Author-email: Nicholas Car <nick@kurrawong.ai>
7
+ License-Expression: BSD-3-Clause
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.9
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Programming Language :: Python :: 3.14
15
+ Requires-Dist: rdflib>=7.5.0,<8.0.0
16
+ Requires-Dist: markdown>=3.3.7,<4
17
+ Requires-Dist: dominate>=2.6.0,<3
18
+ Requires-Dist: html5lib>=1.1,<2
19
+ Requires-Dist: httpx>=0.25.0,<1.0.0
20
+ Requires-Dist: tqdm>=4.67.3
21
+ Requires-Dist: bs4>=0.0.2 ; extra == 'server'
22
+ Requires-Dist: falcon>=4.2.0 ; extra == 'server'
23
+ Requires-Dist: validators>=0.35.0 ; extra == 'server'
24
+ Requires-Python: >=3.9, <4
25
+ Project-URL: Homepage, https://github.com/RDFLib/pyLODE
26
+ Project-URL: Documentation, https://github.com/RDFLib/pyLODE
27
+ Project-URL: Source, https://github.com/RDFLib/pyLODE
28
+ Project-URL: Changelog, https://github.com/RDFLib/pyLODE/releases
29
+ Provides-Extra: server
30
+ Description-Content-Type: text/markdown
31
+
1
32
  ![pyLODE logo](https://rawcdn.githack.com/RDFLib/pyLODE/master/img/pyLODE-250.png)
2
33
  [![PyPI version](https://badge.fury.io/py/pyLODE.svg)](https://badge.fury.io/py/pyLODE)
3
34
 
@@ -88,13 +119,13 @@ optional arguments:
88
119
 
89
120
  ### Basic Use
90
121
 
91
- **As a Python script**
122
+ #### As a Python script
92
123
 
93
124
  ```bash
94
125
  python pylode examples/ontpub/minimal.ttl -o minimal.html
95
126
  ```
96
127
 
97
- **As a Docker container**
128
+ #### As a Docker container
98
129
 
99
130
  ```bash
100
131
  docker build -t pylode:latest .
@@ -107,9 +138,71 @@ docker run --mount 'type=bind,src=<ttl_directory>,target=/app/pylode/data' \
107
138
 
108
139
  > Note: `<ttl_directory>` must be absolute
109
140
 
141
+ #### Via a stand-alone server
142
+
143
+ The pyLODE server uses the popular [Falcon framework](https://falconframework.org/) to implement a lightweight web api.
144
+
145
+ It can be run standalone as a single-thread, single process HTTP server, or more robustly as a WSGI application with
146
+ [GUnicorn](https://gunicorn.org/).
147
+
148
+ In all launch methods listed here, the server will be available at http://localhost:8000 for the landing page and http://localhost:8000/pylode for the active endpoint.
149
+
150
+ The active endpoint accepts the following querystring parameters:
151
+
152
+ * `url` for the absolute URL of the ontology document that you wish to render. The server hosting that ontology document must be capable of responding to Content Negotiation,
153
+ i.e. it must supply RDF according to an HTTP `Accept` request for `text/turtle`, `application/rdf+xml` etc.
154
+ * `profile` for the profile to use to generate HTML. Must be one of:
155
+ * `ontpub` (https://w3id.org/profile/ontpub) for ontologies. This is the default if no ``profile`` is provided.
156
+ * `vocpub` (https://w3id.org/profile/vocpub) for SKOS vocabularies
157
+ * `supermodel` for profiles of profiles
158
+ * `sort` to indicate whether subjects should be sorted in the rendered output. Must be one of:
159
+ * `true` to sort the subjects (this is the default)
160
+ * `false` to NOT sort the subjects
161
+
162
+ Here's an example of use with the [AGIF Ontology](https://linked.data.gov.au/def/agrif) using the source in this repository:
163
+
164
+ ```bash
165
+ http://localhost:8000/pylode?url=https://raw.githubusercontent.com/RDFLib/pyLODE/refs/heads/master/examples/ontpub/agrif.ttl
166
+ ```
167
+
168
+ The LODE responses generated by the server can be globally customised by setting the following optional environment variables:
169
+
170
+ * `CSS_URL` can be set to the absolute URL of a CSS stylesheet hosted elsewhere that should be referenced by pyLODE documents
171
+ * `FAVICON_URL` can be set to the absolute URL of a favicon image hosted elsewhere that should be referenced by pyLODE documents
172
+ * `FAVICON_MIME` should be set to the MIME type of the resource at ``FAVICON_URL`` if that has been configured (e.g. ``image/png`)
173
+ * `GTAGID` can be set to a Google Analytics Tag ID that you would like to use for tracking requests to your server.
174
+
175
+ **Launch the pyLODE server standalone from your local directory:**
176
+
177
+ You will need a few extra python modules installed locally:
178
+
179
+ ```
180
+ pip install bs4 falcon validators
181
+ ```
182
+
183
+ You can then run the pyLODE Server in standalone mode like this:
184
+
185
+ ```
186
+ python -m pylode.server
187
+ ```
188
+
189
+ **Build and run the docker image for the pyLODE Standalone Server:**
190
+
191
+ ```
192
+ docker build --target=pylode-server -t pylode-server:latest .
193
+ docker run --rm -p 8000:8000 pylode-server:latest
194
+ ```
195
+
196
+ **Build and run the docker image for the pyLODE GUnicorn Server:**
197
+
198
+ ```
199
+ docker build --target=pylode-gunicorn -t pylode-gunicorn:latest .
200
+ docker run --rm -p 8000:8000 pylode-gunicorn:latest
201
+ ```
202
+
110
203
  ### Module Use
111
204
 
112
- **For OWL**
205
+ #### For OWL
113
206
 
114
207
  ```python
115
208
  from pylode.profiles.ontpub import OntPub
@@ -119,7 +212,7 @@ html = od.make_html()
119
212
  od.make_html(destination="some-resulting-html-file.html")
120
213
  ```
121
214
 
122
- **For SKOS**
215
+ #### For SKOS
123
216
 
124
217
  ```python
125
218
  from pylode.profiles.vocpub import VocPub
@@ -203,20 +296,12 @@ python -m pytest tests --disable-warnings
203
296
 
204
297
  ## Releases
205
298
 
206
- **Current release:** **3.2.3**
299
+ Since version 3.0.1, we have moved to documenting releases in GitHub: https://github.com/RDFLib/pyLODE/releases
207
300
 
208
- ### Release Schedule
301
+ Older releasese
209
302
 
210
303
  | Version | Date | Description |
211
304
  |---------|------------------|---------------------------------------------------------------------------------|
212
- | 3.2.3 | 27 January 2026 | Updating dependencies & release procedure. Tidy testing cleanup |
213
- | 3.2.1 | 31 January 2025 | Fix version number in version.py |
214
- | 3.2.0 | 27 July 2024 | dependency updates and merged multiple small PRs |
215
- | 3.1.4 | 6 April 2024 | Fix load_ontology function's detection of data input |
216
- | 3.1.3 | 18 March 2024 | Relax rdflib version constraint |
217
- | 3.1.2 | 18 March 2024 | Relax httpx version constraint |
218
- | 3.1.1 | 19 February 2024 | Fix release |
219
- | 3.1.0 | 19 February 2024 | Add supermodel mode - supports documenting profiles and modules |
220
305
  | 3.0.5 | 27 April 2023 | Minor patching |
221
306
  | 3.0.4 | 24 May 2022 | Use of Poetry |
222
307
  | 3.0.2 | 24 May 2022 | Support for preformatted skos:example literals |
@@ -258,25 +343,20 @@ But the very best thing you could do is create a Pull Request for us to action!
258
343
  **Author:**
259
344
  Nicholas Car
260
345
  *Data Architect*
261
- [Kurrawong AI](https://kurrawong.ai)
346
+ [KurrawongAI](https://kurrawong.ai)
262
347
  <nick@kurrawong.ai>
263
348
 
264
349
  ## Release Procedure
265
350
 
266
351
  1. tidy code: `$ task format`
267
352
  2. pass all tests: `$ task test`
268
- 3. increment version number
269
- * in `pyproject.toml`
270
- * in README.md, 'Current Release' & 'Release Schedule'
353
+ 3. increment version number in `pyproject.toml`
271
354
  4. commit all changes `$ git commit -a "..."`
272
355
  5. tag with version number: `$git tag ...`
273
356
  6. push changes `$ git push`
274
357
  7. push version `git push --tags`
275
- 8. publish on PyPI:
276
- * `poetry build`
277
- * `poetry publish -u __token__ -p {TOKEN}`
278
- 9. make a GitHub release
279
- * include `/dist` build artifacts
280
- 10. increment version number to next release in `pyproject.toml`
281
- 11. commit all changes `$ git commit -a "..."`
282
- 12. push changes `$ git push`
358
+ 8make a GitHub release
359
+ * PyPI release is automated from this in `pypi.yml`
360
+ 9. increment version number to next release alpha in `pyproject.toml`
361
+ 10. commit all changes `$ git commit -a "..."`
362
+ 1push changes `$ git push`
@@ -1,23 +1,3 @@
1
- Metadata-Version: 2.3
2
- Name: pylode
3
- Version: 3.2.3
4
- Summary: An OWL ontology documentation tool using Python, based on LODE.
5
- Author: Nicholas Car
6
- Author-email: nick@kurrawong.ai
7
- Requires-Python: >=3.9,<4.0
8
- Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.9
10
- Classifier: Programming Language :: Python :: 3.10
11
- Classifier: Programming Language :: Python :: 3.11
12
- Classifier: Programming Language :: Python :: 3.12
13
- Classifier: Programming Language :: Python :: 3.13
14
- Requires-Dist: Markdown (>=3.3.7,<4.0.0)
15
- Requires-Dist: dominate (>=2.6.0,<3.0.0)
16
- Requires-Dist: html5lib (>=1.1,<2.0)
17
- Requires-Dist: httpx (>=0.25.0,<1.0.0)
18
- Requires-Dist: rdflib (>=7.0.0,<8.0.0)
19
- Description-Content-Type: text/markdown
20
-
21
1
  ![pyLODE logo](https://rawcdn.githack.com/RDFLib/pyLODE/master/img/pyLODE-250.png)
22
2
  [![PyPI version](https://badge.fury.io/py/pyLODE.svg)](https://badge.fury.io/py/pyLODE)
23
3
 
@@ -108,13 +88,13 @@ optional arguments:
108
88
 
109
89
  ### Basic Use
110
90
 
111
- **As a Python script**
91
+ #### As a Python script
112
92
 
113
93
  ```bash
114
94
  python pylode examples/ontpub/minimal.ttl -o minimal.html
115
95
  ```
116
96
 
117
- **As a Docker container**
97
+ #### As a Docker container
118
98
 
119
99
  ```bash
120
100
  docker build -t pylode:latest .
@@ -127,9 +107,71 @@ docker run --mount 'type=bind,src=<ttl_directory>,target=/app/pylode/data' \
127
107
 
128
108
  > Note: `<ttl_directory>` must be absolute
129
109
 
110
+ #### Via a stand-alone server
111
+
112
+ The pyLODE server uses the popular [Falcon framework](https://falconframework.org/) to implement a lightweight web api.
113
+
114
+ It can be run standalone as a single-thread, single process HTTP server, or more robustly as a WSGI application with
115
+ [GUnicorn](https://gunicorn.org/).
116
+
117
+ In all launch methods listed here, the server will be available at http://localhost:8000 for the landing page and http://localhost:8000/pylode for the active endpoint.
118
+
119
+ The active endpoint accepts the following querystring parameters:
120
+
121
+ * `url` for the absolute URL of the ontology document that you wish to render. The server hosting that ontology document must be capable of responding to Content Negotiation,
122
+ i.e. it must supply RDF according to an HTTP `Accept` request for `text/turtle`, `application/rdf+xml` etc.
123
+ * `profile` for the profile to use to generate HTML. Must be one of:
124
+ * `ontpub` (https://w3id.org/profile/ontpub) for ontologies. This is the default if no ``profile`` is provided.
125
+ * `vocpub` (https://w3id.org/profile/vocpub) for SKOS vocabularies
126
+ * `supermodel` for profiles of profiles
127
+ * `sort` to indicate whether subjects should be sorted in the rendered output. Must be one of:
128
+ * `true` to sort the subjects (this is the default)
129
+ * `false` to NOT sort the subjects
130
+
131
+ Here's an example of use with the [AGIF Ontology](https://linked.data.gov.au/def/agrif) using the source in this repository:
132
+
133
+ ```bash
134
+ http://localhost:8000/pylode?url=https://raw.githubusercontent.com/RDFLib/pyLODE/refs/heads/master/examples/ontpub/agrif.ttl
135
+ ```
136
+
137
+ The LODE responses generated by the server can be globally customised by setting the following optional environment variables:
138
+
139
+ * `CSS_URL` can be set to the absolute URL of a CSS stylesheet hosted elsewhere that should be referenced by pyLODE documents
140
+ * `FAVICON_URL` can be set to the absolute URL of a favicon image hosted elsewhere that should be referenced by pyLODE documents
141
+ * `FAVICON_MIME` should be set to the MIME type of the resource at ``FAVICON_URL`` if that has been configured (e.g. ``image/png`)
142
+ * `GTAGID` can be set to a Google Analytics Tag ID that you would like to use for tracking requests to your server.
143
+
144
+ **Launch the pyLODE server standalone from your local directory:**
145
+
146
+ You will need a few extra python modules installed locally:
147
+
148
+ ```
149
+ pip install bs4 falcon validators
150
+ ```
151
+
152
+ You can then run the pyLODE Server in standalone mode like this:
153
+
154
+ ```
155
+ python -m pylode.server
156
+ ```
157
+
158
+ **Build and run the docker image for the pyLODE Standalone Server:**
159
+
160
+ ```
161
+ docker build --target=pylode-server -t pylode-server:latest .
162
+ docker run --rm -p 8000:8000 pylode-server:latest
163
+ ```
164
+
165
+ **Build and run the docker image for the pyLODE GUnicorn Server:**
166
+
167
+ ```
168
+ docker build --target=pylode-gunicorn -t pylode-gunicorn:latest .
169
+ docker run --rm -p 8000:8000 pylode-gunicorn:latest
170
+ ```
171
+
130
172
  ### Module Use
131
173
 
132
- **For OWL**
174
+ #### For OWL
133
175
 
134
176
  ```python
135
177
  from pylode.profiles.ontpub import OntPub
@@ -139,7 +181,7 @@ html = od.make_html()
139
181
  od.make_html(destination="some-resulting-html-file.html")
140
182
  ```
141
183
 
142
- **For SKOS**
184
+ #### For SKOS
143
185
 
144
186
  ```python
145
187
  from pylode.profiles.vocpub import VocPub
@@ -223,20 +265,12 @@ python -m pytest tests --disable-warnings
223
265
 
224
266
  ## Releases
225
267
 
226
- **Current release:** **3.2.3**
268
+ Since version 3.0.1, we have moved to documenting releases in GitHub: https://github.com/RDFLib/pyLODE/releases
227
269
 
228
- ### Release Schedule
270
+ Older releasese
229
271
 
230
272
  | Version | Date | Description |
231
273
  |---------|------------------|---------------------------------------------------------------------------------|
232
- | 3.2.3 | 27 January 2026 | Updating dependencies & release procedure. Tidy testing cleanup |
233
- | 3.2.1 | 31 January 2025 | Fix version number in version.py |
234
- | 3.2.0 | 27 July 2024 | dependency updates and merged multiple small PRs |
235
- | 3.1.4 | 6 April 2024 | Fix load_ontology function's detection of data input |
236
- | 3.1.3 | 18 March 2024 | Relax rdflib version constraint |
237
- | 3.1.2 | 18 March 2024 | Relax httpx version constraint |
238
- | 3.1.1 | 19 February 2024 | Fix release |
239
- | 3.1.0 | 19 February 2024 | Add supermodel mode - supports documenting profiles and modules |
240
274
  | 3.0.5 | 27 April 2023 | Minor patching |
241
275
  | 3.0.4 | 24 May 2022 | Use of Poetry |
242
276
  | 3.0.2 | 24 May 2022 | Support for preformatted skos:example literals |
@@ -278,25 +312,20 @@ But the very best thing you could do is create a Pull Request for us to action!
278
312
  **Author:**
279
313
  Nicholas Car
280
314
  *Data Architect*
281
- [Kurrawong AI](https://kurrawong.ai)
315
+ [KurrawongAI](https://kurrawong.ai)
282
316
  <nick@kurrawong.ai>
283
317
 
284
318
  ## Release Procedure
285
319
 
286
320
  1. tidy code: `$ task format`
287
321
  2. pass all tests: `$ task test`
288
- 3. increment version number
289
- * in `pyproject.toml`
290
- * in README.md, 'Current Release' & 'Release Schedule'
322
+ 3. increment version number in `pyproject.toml`
291
323
  4. commit all changes `$ git commit -a "..."`
292
324
  5. tag with version number: `$git tag ...`
293
325
  6. push changes `$ git push`
294
326
  7. push version `git push --tags`
295
- 8. publish on PyPI:
296
- * `poetry build`
297
- * `poetry publish -u __token__ -p {TOKEN}`
298
- 9. make a GitHub release
299
- * include `/dist` build artifacts
300
- 10. increment version number to next release in `pyproject.toml`
301
- 11. commit all changes `$ git commit -a "..."`
302
- 12. push changes `$ git push`
327
+ 8make a GitHub release
328
+ * PyPI release is automated from this in `pypi.yml`
329
+ 9. increment version number to next release alpha in `pyproject.toml`
330
+ 10. commit all changes `$ git commit -a "..."`
331
+ 1push changes `$ git push`
@@ -275,7 +275,7 @@ class OntPub:
275
275
  def _make_head(
276
276
  self, schema_org: Graph, include_css: bool = True, destination: Path = None
277
277
  ):
278
- """Healper function for make_html(). Makes <head>???</head> content"""
278
+ """Helper function for make_html(). Makes <head>???</head> content"""
279
279
  with self.doc.head:
280
280
  # use standard pyLODE stylesheet
281
281
  if include_css:
@@ -312,7 +312,7 @@ class OntPub:
312
312
  )
313
313
 
314
314
  def _make_body(self):
315
- """Healper function for make_html(). Makes <body>???</body> content.
315
+ """Helper function for make_html(). Makes <body>???</body> content.
316
316
 
317
317
  Just calls other helper functions in order"""
318
318
  make_pylode_logo(