Skip to main content

Python template engine.

Project description

Backslant
=========

Is a template engine built in completely other way then before.

First - you can use all python and you must use it if you want something more
then just tags.

Second - it completely iterative. You can feed iterators or generators as input and get iterative output.

Third - it works through imports. If you want to get template just import it and use. If you want include
other template - import it. If you want template in some dir, import it! Like ```from . import other_template```.
Use absolute or relative imports.

So, with this principles in mind, you can try this proof of concept thing, due it is not complete:

import backslant

sys.meta_path.insert(0, backslant.PymlFinder('./templates', hook='mypkg.templates'))
from mypkg.templates.home import index

for chunk in index.render(title='The Real Thing'):
print(chunk)

And templates/home/index.bs:

html
head
title
= options['title']
body
div.content#content
h1#header "Header"

You can define a function:

- def render_form(method):
form(method=method)
input(type="text" value="123")

End call it:

h1
== render_form('POST')

Yes, its this simple, you just use python constructions. There `==` is shotrcut for `- yield from`. And `=` is a shortcut for `- yield`.

And for now inheritance of templates you can made just with function.

base.bs:

!doctype/ html
html
head
title "Page Title"
body
h1{'class': ' '.join(['main', 'content'], 'ng-app': 'Application'}
| Page Header
div.content
== options['content_block']()
div.footer
| Backslant © 2015

index.bs:

- from . import base
- def content():
- for i in range(10):
p
= 'Paragraph {}'.format(i)
== base.render(content_block=content)

I think about adding something like ruby blocks or something to made this a bit more simpler, but
what can be more simple then functions define and call?

But we have syntax sugar for this:

:call base.render(*options)
:content_block
- for i in range(10):
p
= 'Paragraph {}'.format(i)
:footer_block
p "Index page"

Arguments
---------

To define tag arguments you can use arg=`parentised python expression or variable name` or `tag.class {'a': 5, 'b': ' '.join(options.classes)}` form.


Render or not render?
---------------------

When template compiled, we need it to place in module somehow. If you have any tags or calls in top level, then we definitely must place them into function. And we create `render` function for this purpose. Then you import template and call this `render`.

But if you have not in top level, then will yield anything, then function is not needed - you can create library file.
So - if you template on top level only defines functions and imports, then backslant will not implicitly cover it in `render` function, and this is way to define your template libs. You even can distribute it on PyPi.


Flask
-----

If you want to integrate backslant into existing project, it can be painful to rewrite all templates. So
we have workaround:

from backslant.flask import jinja2_integration
extend_jinja2, include_jinja2 = jinja2_integration(application)

And call it in template:

- from my_app.lib.backslant import extend_jinja2, include_jinja2

:call extend_jinja2('layouts/base.html')
- def content(ctx):
== include_jinja2('layouts/header.html')
div.container
div.page-header
h1
= options['company'].alias


Afterwords
----------

I have completed examples with flask and http.server in examples folder. And you can compare perfomance with jinja2. Its almost equal.

I will complete feature set soon, stay tuned.

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

backslant-0.2.7.tar.gz (7.9 kB view details)

Uploaded Source

Built Distribution

backslant-0.2.7-py3-none-any.whl (14.9 kB view details)

Uploaded Python 3

File details

Details for the file backslant-0.2.7.tar.gz.

File metadata

  • Download URL: backslant-0.2.7.tar.gz
  • Upload date:
  • Size: 7.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for backslant-0.2.7.tar.gz
Algorithm Hash digest
SHA256 3a90f89263a01f3b8028156b0df2be6aefcf90f2edaf72a86aec2f74ca615514
MD5 323832e811d6b0d952ae45d45c13faf6
BLAKE2b-256 8f36b5bcc7b8c964da204d41d28f1f4efece0e56402ec46a7768af066af861d3

See more details on using hashes here.

File details

Details for the file backslant-0.2.7-py3-none-any.whl.

File metadata

File hashes

Hashes for backslant-0.2.7-py3-none-any.whl
Algorithm Hash digest
SHA256 4bfbb033e0af3a95e9e93a4fb05d98a5e0ac4a875431430b955e50445d5901e5
MD5 22e439b6193d2e564b5a5014c9998595
BLAKE2b-256 a401c78c5508403cf64361a01de76584d336346d35b931c29626884e296e3153

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page