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, YAML schema, 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            # Public schema YAML text
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.56.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.56.0-cp310-abi3-win_amd64.whl (14.8 MB view details)

Uploaded CPython 3.10+Windows x86-64

quillmark-0.56.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.5 MB view details)

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

quillmark-0.56.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (15.1 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

quillmark-0.56.0-cp310-abi3-macosx_11_0_arm64.whl (13.9 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: quillmark-0.56.0.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.56.0.tar.gz
Algorithm Hash digest
SHA256 c202e89210b8b7e4b36792f11c13f324c692363d6117004289d49ce74b2e829a
MD5 2a15e053138e860c8e636c21459816cd
BLAKE2b-256 04f519d4f822045e36dfc19a268b861e02ec55fce3dc700b5cd5711f5d37f7a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for quillmark-0.56.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 7d904c0f1110eb63ebe050a0bff31939ed6aa353033e42684b90c8d2ab6ac9c9
MD5 4526b78c86b7c7765733afbe3d6f8d10
BLAKE2b-256 1411b027d1ac33d5ac8fb55b4ca56b7680f19d401589d0aba7035147d581381b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for quillmark-0.56.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2cd25e989a69b80b6915e8be3d3b89f20b15023fab49d89e268ef1705e543421
MD5 ee5a74bdeb0a3b7ffb1b371edad21c4d
BLAKE2b-256 793ffdc42de090167a7c073c4bf31abf8560503d200edd49284a5323e5620595

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for quillmark-0.56.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6961a72dfb08290a607d1af44d8492761927da34668c482760a70248313a9d1f
MD5 c1b1059a09c73b10b233afb4fa123dff
BLAKE2b-256 233e5d2393377da3a7b8b01f94ee82e3ee49ebd172a3e9d5210cd9cafaab5269

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for quillmark-0.56.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a9c54c0d8ed7f0f6465adcd1b18e6094fba47da036f4a9340a1c2a9f5620d511
MD5 4dec874e49a9d6b4cd4b067944329860
BLAKE2b-256 f3cff2bfbd6728a051f31f599ae2369dfb8d5905cc6bff6c10b07c478f7c1415

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