Skip to main content

Dynamic Text Renderer

Project description

DTR banner

DTR — Dynamic Text Renderer

DTR is a Python library built in Rust (PyO3) for rendering template strings with custom function calls, file includes, and variables. Use it to generate dynamic text from templates while keeping logic in Python.

Python 3.8+ License: MIT Rust

Features

  • Function calls — Register Python callables and invoke them from templates (~fn:name(args)).
  • File includes — Pull in external template files (~include:path).
  • Variables — Resolve $variables inside function arguments.
  • Custom syntax — Optional prefixes and name patterns via Syntax.
  • Fast core — Parsing and rendering run in Rust; Python is used for your functions.

Installation

pip install dtrlib

Install from source

Requires Rust and maturin:

git clone https://github.com/naginagiyev/dtr.git
cd dtr
pip install maturin
maturin develop

Quick start

from dtr import Compiler

compiler = Compiler()

def repeat(args):
    text = str(args[0]) if args else ""
    count = int(args[1]) if len(args) > 1 else 1
    return text * count

compiler.add_function("str.repeat", repeat)

template = "Result: ~fn:str.repeat('ha', 3)"
print(compiler.compile(template))
# Result: hahaha

Template syntax

Default syntax (configurable with Syntax):

Feature Syntax Example
Function call ~fn:name(args) ~fn:math.add(1, 2)
Include file ~include:path ~include:"footer.txt"
Variable (in function args) $name ~fn:greet($user)

Function calls

Register a function with its full dotted name, then call it in text:

compiler = Compiler()

def upper(args):
    return str(args[0]).upper() if args else ""

compiler.add_function("text.upper", upper)
print(compiler.compile("~fn:text.upper('hello')"))
# HELLO

Arguments support strings, numbers, booleans, lists, and dicts. Empty arguments become null.

Register a Python file as a module

Load a .py file and expose its top-level def functions under a namespace:

compiler = Compiler()

compiler.add_module("random_number_generator.py", "generator")
print(compiler.compile("~fn:generator.roll(6)"))
  • module_path: path to the .py file (relative to the current working directory or absolute).
  • as_name: namespace used in templates (generator.func, not the filename).

Only module-level functions are registered; names starting with _ are skipped. Classes, variables, and other attributes are ignored. Re-registering the same namespace overwrites previous functions for matching names.

Variables

Set values with set_arg, then reference them inside function arguments:

compiler.set_arg("name", "Ada")
print(compiler.compile("~fn:text.upper($name)"))
# ADA

File includes

Includes are resolved relative to the current file path (or the working directory when compiling from a string):

output = compiler.compile_with_file(template, "letters/template.txt")

Circular includes are detected; behavior depends on debug_mode (see below).

Custom syntax

from dtr import Compiler, Syntax

syntax = Syntax(
    function_prefix="@@",
    include_prefix="@@include:",
    variable_prefix="@",
)
compiler = Compiler(syntax)

API reference

Compiler

Method Description
compile(text) Render a string (virtual file name <input>).
compile_with_file(text, file_name) Render with a path used for includes and errors.
set_debug_mode(enabled) When True, errors raise; when False, failed calls/includes are left unchanged.
set_arg(name, value) Set a variable for use in function arguments.
clear_args() Remove all variables.
add_function(full_name, callable) Register a Python callable; receives a list of parsed argument values.
add_module(module_path, as_name) Load a .py file and register its top-level functions as as_name.function.

Syntax

Optional constructor arguments: function_prefix, include_prefix, variable_prefix, function_name_pattern, variable_name_pattern.

Defaults:

  • Function prefix: ~fn:
  • Include prefix: ~include:
  • Variable prefix: $

Development

pip install maturin
maturin develop
maturin build --release

Run a quick check:

from dtr import Compiler
assert Compiler().compile("plain text") == "plain text"

Publishing

maturin build --release
maturin publish

Use maturin publish --repository testpypi to test on TestPyPI first.

License

MIT — see LICENSE.

Links

Project details


Download files

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

Source Distribution

dtrlib-2.0.0.tar.gz (18.4 kB view details)

Uploaded Source

Built Distribution

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

dtrlib-2.0.0-cp310-cp310-win_amd64.whl (798.9 kB view details)

Uploaded CPython 3.10Windows x86-64

File details

Details for the file dtrlib-2.0.0.tar.gz.

File metadata

  • Download URL: dtrlib-2.0.0.tar.gz
  • Upload date:
  • Size: 18.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.10.2

File hashes

Hashes for dtrlib-2.0.0.tar.gz
Algorithm Hash digest
SHA256 89e83e1440ef4104ef4bf27cc7f79fada8eba6bae248939522f294c90e141381
MD5 74490d1cdc41d015592a734a97100cdc
BLAKE2b-256 e1204eff003b940bccd507cb9039b4029f5fc0816998de38ce421ee019c8cf13

See more details on using hashes here.

File details

Details for the file dtrlib-2.0.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: dtrlib-2.0.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 798.9 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.10.2

File hashes

Hashes for dtrlib-2.0.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 130e1ef6183f03e66c3e9ab239e04b38e5caf59c67498406d203be28b052b53a
MD5 94983981a399ebeb19776e75c148b7ea
BLAKE2b-256 93e41b4df1fbe9b38fd2622a69232c447e080be7f0648b54e27b4b24af68bcec

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