Skip to main content

Catpile — Pythonic DSL → CatWeb JSON compiler

Project description

Catpile

Catpile

Python License

A Pythonic DSL → CatWeb JSON compiler. Write Roblox CatWeb scripts in a clean, readable language — and define your UI layout with a declarative indentation-based DSL. Compile both to the JSON format CatWeb expects.

.cat  source → [Parser] → IR (AST) → [Emitter] → CatWeb JSON
.catui source → [CatUI Parser] → CatUI IR → [CatUI Emitter] → CatWeb UI JSON

Quick Start

# Install
pip install catpile

# Compile a script
cpile script.cat -o output.json

# Decompile a full CatWeb page to scripts + UI layout + project config
cpile decompile page.json -o output-dir/

# Or extract just the UI layout as CatUI DSL (no scripts)
cpile catui page.json -o layout.catui

# Compile a full page from .catui DSL
# (see docs/guides/03-projects.md)

# Web service (localhost:8788)
python3 -m catpile.web

Documentation

Online: catpile-docs.vercel.app

Full source is also in the docs/ directory:

Section Covers
CatLang Reference - docs/lang/ Syntax, variables, scopes, events, actions, control flow, expressions - everything about the language
CatUI DSL Reference - docs/catui/ Declarative UI layout: element classes, property aliases, annotations, styling, compilation
Compiler - docs/compiler/ Pipeline, IR, emitter, optimizer, taste system, schema parser, CatUI DSL compiler - how Catpile works under the hood
Tools - docs/tools/ CLI reference, Web API, VSCode extension guide
Guides - docs/guides/ Installation, quickstart, project system, decompiling, CatUI DSL, color reference
Examples - docs/examples/ Step-by-step with full explanations and snippets

CatLang at a Glance

# One-script example
on loaded:
    log("Hello World!")

# With variables, conditions, and loops
on pressed("myButton"):
    count = 0
    repeat(10):
        inc(count, 1)
    if gte(count, 10):
        log("Max reached!")
        hide("myButton")

# Multi-script project
script "display":
    on loaded:
        render_list()

script "data":
    fn render_list():
        foreach(items):
            log("{l_index}: {l_value}")

CatUI DSL at a Glance

# Declarative UI layout for a CatWeb page
page "main":
    background = "#202020"
    title = "My App"

    frame root [globalid: "rootGID"]:
        size = "{1,0},{1,0}"
        bg = "#1a1a2e"

        textlabel title:
            text = "Welcome"
            font = "GothamBold"

        textbutton submit:
            text = "Click Me"
            uicorner corner:
                radius = "0,8"

    script main:

Compile with the builder — scripts from .cat files merge into the UI tree automatically.

Key Features

  • Indentation-based syntax (Python-like) and bracket syntax (JS-like) via the taste system
  • CatUI DSL — Declare UI layouts with page "name": blocks, element class/alias/annotations/properties/children, property aliases (bgbackground_color), and full round-trip decompilation
  • Schema-based compilation - every action knows its slot types (variable, object, any), so braces {} are handled automatically
  • Dict literals - config = {"theme": "dark", "volume": 0.8} compiles to CREATE_TABLE + SET_ENTRY chains
  • String interpolation - "Hello {name}!" auto-generates STR_CONCAT
  • Math expressions - constant folding at compile time, VAR_* chains at runtime for variables
  • Multi-return actions - x, y = getCursor()
  • Scope-prefixed variables - l_countl!count (local), o_boardo!board (object), bare names are global by default
  • Path-based UI references - page.button instead of raw global IDs
  • Auto-indentation (for both tastes), auto-complete, code color preview
  • Web editor at cpile.bouyakhsass.com with project import/export

Project Structure

catpile/
├── catpile/
│   ├── __init__.py          # Package init + scope_var_name()
│   ├── schema.json          # 122 actions, 14 events
│   ├── schema_parser.py     # CatWeb schema fetcher (from quitism/catlua)
│   ├── mappings.py          # Schema loader, aliases, make_action()
│   ├── ir.py                # IR types (VarRef, StrLit, MathExpr, …)
│   ├── emitter.py           # IR → CatWeb JSON (scripts)
│   ├── parser.py            # Indent taste tokenizer + parser
│   ├── decompiler.py        # CatWeb JSON → .cat source + .catui DSL
│   ├── cli.py               # CLI entry point
│   ├── decompile_cli.py     # Decompile CLI entry point
│   ├── web.py               # WSGI web API
│   ├── lsp.py               # LSP server (stdio)
│   ├── ui.py                # UI element linker
│   ├── optimizer.py         # -O1/-O2/-O3 optimizations
│   ├── builder.py           # Project build system
│   ├── catui_ir.py          # CatUI DSL AST types (PageDef, UIElement, …)
│   ├── catui_parser.py      # CatUI DSL tokenizer + parser
│   ├── catui_emitter.py     # CatUI IR → CatWeb UI JSON
│   ├── ui_elements.json     # 23 UI element classes, aliases, property mappings
│   ├── tastes/
│   │   ├── __init__.py      # Abstract Taste base class
│   │   ├── v1.py            # "indent" taste
│   │   ├── bracket.py       # "bracket" taste
│   │   └── registry.py      # Taste discovery
├── examples/
├── tests/
├── docs/                    # Full documentation
├── pyproject.toml           # Build config
├── LICENSE
├── CHANGELOG.md
├── .gitignore
└── README.md

License

Distributed under the GNU General Public License v3.0. See LICENSE for details.

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

catpile-1.1.0.tar.gz (74.1 kB view details)

Uploaded Source

Built Distribution

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

catpile-1.1.0-py3-none-any.whl (75.1 kB view details)

Uploaded Python 3

File details

Details for the file catpile-1.1.0.tar.gz.

File metadata

  • Download URL: catpile-1.1.0.tar.gz
  • Upload date:
  • Size: 74.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for catpile-1.1.0.tar.gz
Algorithm Hash digest
SHA256 957e531e957294e0be1de630e88ae2dd731acfa75579c08670b024b645962855
MD5 b912a0830fea44d596af489ac42e2e2d
BLAKE2b-256 e5af3948a40bec6fce90854487a97a8f05fcd88f729bdb4a625a2d6fcf67284e

See more details on using hashes here.

Provenance

The following attestation bundles were made for catpile-1.1.0.tar.gz:

Publisher: publish.yaml on SwirX/catpile

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: catpile-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 75.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for catpile-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c47d89544deba5de4a89f5ac0e4f094c6fdbe4cbf45a64bf210240aa79ecec6d
MD5 8e954ac6be76ea8e6f9a9367278c6671
BLAKE2b-256 663e20fb045816c870daf6e749a64fa6af9f9af5b61de5579d3ca63dabe398d8

See more details on using hashes here.

Provenance

The following attestation bundles were made for catpile-1.1.0-py3-none-any.whl:

Publisher: publish.yaml on SwirX/catpile

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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