diff options
author | Jesse Luehrs <doy@tozt.net> | 2012-10-04 16:28:22 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2012-10-04 16:28:22 -0500 |
commit | 57ea0e7ab1189cd2d1e72ae48a32696095d4f2f7 (patch) | |
tree | e5b70ef7152ae6534ed4dfe8439ba7a40c798ea7 /lib/Text | |
parent | a2215f8cc2114615ff6faa6650ad657b05f10a40 (diff) | |
download | text-handlebars-57ea0e7ab1189cd2d1e72ae48a32696095d4f2f7.tar.gz text-handlebars-57ea0e7ab1189cd2d1e72ae48a32696095d4f2f7.zip |
better check for matching closing tags
Diffstat (limited to 'lib/Text')
-rw-r--r-- | lib/Text/Xslate/Syntax/Handlebars.pm | 24 |
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; |