> > although I wouldn't consider some of the enhancements "feature
> > creep" (ie I think not having TMPL_ELSIF would mean that a feature
> > is missing) -> I thank him for producing a very use piece of code.
>
> Thanks, I appreciate that. I'm certainly not above changing my mind
> if enough people see a need for a particular feature. I'm definitely
> thinking about doing something about variable TMPL_INCLUDEs, for
> example.
ok - thats good to hear...
> > And these enhancements show that H::T can undergo more enhancements
> > without 'breaking'... some of the features added to this version,
> > are based on ideas from the people on this list -> they were added
> > without a major re-architecture, more like a code evolution.
>
> When I think about the dangers of feature creep I think about
> global_vars. It's a great feature which I've come to think of as the
> way HTML::Template should have worked from the beginning. It's also a
> terrible hack which still doesn't work quite right and clutters the
> code in a number of places.
fair enough - the way I look at it is:
if it works, then it will always be a better design that something which
doesn't yet exist...
H::T may contain some hacks, but most of the cool stuff in this world, is a
result of good hacks... I consider H::T to be a good hack... :-)
> > - I absolutely needed some bug fixes which Sam hasn't fixed
>
> Can you refresh my memory about these?
The main one that needed fixing was that the wrong *fname *fcounter and *fmax
where populated when reaching the end of more than one TMPL_INCLUDEd file.
Starting at line 2300, it reads:
# count newlines in chunk and advance line count
$fcounter += scalar(@{[$chunk =~ m/(\n)/g]});
# if we just crossed the end of an included file
# pop off the record and re-alias to the enclosing file's info
pop(@fstack), (*fname, *fcounter, *fmax) = \ ( @{$fstack[$#fstack]} )
if ($fcounter > $fmax);
where as it should read:
# count newlines in chunk and advance line count
$fcounter += scalar(@{[$chunk =~ m/(\n)/g]});
# if we just crossed the end of an included file
# pop off the record and re-alias to the enclosing file's info
while ($fcounter > $fmax) {
my $counter_offset = $fcounter - $fmax;
pop(@fstack), (*fname, *fcounter, *fmax) = \ ( @{$fstack[$#fstack]} );
$fcounter += $counter_offset;
}
Notice here that we pop() the current frame off multiple times, depending on
how many TMPL_INCLUDEs deep were at.
I cant remember _why_ I needed it fixed, but I remember being bitten a few
times when I forgot to apply the patch...
Another...
sub _normalise_options {...} (line 1582) is used to push options into LOOPs,
but doesn't work 100% of the time when used with H::T::E, as the:
$template->{options}{expr}
$template->{options}{expr_func}
values are not pushed into the LOOP. Again I cant remeber why I fixed it, but
it needed doing... Note that this fix implies also pushing 'expr ' and
'expr_func' onto the _new_from_loop(%hash) (ie where it is used in the
'/TMPL_LOOP' test, line 2067)
And for the purests... H::T::E should read (line 236):
$self = $self->SUPER::output(...);
rather than :
my $result = HTML::Template::output($self, ...);
just in case someone is overloading $self->output().
> > (note that most of these changes / enhancements cant be made by
> > subclassing H::T...)
>
> Which ones would you consider impossible? I'm sure I could implement
> TMPL_xxx extensions and TMPL_ELSIF in a sub-class.
granted, if you can sub-class to create TMPL_xxx, you can quite easily create
TMPL_ELSIF... but TMPL_ELSIF is such a nice thing to have as part of the
standard H::T....
As for custom TMPL_xxx, I dont see how you can simply subclass '_parse' to
detect your custom tag, without impacting quite a large performance hit. The
simplest solution is to have H::T's big honking regex, capture TMPL_xxx
directly; then if the user has the 'use_custom_tag' enabled in the options,
call into the sub-class via a virtual function.
cheers,
Mathew
PS: As for custom TMPL_VAR ESCAPE support (which I didn't mention before), I
simply moved the package definitions into their own files so that H::T can
dynamically load them. This allows me to have as many useful/useless ESCAPE
types that I care for, just by sub-classing from H::T::ESCAPE, ie, I can do the
following:
some html...<TMPL_VAR NAME="data" ESCAPE="MyCustomEscapeRoutine">
Where "MyCustomEscapeRoutine" gets auto-loaded by H::T...
-------------------------------------------------------
The SF.Net email is sponsored by: Beat the post-holiday blues
Get a FREE limited edition SourceForge.net t-shirt from ThinkGeek.
It's fun and FREE -- well, almost....http://www.thinkgeek.com/sfshirt
_______________________________________________
Html-template-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/html-template-users