Skip to main content

Python bindings for Quillmark - template-first Markdown rendering

Project description

Quillmark — Python bindings for Quillmark

Python bindings for the Quillmark template-first Markdown rendering engine.

Maintained by TTQ.

Installation

pip install quillmark

Quick Start

from quillmark import Quillmark, Quill, ParsedDocument, OutputFormat

# Create engine
engine = Quillmark()

# Load and register a quill
quill = Quill.from_path("path/to/quill")
engine.register_quill(quill)

# Parse markdown
markdown = """---
QUILL: my_quill
title: Hello World
---

# Hello

This is a test document.
"""
parsed = ParsedDocument.from_markdown(markdown)

# Create workflow and render
workflow = engine.workflow(parsed)  # Infers quill from QUILL tag
result = workflow.render(parsed, OutputFormat.PDF)

# Save output
result.artifacts[0].save("output.pdf")

API Overview

The Python API provides opinionated visibility over the rendering workflow:

  1. Load Quill - Load template bundles from the filesystem
  2. Parse Markdown - Parse Markdown with YAML frontmatter into ParsedDocument
  3. Inspect Quill - Retrieve quill properties (metadata, field schemas, supported formats)
  4. Create Workflow - Build a rendering pipeline from a quill reference, quill object, or parsed document.
  5. Render - Generate output artifacts with configurable options

Core Classes

Quillmark - Engine

Manages backends and quills.

engine = Quillmark()
engine.register_quill(quill)
engine.registered_backends()  # ['typst']
engine.registered_quills()    # ['my_quill']

# Create workflows
workflow = engine.workflow(parsed)          # Infer from QUILL tag
workflow = engine.workflow("name")          # By name (latest version)
workflow = engine.workflow("name@1.0")      # By reference (specific version)
workflow = engine.workflow(quill)           # By object

# Retrieve registered quills
quill = engine.get_quill("name")            # Get latest version
quill = engine.get_quill("name@1.0")        # Get specific version

Quill - Template Bundle

Represents a quill loaded from the filesystem.

quill = Quill.from_path("path/to/quill")

# Properties
quill.name              # Quill name
quill.backend           # Backend identifier (e.g., "typst")
quill.plate             # Template content (optional)
quill.example           # Example markdown content (optional)
quill.metadata          # Quill metadata dict
quill.schema            # Field schema definitions
quill.defaults          # Default field values from schema
quill.examples          # Example field values from schema
quill.supported_formats()  # [OutputFormat.PDF, OutputFormat.SVG]

ParsedDocument - Parsed Markdown

Represents parsed Markdown with frontmatter.

parsed = ParsedDocument.from_markdown(markdown)

parsed.body()           # Document body (str | None)
parsed.quill_ref()      # Quill reference string (str)
parsed.get_field(key)   # Get specific field (Any | None)
parsed.fields           # All frontmatter fields (dict)

Workflow - Rendering Pipeline

Sealed workflow for rendering.

workflow = engine.workflow("my_quill")

# Render
result = workflow.render(parsed, OutputFormat.PDF)

# Query properties
workflow.quill_ref            # "my_quill@1.0"
workflow.backend_id           # "typst"
workflow.supported_formats    # [OutputFormat.PDF, OutputFormat.SVG]

Note: Dynamic asset and font injection is not currently supported in Python bindings. Assets must be included in the quill bundle.

RenderResult - Output Container

Contains rendered artifacts and diagnostics.

result = workflow.render(parsed, OutputFormat.PDF)

for artifact in result.artifacts:
    print(f"Format: {artifact.output_format}")
    print(f"Size: {len(artifact.bytes)} bytes")
    artifact.save("output.pdf")

for warning in result.warnings:
    print(f"{warning.severity}: {warning.message}")

Examples

See the examples/ directory for complete examples:

Development

This repository uses uv for local development (https://astral.sh/uv).

Install uv (one-time):

curl -LsSf https://astral.sh/uv/install.sh | sh

Canonical development flow:

# Create virtual environment
uv venv

# Install developer extras (includes maturin, pytest, mypy, ruff)
uv pip install -e ".[dev]"

# Run tests
uv run pytest

Alternative: Without uv

# Create venv
python3 -m venv venv
source venv/bin/activate

# Install dependencies
pip install maturin pytest

# Build and install
maturin develop

# Run tests
pytest

License

Apache-2.0

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

quillmark-0.53.1.tar.gz (3.7 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

quillmark-0.53.1-cp310-abi3-win_amd64.whl (14.9 MB view details)

Uploaded CPython 3.10+Windows x86-64

quillmark-0.53.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

quillmark-0.53.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (15.8 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

quillmark-0.53.1-cp310-abi3-macosx_11_0_arm64.whl (14.6 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

Details for the file quillmark-0.53.1.tar.gz.

File metadata

  • Download URL: quillmark-0.53.1.tar.gz
  • Upload date:
  • Size: 3.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.13.1

File hashes

Hashes for quillmark-0.53.1.tar.gz
Algorithm Hash digest
SHA256 ed34e5059910d790e629b5d29fe214132454be383ab0cb88686178e858acc24d
MD5 3d9c4062600e5331591540f3aba88622
BLAKE2b-256 8b1460f89d57b308c163b25ec65d0a2bea5c9e2dad7b20c71906bb90725d2e12

See more details on using hashes here.

File details

Details for the file quillmark-0.53.1-cp310-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for quillmark-0.53.1-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 9d5d4d31c678b6a75e9bf601ebc54cf3aeb1d0dd816965cd7e97ed7fc1ff9665
MD5 e9fca31bfad7502156a6fb3363142abb
BLAKE2b-256 9dafa42ced6dcc83906ef6478e1dff203c14b23dc823f8c0611d41c389d6bb62

See more details on using hashes here.

File details

Details for the file quillmark-0.53.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for quillmark-0.53.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 164427ed155201e10c652bd6cafcc407860ba5eed19781faa5c8576fbe8486c7
MD5 bc1153d5ab66a5d1dff65ccaa41edcc4
BLAKE2b-256 f6838b99d4516e545a82c350a31b29376ff445579e6c1baff74ab0ca7fe72636

See more details on using hashes here.

File details

Details for the file quillmark-0.53.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for quillmark-0.53.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d53b8818af2c1299100dfaba11f22aead8104ea4578f2a07ef57c3d186e9ab04
MD5 1b7ceb8320bcf26cd523af875f2e4470
BLAKE2b-256 ac16c5b97e049663af6b1486ccec4c71dc86449f5faa5fb38272a939ed77b464

See more details on using hashes here.

File details

Details for the file quillmark-0.53.1-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for quillmark-0.53.1-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1cadbf899157692a949d8edfeef394c3f4ca6325d81c2d519bc634f7b6f07e6c
MD5 1c7d63854e95edbf4babef7de2736eca
BLAKE2b-256 c1e6dc6b7134eccdac2a1b9eecd7c1c9134fdbc75c4ffa7132064c81c17b7857

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page