summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-10-04 16:28:22 -0500
committerJesse Luehrs <doy@tozt.net>2012-10-04 16:28:22 -0500
commit57ea0e7ab1189cd2d1e72ae48a32696095d4f2f7 (patch)
treee5b70ef7152ae6534ed4dfe8439ba7a40c798ea7
parenta2215f8cc2114615ff6faa6650ad657b05f10a40 (diff)
downloadtext-handlebars-57ea0e7ab1189cd2d1e72ae48a32696095d4f2f7.tar.gz
text-handlebars-57ea0e7ab1189cd2d1e72ae48a32696095d4f2f7.zip
better check for matching closing tags
-rw-r--r--lib/Text/Xslate/Syntax/Handlebars.pm24
1 files changed, 22 insertions, 2 deletions
diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm
index 80e689b..3494f45 100644
--- a/lib/Text/Xslate/Syntax/Handlebars.pm
+++ b/lib/Text/Xslate/Syntax/Handlebars.pm
@@ -314,6 +314,8 @@ sub std_block {
if ($name->arity ne 'variable' && $name->arity ne 'field' && $name->arity ne 'call') {
$self->_unexpected("opening block name", $self->token);
}
+ my $name_string = $self->_field_to_string($name);
+
$self->advance(';');
my $body = $self->statements;
@@ -335,8 +337,10 @@ sub std_block {
if ($closing_name->arity ne 'variable' && $closing_name->arity ne 'field' && $closing_name->arity ne 'call') {
$self->_unexpected("closing block name", $self->token);
}
- if ($closing_name->id ne $name->id) { # XXX
- $self->_unexpected('/' . $name->id, $self->token);
+ my $closing_name_string = $self->_field_to_string($closing_name);
+
+ if ($name_string ne $closing_name_string) {
+ $self->_unexpected('/' . $name_string, $self->token);
}
$self->advance(';');
@@ -555,6 +559,22 @@ sub check_lambda {
);
}
+sub _field_to_string {
+ my $self = shift;
+ my ($symbol) = @_;
+
+ # undo check_lambda
+ return $self->_field_to_string($symbol->third)
+ if $symbol->arity eq 'if';
+
+ # name and variable can just be returned
+ return $symbol->id
+ unless $symbol->arity eq 'field';
+
+ # field accesses should recurse on the first and append the second
+ return $self->_field_to_string($symbol->first) . '.' . $symbol->second->id;
+}
+
__PACKAGE__->meta->make_immutable;
no Any::Moose;