my eye
Originally the templating language for <a href=https://github.com/webpy/webpy/blob/master/web/template.py><code>web.py</code></a>, I've ported it to modern python for <a href=https://ragt.ag/code/projects/webint/files/web/templating><code>webint</code></a> and added <a href=https://github.com/zopefoundation/RestrictedPython>RestrictedPython</a> support.

## Examples

For python webapps: [canopy python project](https://ragt.ag/code/projects/canopy/files/canopy/templates)

For writing posts/pages: [post body renderer in webint-posts app](https://ragt.ag/code/projects/webint-posts/files/webint_posts/templates/__init__.py#L12) and [this page's source](/templetor/source)

## History

> The web.py template language, called Templetor is designed to bring the power of Python to templates. Instead of inventing new syntax for templates, it re-uses python syntax. If you know the Python programming language, you will be at home.<br>---<cite>https://webpy.org/docs/0.3/templetor</cite>

## Security

> Templetor intentionally limits variable access within a template. A user has access to the variables passed into the template and some builtin python functions. This allows untrusted users to write templates, and not worry about them causing harm to the running system. You can, of course, increase the global variables available.<br>---<cite>https://webpy.org/docs/0.3/templetor</cite>

> RestrictedPython is a tool that helps to define a subset of the Python language which allows to provide a program input into a trusted environment.<br>---<cite>https://github.com/zopefoundation/RestrictedPython</cite>

Templetor generates an AST representation of the template that is then passed through RestrictedPython. A few default restrictions are relaxed and "safe builtins" are allowed, see <a href=https://ragt.ag/code/projects/webint/files/web/templating/templating.py>`templating.py`</a>.

## Usage

### Syntax

#### Expression Substitution

Special character $$ is used to specify python expressions. Expression can be enclosed in () or {} for explicit grouping.

    Look, a $$string. 
    Hark, an $${arbitrary + expression}. 
    Gawk, a $$dictionary[key].function("argument"). 
    Cool, a $$(limit)ing.

#### Assignments

Sometimes you may want to define new variables and re-assign some variables.

<pre>$$ bug = get_bug(id)
&lt;h1&gt;$$bug.title&lt;/h1&gt;
&lt;div&gt;$$bug.description&lt;/div&gt;&lt;/pre&gt;
    
Notice the space after $$ in the assignment. It is required to differentiate assignment from expression substitution.

#### Filtering

By default, Templetor uses web.websafe filter to do HTML-encoding.

    $$ foo = "<div>bar</div>"

$ foo = "<div>bar</div>"

To turnoff filter use : after $$. For example, the following will not be html escaped:

    $$foo

    $foo

    $$:foo

    $:foo

#### Newline Suppression

#### Escaping $$

#### Comments

#### Control Structures

#### Other Statements

#### Builtins & Globals

##### `$$web` &

###### Transaction Context

    $$web.tx

Query parameters:

    $$web.tx.request.uri.query

Example:

    $:web.tx.request.uri.query

<p><a href=?foo=bar&bat=baz>example query parameters</a></p>

<form>
<label>Favorite Color: <input name=favorite_color></label><br>
<button>Submit</button>
</form>

#### HTTP Requests

    $$ homepage = web.get("ragt.ag")
    $$homepage.card

$# homepage = web.get("ragt.ag")

    $#:homepage.card