Stories
Slash Boxes
Comments
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

Alias (5735)

Alias
  (email not shown publicly)
http://ali.as/

Journal of Alias (5735)

Sunday December 06, 2009
03:54 PM

Template::Tiny 0.01 - Request for features

[ #39983 ]

For a few years now, I've been thinking about doing a ::Tiny job on the Template Toolkit. But it was never quite a big enough problem to be worthwhile, because Template.pm doesn't have any particularly horrendous dependencies and always seems like a reasonable way to spend 2.2meg of RAM.

But for Padre 2.2meg is a hell of a lot to spend, because of the multiplier effect of threading. Template.pm is geared much more towards being a load focal point in a website or a content generation system, it is just that much too complex when used as a utility class for simple code generation (which is what I want to use it for in Padre).

So Template::Tiny is happening, and I've just uploaded the first release which support pretty much nothing other than basic [% foo %] insertions from a single variable HASH.

Just adding support for tags, plus a tiny bit of boilerplate, has memory consumption at around 24k of RAM consumed out of my anticipated budget of around 100k.

Before I go any further, I'd like to ask you guys what you consider to be the essential TT features that you would want to retain even in a light weight ::Tiny context.

For me, this includes the three basic array, hash and object foo.bar usages, and IF blocks (and potentially simple | filters).

What do you want?

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • For it to be useful, I really think it needs loops.

    <table>
    [% FOR item IN items %]
      <tr><td>[% item.name %]</td><td>[% item.value %]</td>
    [% END %]
    </table>

    I work hard (usually) to ensure there is no logic in my templates, but I can't do without loops. And it needs to be easily upgradeable to Template::Toolkit.

    That being said, many people will be upset about the whitespace issues of the above. There are obvious ways of dealing with this for the general case (w

    • Er, pretend I didn't miss out on a closing "tr" tag :)

    • And filters. I may not imagine the bad things that would happen if item.name and/or item.value contain text with substrings that are meaningful as HTML markup.

      Besides, for a template system I want to be able to insert text between every listed item, but not after the final item; just like join does in Perl, but then with a loop-ish instead of a functional syntax. (Just being able to test for the last iteration in the loop, would do the trick.)

      I don't remember the syntax TT2 uses for such a feature, but I'm

  • loops
    variable substitution (of course)
    simple config (where templates are found and the like)
    maybe the "include" function as well

  • The one thing I am missing from TT while working in Text::MicroTemplate is the loop variable. It lets you check what the loop index is and has a few convenience methods, such as loop.first. http://template-toolkit.org/docs/manual/Variables.html#section_loop [template-toolkit.org]
  • What I'd like is the ability to have simple plugins to support custom directives. That way we'd be able expand TT::Tiny just a little to meet our needs.
    --
    Every token is like an unnecessary stain on whitespace and idleness.
  • If T::Tiny doesn't have some looping construct, I don't see the advantage over a simple eval or string interpolation.

  • I don't like logic in templates, but I will set a flag in the stash and allow the template to control the presentation. For example, assume it is hard to figure out if something is "pending". After lots of hard work the program figures it out and sets $stash{pending}=1. Then the template simply has [% IF pending %]Item is pending![% END %] or whatever.
  • These have all been mentioned, but I just wanted to add one more voice:

    • Loops - Not just loops, but also with the ability to tell first, index, last and possibly even vs odd.
    • Includes - Doesn't need to be as complicated or as varied as TT, but being able to break templates up avoids a lot of duplication.
    • Filters - You can't do web or XML stuff safely without having HTML escaping, and being able to define your own filters makes it easy to extend.