Attached is a complete patch to resolve this. It includes a test case
to illustrate it, code to address it, and related MANIFEST and Changes
file updates.
You may need to apply the patch with an option to ignore whitespace, as
i indented a block of the code to make it more readable.
Mark
Wed Aug 10 19:43:43 EST 2005 Mark Stosberg <mark@summersault.com>
* RT#14097 is fixed. Extra <tmpl_else> tags now die with an error.
diff -rN -u old-html-tmpl/Changes new-html-tmpl/Changes
--- old-html-tmpl/Changes 2005-08-10 19:45:04.000000000 -0500
+++ new-html-tmpl/Changes 2005-08-10 19:43:26.000000000 -0500
@@ -1,3 +1,7 @@
+ - Bug Fix: Including more than one <tmpl_else> tag in <tmpl_unless> or
+ <tmpl_unless> now dies with an error message, instead of silently ignoring
+ one of the clauses. (Mitar and Mark Stosberg, RT#14097)
+
2.7 Thu Jun 24 12:00:00 2004
- New Feature: Added javascript escaping with ESCAPE=JS. (Craig Manley)
diff -rN -u old-html-tmpl/MANIFEST new-html-tmpl/MANIFEST
--- old-html-tmpl/MANIFEST 2005-08-10 19:45:04.000000000 -0500
+++ new-html-tmpl/MANIFEST 2005-08-10 19:40:25.000000000 -0500
@@ -3,6 +3,7 @@
Makefile.PL
Template.pm
t/99-old-test-pl.t
+t/else_else_bug.t
templates/simple.tmpl
templates/simple-loop.tmpl
templates/medium.tmpl
diff -rN -u old-html-tmpl/Template.pm new-html-tmpl/Template.pm
--- old-html-tmpl/Template.pm 2005-08-10 19:45:04.000000000 -0500
+++ new-html-tmpl/Template.pm 2005-08-10 19:37:46.000000000 -0500
@@ -910,6 +910,7 @@
sub WHICH () { 4 };
sub WHICH_IF () { 0 };
sub WHICH_UNLESS () { 1 };
+sub IS_ELSE () { 5 };
# back to the main package scope.
package HTML::Template;
@@ -2180,10 +2181,12 @@
my $cond = pop(@ifstack);
die "HTML::Template->new() : found <TMPL_ELSE> with no matching <TMPL_IF> or <TMPL_UNLESS> at $fname : line $fcounter." unless defined $cond;
+ die "HTML::Template->new() : found second <TMPL_ELSE> tag for <TMPL_IF> or <TMPL_UNLESS> at $fname : line $fcounter." if $cond->[HTML::Template::COND::IS_ELSE];
my $else = HTML::Template::COND->new($cond->[HTML::Template::COND::VARIABLE]);
$else->[HTML::Template::COND::WHICH] = $cond->[HTML::Template::COND::WHICH];
$else->[HTML::Template::COND::JUMP_IF_TRUE] = not $cond->[HTML::Template::COND::JUMP_IF_TRUE];
+ $else->[HTML::Template::COND::IS_ELSE] = 1;
# need end-block resolution?
if (defined($cond->[HTML::Template::COND::VARIABLE_TYPE])) {
diff -rN -u old-html-tmpl/t/else_else_bug.t new-html-tmpl/t/else_else_bug.t
--- old-html-tmpl/t/else_else_bug.t 1969-12-31 19:00:00.000000000 -0500
+++ new-html-tmpl/t/else_else_bug.t 2005-08-10 19:38:14.000000000 -0500
@@ -0,0 +1,12 @@
+
+use Test::More qw/no_plan/;
+use HTML::Template;
+
+eval {
+ my $template = HTML::Template->new(
+ debug => 0,
+ scalarref => \'
+ Before. <TMPL_IF NAME="TEST"> 1. <TMPL_ELSE> 2. <TMPL_ELSE> 3. </TMPL_IF> After.',
+ );
+};
+isnt($@, '', "including 2 <tmpl_else> tags for one tmpl_if should throw an error");