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" }, ]