Skip to content

Instantly share code, notes, and snippets.

@lyndsysimon
Last active December 20, 2015 21:08
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lyndsysimon/6195069 to your computer and use it in GitHub Desktop.
Save lyndsysimon/6195069 to your computer and use it in GitHub Desktop.
A quick concept of a pythonic templating language based on Zen Coding, with inspiration from HAML and SASS.
#### Template (proposed, unnamed language)
doctype(5)
html>head
style('my_stylesheet.css')
script('my_script.js')
title= {{ title }}
body>div.container
navbar(main_menu_links)
def navbar(links):
div.navbar>ul>li.navbar-link*?>iterlinks(main_menu_links)
#### Output (HTML)
<!DOCTYPE html>
<html>
<head>
<link rel='stylesheet' href='my_stylesheet.css' />
<script src='my_script.js'></script>
<title>My Page Title</title>
</head>
<body>
<div class='container'>
<div class='navbar'>
<ul>
<li class='navbar-link'>
<a href='/'>Home</a>
</li>
<li class='navbar-link'>
<a href='/about'>About</a>
</li>
<li class='navbar-link'>
<a href='/faq'>FAQ</a>
</li>
</ul>
</div>
</div>
</body>
</html>
#### Context (Python)
title = 'My Page Title'
main_menu_links = (
('/', 'home'),
('/about', 'about')
('/faq', 'faq')
)
@lyndsysimon
Copy link
Author

The first idea here that I believe is unique is that I'd like to be able to switch between nesting HTML via indentation level (a'la HAML and JADE) and Zen Coding's syntax. The following snippets:

a>b>c>d
    "foo"

and

a>b
    c>d
        "foo"

would produce the same output:

<a>
    <b>
        <c>
            <d>"foo"</d>
        </c>
    </b>
</a>

The second is that I'd like to be able to leverage Zen Coding's syntax in conjunction with Python's iterators. While Zen allowed you to create multiple elements by specifying a multiplier (e.g., ul>li*5 would get you 5 li elements under a ul), generators don't know their own length.

div.navbar>ul>li.navbar-link*?>iterlinks(main_menu_links)

The iterlinks() method in the above would accept a generator or 2-tuples and iterate over them until they it was exhausted. The ? character signifies that the element in the chain is to be iterated without specifying the number of iterations as Zen Coding would require.

@lyndsysimon
Copy link
Author

Just in case this goes somewhere, a nod to Stickyworld for their blog post The war on curly braces and angle brackets, which I found on Reddit's /r/python/ and inspired me to consider what I want in a templating language.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment