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.51.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.51.1-cp310-abi3-win_amd64.whl (14.9 MB view details)

Uploaded CPython 3.10+Windows x86-64

quillmark-0.51.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.51.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.51.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.51.1.tar.gz.

File metadata

  • Download URL: quillmark-0.51.1.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.51.1.tar.gz
Algorithm Hash digest
SHA256 3802aab49b7569f7ba400f316fd1b3812b518bf4dff8cd1c560f6f3630b91d51
MD5 16f9d372802bd278aaf974e265ac3b98
BLAKE2b-256 02c31925728afc45f3836e37acf2e905ae1382147be63c29727fdc9f7d2fc816

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for quillmark-0.51.1-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 5e8b910a58f40c4fae288cb7c900afca84ac579a0775cc5530cd30a2e49c9075
MD5 87080534ad5407bd2e515875f5e1c02f
BLAKE2b-256 faf5eba52dee58e2f471f2659cdd31fcc5f77a7b861e108ec2b7ce34f3586f9e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for quillmark-0.51.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 046f823adbacbb43e7ae386ec13641a298e8a796a0c400442e5a6f77c654813b
MD5 fc652fa53efc34354584a5abecc6e173
BLAKE2b-256 44b49317aae53f148a26b529213d3948fd4e2b03e5d8c7e0d77c9949adb65d1f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for quillmark-0.51.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c2342c3fd83ec7d6d4ac16a9cfcbb8ee427302296ed4b95fa6f07ba9cc47296f
MD5 bbf7b14250b11cac6e4ee99d247bc570
BLAKE2b-256 8873233dd48890e537624fd751e39f363fbbf20ded8200d094586c98746daa5a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for quillmark-0.51.1-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ed9439fae83be8752e96dcb87f6af82e7dce853ac378d004225f6a7672a07094
MD5 bb2801ee4a5c582ccb6f53e1e8e095e0
BLAKE2b-256 f964ce8e2a97ff4fdf51852be0d9d6893c20fe0f0adf116320358f2941d2fd4f

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