> > 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 Html-template-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/html-template-users