I wrote this rather quickly. It allows you to put a template.showell file in each app folder, and will render the templates on demand if you call "render_showell_to_response(...)". It'll check the last modification time of the .showell files, and re-renders them if they've changed, allowing you to come close to ignoring any running of the Showell pre-processor on your own.
=== import os, sys import showell from django.conf import settings from django.utils.importlib import import_module from django.shortcuts import render_to_response from datetime import datetime _SHOWELL_FILES_ = [] def render_showell_to_response(template, *args, **kwargs): ''' Monitor any templates.showell file in an app folder for changes, and republish them if necessary before serving up the request ''' # Get a list of app showell files # Runs only once if len(_SHOWELL_FILES_) == 0: for app in settings.INSTALLED_APPS: m = import_module(app) for path in m.__path__: sfile = os.path.join(path, 'templates.showell') if os.path.exists(sfile): _SHOWELL_FILES_.append(sfile) # Check the date of each showell file for sfile in _SHOWELL_FILES_: if not hasattr(settings, '_SHOWELL_LAST_RENDERED_') or \ datetime.fromtimestamp(os.path.getmtime(sfile)) > settings._SHOWELL_LAST_RENDERED_: #print 'Republishing %s' % sfile showell.publish(sfile) # Set the last time we looked settings._SHOWELL_LAST_RENDERED_ = datetime.now() # Render normal template return render_to_response(template, *args, **kwargs) On Nov 27, 1:08 pm, Steve Howell <showel...@yahoo.com> wrote: > I would like to announce an early version ofShowellMarkup. It > allows you or your designer to create web pages without the visual > clutter of </table>, </ol>, {% endfor %}, {% endwith %}, and friends. > > Unlike templating solutions that compete with Django, theShowell > Markup plays nice with Django and still delegates all the heavy > lifting to Django, so you still get variable interpolation, extends, > custom filter tags, include, etc. from Django. > > ShowellMarkup just does two jobs and does them well: > > 1. Allow for indentation-based blocking (both for HTML and Django > tags) > 2. Allow for clean HTML one-liners that truly separate markup from > content. > > The implementation ofShowellMarkup is just a preprocessor to publish > Django templates. You edit theShowellMarkup from a master file and > then publish the templates to their locations within the Django > directory structure and you're done. You can keep both markups under > source control. The preprocessor writes clean markup, so you can > debug at the Django level as needed. Also, you are not forced to > useShowellidioms everywhere; normal Django and HTML still passes through > the preprocessor without modification. > > You can find the implementation here: > > http://www.djangosnippets.org/snippets/1819/ > > The indentation feature is, of course, inspired by Python/YAML/HAML/ > etc. > > The one-liner syntax is inspired by Django's use of pipes to implement > filters. > > Here are some examples (some of which look better in a monospace > font)... > > You can use indentation syntax for HTML tags like table. > > Instead of this... > > <table> > <tr> > <td> > Right > </td> > <td> > Center > </td> > <td> > Left > </td> > </tr> > </table> > > You can write DRY code this... > > >> table > >> tr > >> td > Right > >> td > Center > >> td > Left > > Lists work the same way, and note that attributes are not a > problem. > > Instead of this... > > <div class="spinnable"> > <ul> > <li id="item1"> > One > </li> > <li id="item2"> > Two > </li> > </ul> > </div> > > You can write DRY code this... > > >> div class="spinnable" > >> ul > >> li id="item1" > One > >> li id="item2" > Two > > This tool should play nice with most templating engines, but it > has > specific support for Django. > > Instead of this... > > {% extends 'base.html' %} > {% load smartif %} > > {% block body %} > {% for book in books %} > {{ book }} > {% endfor %} > > {% if condition %} > Display this > {% elif condition %} > Display that > {% else %} > {% include 'other.html' %} > {% endif %} > {% endblock %} > > You can write DRY code this... > > %% extends 'base.html' > %% load smartif > > %% block body > %% for book in books > {{ book }} > > %% if condition > Display this > %% elif condition > Display that > %% else > %% include 'other.html' > > The tool also lets you dry up individual lines of HTML using a > piping concept. Note the clean separation between markup and > content. > > Instead of this... > > <tr class="header_row"> > <th class="first_column">Original Author</th> > <th>Commenters</th> > <th>Title</th> > <th>Action</th> > <th>Last words</th> > <th>By</th> > <th>When</th> > </tr> > > <ol class="boring_list"> > <li>One</li> > <li>Two</li> > <li>Three</li> > <li>{{ element4|join:',' }}</li> > </ol> > > You can write DRY code this... > > >> tr class="header_row" > Original Author | th class="first_column" > Commenters | th > Title | th > Action | th > Last words | th > By | th > When | th > > >> ol class="boring_list" > One | li > Two | li > Three | li > {{ element4|join:',' }} | li > > Pipes get applied from right to left, as you would expect. > You can also throw a br on at the end. > > Instead of this... > > <span class="greeting"><b>Hello World!</b></span><br /> > <span class="parting_words"><i>Goodbye World!</i></span><br /> > <hr /> > <p class="praise"> > Indentation-based syntax is so > Pythonic! > </p> > > You can write DRY code this... > > Hello World! | b | span class="greeting" ; br > Goodbye World! | i | span class="parting_words"; br > ; hr > >> p class="praise" > Indentation-based syntax is so > Pythonic! > > There are three special shortcuts for LINK, FORM, and HIDDEN. > You could easily extend the preprocessor to do more. > > Instead of this... > > <a href="{% url collection.archive referral.pk %}">Archive</a> > <a href="{% url home.home %}">Home</a> > <a href="{% url friendship.friends %}">Friends</a> > <a href="{% url referrals.create %}">Create a card</a> > <a href="{% url activity.recent_changes %}">Recent changes</a> > > <form action="{% url referrals.create %}" method="POST"> > {{ form.as_p }} > <input type="hidden" name="referral" > value="{{ referral.id }}" /> > </form> > > You can write DRY code this... > > Archive LINK collection.archive referral.pk > Home LINK home.home > Friends LINK friendship.friends > Create a card LINK referrals.create > Recent changes LINK activity.recent_changes > > >> FORM referrals.create > {{ form.as_p }} > {{ referral.id } | HIDDEN referral > > I am calling the markupShowellMarkup for now, but a better name > might be in order. "Showell" rhymes with "towel." It is my username, > and hopefully it "shows well" too. -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.