diff --git a/docs/changelog.md b/docs/changelog.md
index 1a11d475..2f333b0a 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -20,6 +20,8 @@ See the [Contributing Guide](contributing.md) for details.
performance for repeated inline patterns (#1619).
* Officially support Python 3.15 and drop support for Python 3.10
* Walk backtick runs in `BacktickInlineProcessor` without a regex (#1620).
+* Switch static site generator for documentation from MkDocs to Zensical
+ (#1627, #1635, #1637, and #1638).
### Fixed
diff --git a/docs/cli.md b/docs/cli.md
index e5376944..abdab3b0 100644
--- a/docs/cli.md
+++ b/docs/cli.md
@@ -20,7 +20,7 @@ Python-Markdown's command line script takes advantage of Python's `-m` flag.
Therefore, assuming the python executable is on your system path, use the
following format:
-```bash
+``` shell
python -m markdown [options] [args]
```
@@ -28,14 +28,48 @@ That will run the module as a script with the options and arguments provided.
At its most basic usage, one would simply pass in a file name as the only argument:
-```bash
+``` shell
python -m markdown input_file.txt
```
Use the `--help` option for a list of all available options and arguments:
-```bash
-python -m markdown --help
+``` console
+$ python -m markdown --help
+Usage: __main__.py [options] [INPUTFILE]
+ (STDIN is assumed if no INPUTFILE is given)
+
+A Python implementation of John Gruber's Markdown. https://python-
+markdown.github.io/
+
+Options:
+ --version show program's version number and exit
+ -h, --help show this help message and exit
+ -f OUTPUT_FILE, --file=OUTPUT_FILE
+ Write output to OUTPUT_FILE. Defaults to STDOUT.
+ -e ENCODING, --encoding=ENCODING
+ Encoding for input and output files.
+ -o OUTPUT_FORMAT, --output_format=OUTPUT_FORMAT
+ Use output format 'xhtml' (default) or 'html'.
+ -x EXTENSION, --extension=EXTENSION
+ Load extension EXTENSION.
+ -c CONFIG_FILE, --extension_configs=CONFIG_FILE
+ Read extension configurations from CONFIG_FILE.
+ CONFIG_FILE must be of JSON or YAML format. YAML
+ format requires that a python YAML library be
+ installed. The parsed JSON or YAML must result in a
+ python dictionary which would be accepted by the
+ 'extension_configs' keyword on the markdown.Markdown
+ class. The extensions must also be loaded with the
+ `--extension` option.
+ -q, --quiet Suppress all warnings.
+ -v, --verbose Print all warnings.
+ --noisy Print debug messages.
+
+WARNING: The Python-Markdown library does NOT sanitize its HTML output. If you
+are processing Markdown input from an untrusted source, it is your
+responsibility to ensure that it is properly sanitized. For more information
+see .
```
!!! warning
@@ -50,14 +84,15 @@ python -m markdown --help
Piping input and output (on `STDIN` and `STDOUT`) is fully supported.
For example:
-```bash
+``` shell { title="Console" }
echo "Some **Markdown** text." | python -m markdown > output.html
```
-The above command would generate a file named `output.html` with the following content:
-```html
+/// html | div.result
+```html { title='output.html'}
Some Markdown Text.
```
+///
As Python-Markdown only ever outputs HTML fragments (no ``, ``,
and `` tags), it is generally expected that the command line interface
@@ -67,13 +102,12 @@ otherwise empty ``, ``, and `` tags,
[JustHTML](https://emilstenstrom.github.io/justhtml/) can do that with with
a single command:
-```bash
+``` shell { title="Console" }
echo "Some **Markdown** text." | python -m markdown | justhtml - --fragment > output.html
```
-The above command would generate a file named `output.html` with the following content:
-
-```html
+/// html | div.result
+```html { title='output.html'}
@@ -81,6 +115,7 @@ The above command would generate a file named `output.html` with the following c
```
+///
If you don't need or want JustHTML's HTML sanitation, you can disable it with the
`--unsafe` flag, although that is not recommended. See JustHTML's
@@ -98,19 +133,19 @@ notation to point to an extension
For example, to load an extension with the assigned entry point name `myext`,
run the following command:
-```bash
+``` shell
python -m markdown -x myext input.txt
```
And to load an extension with Python's dot notation:
-```bash
+``` shell
python -m markdown -x path.to.module:MyExtClass input.txt
```
To load multiple extensions, specify an `-x` option for each extension:
-```bash
+``` shell
python -m markdown -x myext -x path.to.module:MyExtClass input.txt
```
@@ -118,7 +153,7 @@ If the extension supports configuration options (see the documentation for the
extension you are using to determine what settings it supports, if any), you
can pass them in as well:
-```bash
+``` shell
python -m markdown -x myext -c config.yml input.txt
```
@@ -128,7 +163,7 @@ map to a Python Dictionary in the format required by the
[`extension_configs`][ec] keyword of the `markdown.Markdown` class. Therefore,
the file `config.yaml` referenced in the above example might look like this:
-```yaml
+``` yaml
myext:
option1: 'value1'
option2: True
@@ -136,7 +171,7 @@ myext:
Similarly, a JSON configuration file might look like this:
-```json
+``` json
{
"myext":
{
@@ -216,18 +251,18 @@ path.
To use `markdown_py` from the command line, run it as
-```bash
+``` shell
markdown_py input_file.txt
```
or
-```bash
+``` shell
markdown_py input_file.txt > output_file.html
```
For a complete list of options, run
-```bash
+``` shell
markdown_py --help
```
diff --git a/docs/contributing.md b/docs/contributing.md
index 4103b976..7a015846 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -218,8 +218,8 @@ The documentation is built from the [Markdown] source files in the
[`docs` directory][docs directory] by the [Zensical] static site generator.
In addition to the basic Markdown syntax, the following extensions are
supported: [abbr], [admonition], [attr_list], [def_list], [footnotes],
-[md_in_html], [smarty], [toc], [mdx_gh_links], [pymdownx.highlight], and
-[pymdownx.superfences].
+[md_in_html], [smarty], [toc], [mdx_gh_links], [pymdownx.blocks.html],
+[pymdownx.highlight], and [pymdownx.superfences].
There are a few conventions you should follow when working on the
documentation.
@@ -321,7 +321,8 @@ highlighting.
There are two special types of code blocks which will render output based on
the content of the code block. See [Rendered Markdown](#rendered-markdown)
-and [Rendered Python](#rendered-python) below.
+and [Rendered Python](#rendered-python) below. Alternatively, result blocks
+can be [manually constructed](#manual-result-blocks).
##### Rendered Markdown
@@ -335,11 +336,11 @@ Some *Markdown* text.
```
````
-The above code block will be rendered at follows:
-
+/// html | div.result
``` md-render
Some *Markdown* text.
```
+///
The rendered output is generated by an isolated Markdown instance, which is
separate from the body text of the document. Extensions and configuration
@@ -350,6 +351,9 @@ are passed on to the isolated Markdown instance.The YAML front-matter is
stripped from the body of the code block before the code block is passing to
the isolated Markdown instance.
+The example below will be rendered with the `toc` extension and that
+extension's `permalinks` option enabled.
+
```` markdown
``` md-render
---
@@ -362,9 +366,7 @@ extension_configs:
```
````
-The above code block would be rendered with the `toc` extension and that
-extension's `permalinks` option enabled as follows:
-
+/// html | div.result
``` md-render
---
extensions: [toc]
@@ -374,6 +376,7 @@ extension_configs:
---
# A Markdown header
```
+///
Note that the YAML front-matter must be deliminated by a line of at least three
hyphens (both before and after) and be valid YAML. Any invalid formatting or
@@ -391,11 +394,11 @@ Some *Markdown* text.
```
````
-The above code block would render as follows:
-
+/// html | div.result
``` markdown
Some *Markdown* text.
```
+///
##### Rendered Python
@@ -413,14 +416,14 @@ fragment = markdown.markdown(src)
```
````
-The above code block will be rendered as follows:
-
+/// html | div.result
``` py-render { output-lang='html' }
import markdown
src = 'Some **Markdown** text.'
fragment = markdown.markdown(src)
```
+///
Note that the Python code is executed in an isolated environment. Therefore,
any imports need to be made to avoid errors. However, as all `py-render`
@@ -429,6 +432,10 @@ needs to be made once (before the first use) for all code blocks on the same
page. Variables assigned in one block will be available in later blocks on the
same page.
+In the example below, the variable `fragment` from the previous code
+block is available within this code block. However, `JustHTML` needs to be
+imported as it had not been previously.
+
```` markdown
``` py-render { output-lang='html' }
from justhtml import JustHTML
@@ -437,15 +444,13 @@ html = JustHTML(fragment).to_html()
```
````
-Notice that in the block above, the variable `fragment` from the previous code
-block is available within this code block. However, `JustHTML` needs to be
-imported as it had not been previously.
-
+/// html | div.result
``` py-render { output-lang='html' }
from justhtml import JustHTML
html = JustHTML(fragment).to_html()
```
+///
Each page contains it's own isolated environment. Objects defined on one page
will not be available on another page and would need to be redefined.
@@ -478,6 +483,42 @@ Code blocks which contain Python Console sessions are not supported by
as copied out of a Python Console session. Any objects defined in Python
Session code blocks will **not** be available to `py-render` style blocks.
+##### Manual Result Blocks
+
+To create a result block for input which is not Markdown or Python code, the
+block can be created manually using the [pymdownx.blocks.html] extension.
+For example, to show the contents of a file generated by a command line call:
+
+```` text
+``` shell { title="Console" }
+echo "Some **Markdown** text." | python -m markdown > output.html
+```
+
+/// html | div.result
+``` html { title='output.html'}
+Some Markdown Text.
+```
+///
+````
+//// html | div.result
+``` shell { title="Console" }
+echo "Some **Markdown** text." | python -m markdown > output.html
+```
+
+/// html | div.result
+``` html { title='output.html'}
+Some Markdown Text.
+```
+///
+////
+
+Note that a normal code block must be immediatley followed by a `` element which contains the result. The result block may
+contain anything, but is generally expected to contain another code block.
+The resulting code block may have a title assigned to it to clarify that it
+is the result of the preceeding code block (in this case, the name of the
+output file).
+
#### Changelog
Any commit/pull request which changes the behavior of the Markdown library in
@@ -531,7 +572,7 @@ environment], which isolates any experimental code from the general system. To
create a virtual environment, use the following command from the root of the
local working copy of your GitHub fork:
-```sh
+```shell
virtualenv venv
```
@@ -543,13 +584,13 @@ very reason.
On Posix systems (Linux, BSD, MacOS, etc.), use the following command to
activate the environment:
-```sh
+```shell
source venv/bin/activate
```
On Windows, use this command instead:
-```sh
+```shell
venv/Scripts/activate
```
@@ -559,7 +600,7 @@ To be able to run the Markdown library directly while working on it, install the
working copy into the environment in [Development Mode] after activating the
virtual environment for the first time:
-```sh
+```shell
pip install -e .
```
@@ -568,46 +609,46 @@ environment.
You can run the command line script with the following command:
-```sh
+```shell
python -m markdown
```
Before building the documentation for the first time, you will need to install
some optional dependencies with the command:
-```sh
+```shell
pip install -e .[docs]
```
To build the documentation and serve it locally on a development server, run:
-```sh
-mkdocs serve
+```shell
+python -m zensical serve
```
Then point your browser at `http://127.0.0.1:8000/`. For a complete list of
options available, view MkDocs' help with the command:
-```sh
-mkdocs --help
+```shell
+python -m zensical --help
```
Before running tests for the first time, you will need to install some optional
dependencies with the command:
-```sh
+```shell
pip install -e .[testing]
```
And you can directly run the tests with:
-```sh
+```shell
python -m unittest discover tests
```
To get a coverage report after running the tests, use these commands instead:
-```sh
+```shell
coverage run --source=markdown -m unittest discover tests
coverage report --show-missing
```
@@ -630,7 +671,7 @@ tests for the continuous integration server to run when a pull request is
submitted, for more advanced changes, you may want to run those tests locally.
To do so, simply install tox:
-```sh
+```shell
pip install tox
```
@@ -748,14 +789,18 @@ following steps:
- Deploy the release to [PyPI] with the command `make deploy` (a valid
authentication token will need to be provided).
- - Deploy an update to the documentation using [MkDocs]. The following example
+ - Deploy an update to the documentation using [Zensical]. The following example
assumes that local clones of the [Python-Markdown/markdown] and
[`Python-Markdown/Python-Markdown.github.io`][Python-Markdown/Python-Markdown.github.io]
repositories are in sibling directories named `markdown` and `Python-Markdown.github.io`
respectively.
- cd Python-Markdown.github.io
- mkdocs gh-deploy --config-file ../markdown/mkdocs.yml --remote-branch master
+ ``` shell
+ cd markdown/
+ python -m zensical build --clean
+ cd ../Python-Markdown.github.io/
+ ghp-import --push --no-jekyll --branch=master ../markdown/site
+ ```
## Issue and Pull Request Labels
@@ -833,6 +878,7 @@ for details.
[smarty]: extensions/smarty.md
[toc]: extensions/toc.md
[mdx_gh_links]: https://github.com/Python-Markdown/github-links
+[pymdownx.blocks.html]: https://facelessuser.github.io/pymdown-extensions/extensions/blocks/plugins/html/
[pymdownx.highlight]: https://facelessuser.github.io/pymdown-extensions/extensions/highlight/
[pymdownx.superfences]: https://facelessuser.github.io/pymdown-extensions/extensions/superfences/
[API documentation]:reference/markdown.md
diff --git a/docs/install.md b/docs/install.md
index 376e364b..5d99d228 100644
--- a/docs/install.md
+++ b/docs/install.md
@@ -9,7 +9,7 @@ title: Installation
The easiest way to install Python-Markdown is simply to type the
following command from the command line:
-```bash
+```shell
pip install markdown
```
@@ -29,6 +29,6 @@ Python-Markdown is maintained in a Git repository on GitHub.com. To
get a copy of Python-Markdown from the repository do the following from the
command line:
-```bash
+```shell
pip install git+https://github.com/Python-Markdown/markdown.git
```
diff --git a/docs/library.md b/docs/library.md
index c52cf53b..5da2b3f5 100644
--- a/docs/library.md
+++ b/docs/library.md
@@ -274,7 +274,7 @@ encoding the output.
output_file.write(html)
```
-## The `markdown.Markdown` Class
+## The `markdown.Markdown` Class { #Markdown }
The above-referenced functions (`markdown.markdown` and
`markdown.markdownFromFile`) wrap the [`markdown.Markdown`][markdown.Markdown]
diff --git a/docs/sanitization.md b/docs/sanitization.md
index 367600cc..3e52d0cf 100644
--- a/docs/sanitization.md
+++ b/docs/sanitization.md
@@ -59,7 +59,7 @@ Both Python-Markdown and `JustHTML` provide command line interfaces which read
from `STDIN` and write to `STDOUT`. Therefore, they can be used together to
ensure that the output from untrusted input is properly sanitized.
-```sh
+```shell
echo "Some **Markdown** text." | python -m markdown | justhtml - --fragment > safe_output.html
```
diff --git a/mkdocs.yml b/mkdocs.yml
index 389d9aa5..87791dff 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -146,6 +146,7 @@ markdown_extensions:
- footnotes
- md_in_html
- smarty
+ - pymdownx.blocks.html
- toc:
permalink: "ยง"
- mdx_gh_links:
@@ -166,6 +167,12 @@ markdown_extensions:
plugins:
- search
+- redirects:
+ redirect_maps:
+ reference.md: library.md
+ reference.md#the-details: library.md#the-basics
+ reference.md#markdown: library.md#the-basics
+ reference.md#markdownFromFile: library.md#working-with-files
- mkdocstrings:
custom_templates: .zensical/mkdocstring_templates
handlers:
diff --git a/pyproject.toml b/pyproject.toml
index c7dc8ea1..5464a000 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -50,13 +50,14 @@ testing = [
'pyyaml'
]
docs = [
- 'zensical==0.0.57',
+ 'zensical==0.0.62',
'mdx_gh_links==0.4',
'mkdocstrings==1.0.6',
'mkdocstrings-python==1.16.8',
'pygments==2.21.0',
'pymdown-extensions==11.0.2',
- 'justhtml==3.11.2'
+ 'justhtml==3.11.2',
+ 'ghp-import==2.1.0'
]
[project.urls]
diff --git a/uv.lock b/uv.lock
index 5b2abff4..bc898b60 100644
--- a/uv.lock
+++ b/uv.lock
@@ -220,6 +220,7 @@ source = { editable = "." }
[package.optional-dependencies]
docs = [
+ { name = "ghp-import" },
{ name = "justhtml" },
{ name = "mdx-gh-links" },
{ name = "mkdocstrings" },
@@ -236,6 +237,7 @@ testing = [
[package.metadata]
requires-dist = [
{ name = "coverage", marker = "extra == 'testing'" },
+ { name = "ghp-import", marker = "extra == 'docs'", specifier = "==2.1.0" },
{ name = "justhtml", marker = "extra == 'docs'", specifier = "==3.11.2" },
{ name = "mdx-gh-links", marker = "extra == 'docs'", specifier = "==0.4" },
{ name = "mkdocstrings", marker = "extra == 'docs'", specifier = "==1.0.6" },
@@ -243,7 +245,7 @@ requires-dist = [
{ name = "pygments", marker = "extra == 'docs'", specifier = "==2.21.0" },
{ name = "pymdown-extensions", marker = "extra == 'docs'", specifier = "==11.0.2" },
{ name = "pyyaml", marker = "extra == 'testing'" },
- { name = "zensical", marker = "extra == 'docs'", specifier = "==0.0.57" },
+ { name = "zensical", marker = "extra == 'docs'", specifier = "==0.0.62" },
]
provides-extras = ["testing", "docs"]
@@ -645,7 +647,7 @@ wheels = [
[[package]]
name = "zensical"
-version = "0.0.57"
+version = "0.0.62"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
@@ -657,18 +659,15 @@ dependencies = [
{ name = "pyyaml" },
{ name = "tomli" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/83/f4/fa40086c46a2e59e3d9239031f76623622e60e0d79f3df1282df2797a5c4/zensical-0.0.57.tar.gz", hash = "sha256:25fcbdf89a57153cc3ad1108a89d17c7226da5d3c551a8839c69cbd9c472a9d8", size = 4000458, upload-time = "2026-08-21T20:43:49.5Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/df/c1/d97c5b09e193dadeea02c93c0d627b7659617a0c274bcd29803f116761fc/zensical-0.0.62.tar.gz", hash = "sha256:2449135eac161eb053bf1138df994b18794e7ab420f73941a65ba66e43b37613", size = 4128550, upload-time = "2026-09-13T17:16:35.632Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/92/b9/49c37dc65105d1ca4a8b600a02c84ece00218d2293b2630611c620185ca3/zensical-0.0.57-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:98867d1a6ea2c57f1ebcf4902f61601f427350f2df0c04e30cfac8ba6163cd29", size = 12888507, upload-time = "2026-08-21T20:43:20.365Z" },
- { url = "https://files.pythonhosted.org/packages/05/f7/54539984418de11387bbace39a744195555d32c98c95bf4d112b432548f5/zensical-0.0.57-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:0d7935d77d73a279545052e05d89d31960f30c1f33f53933f4c101fa271aee74", size = 12778169, upload-time = "2026-08-21T20:43:22.879Z" },
- { url = "https://files.pythonhosted.org/packages/40/16/74aa60aa4cfecd5bd31ce60cb6a092cb56f1bc1aaadcc173463861ea4eb5/zensical-0.0.57-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7046d433511d97aa603915f0f6792d15b7f839793abc2b66ab7b7ff753ecff5", size = 13230823, upload-time = "2026-08-21T20:43:25.141Z" },
- { url = "https://files.pythonhosted.org/packages/8a/d1/742d2487dd65dd18277daebcd37db56d5bd4a2408df02bde703ef8fb7b64/zensical-0.0.57-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab85c5066b95e3a877cf8971e4ce30abb1ca1459fbfcc631f0a5a2bab56351a4", size = 13170523, upload-time = "2026-08-21T20:43:27.456Z" },
- { url = "https://files.pythonhosted.org/packages/56/6f/12b570775d344f1a3d77e26d4ae0160bcac9e41ca38f7135352ccdf9b2c8/zensical-0.0.57-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f13d1b57ad3c8b8634933a93ea870ebac11245fe0c968d27fd2a059ee1c6311", size = 13549941, upload-time = "2026-08-21T20:43:29.964Z" },
- { url = "https://files.pythonhosted.org/packages/7b/4e/436e6fc76674244c084ef7f6f17dc5ff85c76b15aef77c48b703fd0a2dda/zensical-0.0.57-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:021dd8fb70d1816cd012684fcf45d32b8f88a0cd28b7cbe71e5f8564f6d5764d", size = 13210086, upload-time = "2026-08-21T20:43:32.098Z" },
- { url = "https://files.pythonhosted.org/packages/ef/52/20f3aeda9af1090f24241670a5cc20fff7494545fea9f5fa094c82f3dbdf/zensical-0.0.57-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7e10f3c27fdc3eac3a9ae6ddcd87f3f00edc9f332050923313c95537961bfadd", size = 13408253, upload-time = "2026-08-21T20:43:34.258Z" },
- { url = "https://files.pythonhosted.org/packages/e1/f2/2b18ba2f19674dbfcf745f3b66e005cc8efa66a1bcaba5e1b4f79467868a/zensical-0.0.57-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:78c85fee55c5aac3bdf8157e980c56397dca835167a5577c5429b5eb24ed990c", size = 13446689, upload-time = "2026-08-21T20:43:36.527Z" },
- { url = "https://files.pythonhosted.org/packages/05/ba/68cdba447a9097e5f97742eef046020c6fa42d82972849b3a46a0718e890/zensical-0.0.57-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:478d252e1924f3876e72cf7806967cb62e50d86eddb3da04bf43e882b532fa1b", size = 13598580, upload-time = "2026-08-21T20:43:38.646Z" },
- { url = "https://files.pythonhosted.org/packages/ec/89/6358a4df272328bed5bea90b04d43e73758bc45ff058c5cb2665e1147314/zensical-0.0.57-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66a9ca6b5f625b2a2b215eec2f3c72843a92d5d512042045ac6351d5dee9b339", size = 13557609, upload-time = "2026-08-21T20:43:40.866Z" },
- { url = "https://files.pythonhosted.org/packages/77/e1/8831301a24f736743e3788f09ea048918b0bdcea4aaa90f7770a433d6eec/zensical-0.0.57-cp310-abi3-win32.whl", hash = "sha256:f0fe3dc27ca7dc4e168eddd0fe5b0f4d44e311fd4e0019241e289819e445203c", size = 12446805, upload-time = "2026-08-21T20:43:43.097Z" },
- { url = "https://files.pythonhosted.org/packages/d7/3f/5d0ecd77d9ce962fdfde22dec036f4257a43ef6dbd55fb5c05fd294985ad/zensical-0.0.57-cp310-abi3-win_amd64.whl", hash = "sha256:a756834025c1c54e806e943be6d8df1048d0f8bcf6086e958568407a070a2572", size = 12716781, upload-time = "2026-08-21T20:43:45.273Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/a6/7e3fda49749096cf405e09c4384e348c0f6bfeab44f18d02c1051673dc2e/zensical-0.0.62-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:a1efd661fa3241c10c94c8c2b280ac3924bc988b24d0dbf1b8499994b23e12fb", size = 14220149, upload-time = "2026-09-13T17:16:08.144Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/13/c8d22c4c946bf4e6ae29db81f1456fbbc35fcd165ad874e4b919422f7b08/zensical-0.0.62-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:c468e81adad37517c03de2dda13568c33d9c36b234c34e2b3a04285846d99bd5", size = 13963505, upload-time = "2026-09-13T17:16:11.529Z" },
+ { url = "https://files.pythonhosted.org/packages/19/08/cce44a83dbc1070197e2006178bbf42d59e398ccb39806d3db02c9781790/zensical-0.0.62-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dcc744b1b3f56b85cf23c393a2333dec72e555b263a2fbe3d50ac896cf85468", size = 14238419, upload-time = "2026-09-13T17:16:14.375Z" },
+ { url = "https://files.pythonhosted.org/packages/af/65/586ab984b9197ab6a7ee53dffa77ef00fdb19f8c09d520c39e3c3d7dccb8/zensical-0.0.62-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b04147ac1f109ed3b1fbc74d958323243f35481926765b939638e8933a8bdc6", size = 14262571, upload-time = "2026-09-13T17:16:17.24Z" },
+ { url = "https://files.pythonhosted.org/packages/57/ae/3a4aac8181caa1079c93ac996bbc418b749ae76ecd2cf2a67943b90ae277/zensical-0.0.62-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6755d7a2d3de424e07a77f68be080b4e54a34fb564c39434322e8427b9402ace", size = 14518577, upload-time = "2026-09-13T17:16:20.248Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/03/8de2cc9aecc13b93d4b63c06dec4af95482ab9ce1b586ad8d35d5f56a916/zensical-0.0.62-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2b809aa8aa175f64a362d6a8ab89586ce7dd086b5bf23778f3c3cff68deeae6", size = 14413777, upload-time = "2026-09-13T17:16:23.641Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/36/c7ac1e27d2832f8ee524397f47193b73a1d7d78b78e407febd5f97d72e89/zensical-0.0.62-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:111cb32c405ff3a0e162860f81cf8e041447d795657720c36ba3e1b8ed607928", size = 14747349, upload-time = "2026-09-13T17:16:26.498Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/ad/e933a718b52161e97e7f477e189374e375be940f6ed4ea6711e9f80f8531/zensical-0.0.62-cp310-abi3-win_amd64.whl", hash = "sha256:7c216f1e33b369aa84826e6e52ecda06059c651793936ec3d64c8b4255a91dcc", size = 14531794, upload-time = "2026-09-13T17:16:29.497Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/af/0ad32fb45b1eb9b8bb10ec7ef08b1982ab8f7a5c2837cbf1d3bd2df721ad/zensical-0.0.62-cp310-abi3-win_arm64.whl", hash = "sha256:8d4e48fc44faf0b4b77e880e3ad3ec2573644e2ddd59e18c71c829412733495d", size = 14240254, upload-time = "2026-09-13T17:16:32.675Z" },
]