A Python library for building dynamic, structured text templates using a declarative, compose-based approach
Project description
TextCompose
TextCompose is a Python library for creating dynamic, structured text templates. Inspired by aiogram-dialog, it provides a flexible and intuitive interface for composing text.
✨ Features
- Flexible text composition from components
- Conditional rendering support (
when) - Grouping and repeating blocks
- Formatting via f-string and Jinja2
- Easily extensible with new components
🚀 Installation
You can install the library in two ways:
Using uv
If you are using the uv package manager, you can install it as follows:
uv add textcompose
Using pip
pip install textcompose
💻 Usage
Components Overview
General
Template— main class for combining and rendering components
Elements
Element — abstract base class for all element components
Text— outputs static textFormat— dynamic formatting via f-stringJinja— rendering via Jinja2 templates
Containers
Container — abstract base class for all container components
Group— groups child components with a separatorList— repeats a template for a collection
Logic Components
Logic — abstract base class for all container components
If— conditional rendering (if_,then_,else_)
All components support the when parameter — it controls the display of the component and accepts a condition (expression, function or magic_filter).
📝 Example
All usage examples can be found in the example folder.
from magic_filter import F
from textcompose import Template
from textcompose.containers import Group, List
from textcompose.elements import Format, Jinja, Text
from textcompose.logics import If
template = Template(
Format("Hello, {name}!"),
Format("Status: {status}"), # or `lambda ctx: f"Status: {ctx['status']}"` with function
If(
F["notifications"] > 0, # `if_` - condition to check if there are notifications
Format("You have {notifications} new notifications."), # `then_` - content to render if condition is True
Format("You not have new notifications."), # `else_` - content to render if condition is False
),
Group(
Jinja("\nTotal messages {{ messages|length }}:"),
List(
Format("Time - {item[time]}:"),
Format("- {item[text]}"),
sep="\n", # `sep` - separator between list items
inner_sep="\n", # `inner_sep` - separator between parts of a single item
getter=lambda ctx: ctx["messages"], # `getter` - function or F to extract the list of messages from context
),
sep="\n", # `sep` - separator between children of Group
when=F["messages"].len() > 0, # `when` - show this block only if there are messages
),
Text("\nThank you for using our service!"), # or "Recent messages:" without class
)
context = {
"name": "Alexey",
"status": "Online",
"notifications": 2,
"messages": [
{"text": "Your package has been delivered.", "time": "09:15"},
{"text": "Reminder: meeting tomorrow at 10:00.", "time": "18:42"},
],
}
print(template.render(context))
Output:
Hello, Alexey!
Status: Online
You have 2 new notifications.
Total messages 2:
Time - 09:15:
- Your package has been delivered.
Time - 18:42:
- Reminder: meeting tomorrow at 10:00.
Thank you for using our service!
👨💻 Contributing
Contributions are welcome! If you have suggestions or improvements, please open an issue or submit a pull request.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file textcompose-1.1.0.tar.gz.
File metadata
- Download URL: textcompose-1.1.0.tar.gz
- Upload date:
- Size: 31.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
61126a0598597b245c44a96ed677ddfabc8b8c551ab9e0a0bddafa24ef73a3c0
|
|
| MD5 |
192825f52963c09bb90918990d5bafb3
|
|
| BLAKE2b-256 |
8a611f1bed88a944573032becf7f75d289a8e9e92f8252ea6a458dfdbff0d66b
|
File details
Details for the file textcompose-1.1.0-py3-none-any.whl.
File metadata
- Download URL: textcompose-1.1.0-py3-none-any.whl
- Upload date:
- Size: 16.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7fcb9b480a4e3c3ee75498d2cf227636a0f09932294f963a9827f374b9969b7
|
|
| MD5 |
6317b1aa10043216f8be18d9b642b9e4
|
|
| BLAKE2b-256 |
935f2f7a780a32ef7d3f6ed678fa57e72fe87e6ea1fa0f2da90b1639562b68cf
|