OxydeMark
Extensible Markdown pipelines powered by Rust.
Overview
OxydeMark is a Markdown processing engine built around an AST pipeline architecture. It combines a high-performance Rust core for parsing and rendering with Python bindings (via PyO3) for a flexible plugin system.
Markdown Input
-> Preprocessing Plugins (Python, text-level)
-> Rust Parser / rushdown (AST generation)
-> AST exposed to Python (AstNode tree)
-> AST Transformation Plugins (Python, AST-level)
-> Rust Renderer (HTML generation)
-> Postprocessing Plugins (Python, HTML-level)
-> Final Output
Installation
Note: OxydeMark is in early development (pre-alpha). Installation from source is currently the only option.
# Clone the repository
git clone https://github.com/noirbizarre/oxydemark.git
cd oxydemark
# Install tools and build
mise install
maturin develop
Quick Start
from oxydemark import OxydeEngine
engine = OxydeEngine()
md = """
# Hello OxydeMark
This is **extensible Markdown**.
"""
html = engine.render(md)
print(html)
Plugins
A plugin is any object implementing one or more of the preprocess,
transform and postprocess hooks. No base class, no registration:
from oxydemark import OxydeEngine
from oxydemark.contrib import AdmonitionPlugin, MentionPlugin
class Shouty:
def postprocess(self, html: str) -> str:
return html.upper()
engine = OxydeEngine(plugins=[AdmonitionPlugin(), MentionPlugin(), Shouty()])
print(engine.render("> [!NOTE]\n> Ping @alice\n"))
oxydemark.contrib ships four worked examples (admonitions, shortcodes,
mentions, lazy images). See the plugin guide for the full
authoring documentation, including the AST value-semantics rules.
Development
See CONTRIBUTING.md for the full development guide.
# Set up tools and hooks
mise install
mise run setup
# Common tasks
mise run build # Build the Rust crate
mise run test # Run tests
mise run lint # Run clippy
mise run fmt # Format code
mise run ci # Run all checks
mise run docs # Build the documentation site
Project Structure
oxydemark/
├── src/ # Rust core
│ ├── lib.rs # PyO3 module, parser/renderer wiring
│ ├── ast.rs # AstNode definition, arena-to-tree conversion
│ ├── extensions.rs # Comark parser/renderer extensions
│ └── html_render.rs # AST-to-HTML renderer
├── python/oxydemark/ # Python package
│ ├── __init__.py # Re-exports from native module
│ ├── api.py # OxydeEngine, plugin protocol
│ └── contrib/ # Example plugins (provisional surface)
├── docs/ # Documentation site sources
│ ├── plugins.md # Plugin authoring guide
│ ├── api/ # API reference pages
│ └── specs/ # OMEPs (design decisions)
├── .github/workflows/ # CI pipeline
├── Cargo.toml # Rust crate configuration
├── pyproject.toml # Python build config (maturin)
├── mise.toml # Task runner and tool versions
├── zensical.toml # Documentation site configuration
├── cliff.toml # Changelog generation
├── prek.toml # Pre-commit hooks
├── CONTRIBUTING.md # Contribution guidelines
└── LICENSE # MIT License
Design Decisions
Architectural and tooling decisions are documented as OMEPs (OxydeMark
Enhancement Proposals) in docs/specs/. See the
OMEP index for the full list.
License
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file oxydemark-0.2.1.tar.gz.
File metadata
- Download URL: oxydemark-0.2.1.tar.gz
- Upload date:
- Size: 60.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfc7e3dd798c8e771fb92483497565aebc4a6574fa8b8bead52ce3b71310e63e
|
|
| MD5 |
e30c4e2f570b282176439878768efacc
|
|
| BLAKE2b-256 |
0df2a9e524d7046065d6d4b9f84b35f665bb4291cd6e4483f45d7e2167f96044
|
Provenance
The following attestation bundles were made for oxydemark-0.2.1.tar.gz:
Publisher:
release.yml on noirbizarre/oxydemark
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oxydemark-0.2.1.tar.gz -
Subject digest:
bfc7e3dd798c8e771fb92483497565aebc4a6574fa8b8bead52ce3b71310e63e - Sigstore transparency entry: 2335633289
- Sigstore integration time:
-
Permalink:
noirbizarre/oxydemark@5f5401aea48a35b28194d6cf2d8bd91019488481 -
Branch / Tag:
refs/tags/0.2.1 - Owner: https://github.com/noirbizarre
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5f5401aea48a35b28194d6cf2d8bd91019488481 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file oxydemark-0.2.1-cp312-abi3-win_amd64.whl.
File metadata
- Download URL: oxydemark-0.2.1-cp312-abi3-win_amd64.whl
- Upload date:
- Size: 763.3 kB
- Tags: CPython 3.12+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2aee5505f9a9035415c5b38c7538a2837ad821c6b04f325ee7b41b6189f51233
|
|
| MD5 |
72e4703265fd41b8619bfa7b0856f397
|
|
| BLAKE2b-256 |
e74bb3ac2c0c38df7cccf0578fa0875be751a573e32a8b32631b284d5b08c3e6
|
Provenance
The following attestation bundles were made for oxydemark-0.2.1-cp312-abi3-win_amd64.whl:
Publisher:
release.yml on noirbizarre/oxydemark
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oxydemark-0.2.1-cp312-abi3-win_amd64.whl -
Subject digest:
2aee5505f9a9035415c5b38c7538a2837ad821c6b04f325ee7b41b6189f51233 - Sigstore transparency entry: 2335633325
- Sigstore integration time:
-
Permalink:
noirbizarre/oxydemark@5f5401aea48a35b28194d6cf2d8bd91019488481 -
Branch / Tag:
refs/tags/0.2.1 - Owner: https://github.com/noirbizarre
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5f5401aea48a35b28194d6cf2d8bd91019488481 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file oxydemark-0.2.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: oxydemark-0.2.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.0 MB
- Tags: CPython 3.12+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6677fb22c2c1a0f86ac76c7708a1e89dc200556de50c81b7e586996ff4e4ba0
|
|
| MD5 |
7d80fb6a10f31977dd2905ed6b45705e
|
|
| BLAKE2b-256 |
9a5011884bccd286934359917601dc0c63d0d7650b93cacb6e72573475507ca5
|
Provenance
The following attestation bundles were made for oxydemark-0.2.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on noirbizarre/oxydemark
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oxydemark-0.2.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
f6677fb22c2c1a0f86ac76c7708a1e89dc200556de50c81b7e586996ff4e4ba0 - Sigstore transparency entry: 2335633312
- Sigstore integration time:
-
Permalink:
noirbizarre/oxydemark@5f5401aea48a35b28194d6cf2d8bd91019488481 -
Branch / Tag:
refs/tags/0.2.1 - Owner: https://github.com/noirbizarre
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5f5401aea48a35b28194d6cf2d8bd91019488481 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file oxydemark-0.2.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: oxydemark-0.2.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.12+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
22826baaa9ddc72e51d3e8500bdf91fd8a57425310b6441598463640fb9a940e
|
|
| MD5 |
cd45fb8ac3cd606e37c132984fdaa794
|
|
| BLAKE2b-256 |
e2f741c5b6a2c7beff9eb9f28707cfd2040da24d8da6d9409f572c231273d7ec
|
Provenance
The following attestation bundles were made for oxydemark-0.2.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on noirbizarre/oxydemark
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oxydemark-0.2.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
22826baaa9ddc72e51d3e8500bdf91fd8a57425310b6441598463640fb9a940e - Sigstore transparency entry: 2335633298
- Sigstore integration time:
-
Permalink:
noirbizarre/oxydemark@5f5401aea48a35b28194d6cf2d8bd91019488481 -
Branch / Tag:
refs/tags/0.2.1 - Owner: https://github.com/noirbizarre
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5f5401aea48a35b28194d6cf2d8bd91019488481 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file oxydemark-0.2.1-cp312-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: oxydemark-0.2.1-cp312-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 892.6 kB
- Tags: CPython 3.12+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e379022f08bf6582cf9baff05eccf2c754b1df54a98165922a892dea9465dbf1
|
|
| MD5 |
33e20b1b315acb12614d83eaeeb13fea
|
|
| BLAKE2b-256 |
92d9260f448abe9228f976dcafb299596ed6b60b9bb9213e69c5919bfc0d1b94
|
Provenance
The following attestation bundles were made for oxydemark-0.2.1-cp312-abi3-macosx_11_0_arm64.whl:
Publisher:
release.yml on noirbizarre/oxydemark
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oxydemark-0.2.1-cp312-abi3-macosx_11_0_arm64.whl -
Subject digest:
e379022f08bf6582cf9baff05eccf2c754b1df54a98165922a892dea9465dbf1 - Sigstore transparency entry: 2335633334
- Sigstore integration time:
-
Permalink:
noirbizarre/oxydemark@5f5401aea48a35b28194d6cf2d8bd91019488481 -
Branch / Tag:
refs/tags/0.2.1 - Owner: https://github.com/noirbizarre
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5f5401aea48a35b28194d6cf2d8bd91019488481 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file oxydemark-0.2.1-cp312-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: oxydemark-0.2.1-cp312-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 872.0 kB
- Tags: CPython 3.12+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18178e6b30c1a6f8335fbe2b101d2e1aabec37351c6dae9225e7b57f425b4c78
|
|
| MD5 |
05760b8ccd187bb210841e22a5caac05
|
|
| BLAKE2b-256 |
f587730b5e9e0a303e1251f0c9385b11d8c6a7c977111051dda45b2b16dfb145
|
Provenance
The following attestation bundles were made for oxydemark-0.2.1-cp312-abi3-macosx_10_12_x86_64.whl:
Publisher:
release.yml on noirbizarre/oxydemark
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oxydemark-0.2.1-cp312-abi3-macosx_10_12_x86_64.whl -
Subject digest:
18178e6b30c1a6f8335fbe2b101d2e1aabec37351c6dae9225e7b57f425b4c78 - Sigstore transparency entry: 2335633305
- Sigstore integration time:
-
Permalink:
noirbizarre/oxydemark@5f5401aea48a35b28194d6cf2d8bd91019488481 -
Branch / Tag:
refs/tags/0.2.1 - Owner: https://github.com/noirbizarre
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5f5401aea48a35b28194d6cf2d8bd91019488481 -
Trigger Event:
workflow_dispatch
-
Statement type: