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. Note that the quill reference is optional to specify and can be inferred from the markdown content's frontmatter.
  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.50.0.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.50.0-cp310-abi3-win_amd64.whl (14.9 MB view details)

Uploaded CPython 3.10+Windows x86-64

quillmark-0.50.0-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.50.0-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.50.0-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.50.0.tar.gz.

File metadata

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

File hashes

Hashes for quillmark-0.50.0.tar.gz
Algorithm Hash digest
SHA256 9c5f5d737d4a0b57b5811206cb1f3fbc56bb3cb5905259d47ea5289b4403d4a4
MD5 84796bbbf8f6bfd5646b66eb7a2f6092
BLAKE2b-256 5ad2d4fba78f62119568e063b2614c2c74dfb1a292b3ec7283a4c307ab8e76db

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for quillmark-0.50.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 4bc4a5c90726e83afb02280ac02e78bea379edbf372c79910e80286ad757a585
MD5 c58d2237404507b14ae67e97a35245c7
BLAKE2b-256 9fff010da5dcb5b6d535faf39e9dc580c5ef039cb46c4098782bde70348d1175

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for quillmark-0.50.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7957d1b5bb3863200ae6248de3dcac483f8a8bb2b3b2ae86f62b4c74a1a5dd45
MD5 59705a5612bf23127931c6f6245e1ed8
BLAKE2b-256 c8a1d472e248d754f8e6f2447558e9a07cd458225a622986122d350d1631a206

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for quillmark-0.50.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 fefd2672ce2eff0ccd84b06520dae0bcefe2177c642ce9739bcd490655f9bc7d
MD5 3b22236e77120fb7df53eab6835edce5
BLAKE2b-256 0445bda5c806b2d74f6c64fe3444e8d1507904e744dd75a9b4d1cee15cfc901f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for quillmark-0.50.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1337b19afd5e51811fffecfe070b9f4ea6350300ad2dedc0254c1788695fc909
MD5 06f2d7ebff56ee23918df450c6919241
BLAKE2b-256 931db4853818eb0084a43a192a48d0227a90218ace723562d48a77898a6b52d3

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