Skip to main content

A Python library for building dynamic, structured text templates using a declarative, compose-based approach

Project description

TextCompose

PyPI version License Tests Status Release Status Ask DeepWiki

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 text
  • Format — dynamic formatting via f-string
  • Jinja — rendering via Jinja2 templates

Containers

Container — abstract base class for all container components

  • Group — groups child components with a separator
  • List — 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


Download files

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

Source Distribution

textcompose-1.1.0.tar.gz (31.0 kB view details)

Uploaded Source

Built Distribution

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

textcompose-1.1.0-py3-none-any.whl (16.6 kB view details)

Uploaded Python 3

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

Hashes for textcompose-1.1.0.tar.gz
Algorithm Hash digest
SHA256 61126a0598597b245c44a96ed677ddfabc8b8c551ab9e0a0bddafa24ef73a3c0
MD5 192825f52963c09bb90918990d5bafb3
BLAKE2b-256 8a611f1bed88a944573032becf7f75d289a8e9e92f8252ea6a458dfdbff0d66b

See more details on using hashes here.

File details

Details for the file textcompose-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for textcompose-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a7fcb9b480a4e3c3ee75498d2cf227636a0f09932294f963a9827f374b9969b7
MD5 6317b1aa10043216f8be18d9b642b9e4
BLAKE2b-256 935f2f7a780a32ef7d3f6ed678fa57e72fe87e6ea1fa0f2da90b1639562b68cf

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