diff options
author | Jesse Luehrs <doy@tozt.net> | 2012-10-04 19:21:27 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2012-10-04 19:24:50 -0500 |
commit | 02a68abd6466029ea92d6160347e11f2b4d5d25a (patch) | |
tree | 0a7039bb36560573d70656e3b5782ffd860e639b | |
parent | aabf883a41f3172275e1a05b10f872cfde5b94c5 (diff) | |
download | text-handlebars-02a68abd6466029ea92d6160347e11f2b4d5d25a.tar.gz text-handlebars-02a68abd6466029ea92d6160347e11f2b4d5d25a.zip |
allow [] for dereferencing with literals
-rw-r--r-- | lib/Text/Xslate/Syntax/Handlebars.pm | 15 | ||||
-rw-r--r-- | t/expressions.t | 24 |
2 files changed, 37 insertions, 2 deletions
diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm index dd543dc..fe2f083 100644 --- a/lib/Text/Xslate/Syntax/Handlebars.pm +++ b/lib/Text/Xslate/Syntax/Handlebars.pm @@ -553,10 +553,25 @@ sub define_function { return; } +sub parse_literal { + my $self = shift; + my ($literal) = @_; + + if ($literal =~ /\A\[(.*)\]\z/ms) { + $literal = $1; + $literal =~ s/(["\\])/\\$1/g; + $literal = '"' . $literal . '"'; + } + + return $self->SUPER::parse_literal($literal); +} + sub is_valid_field { my $self = shift; my ($field) = @_; + # allow foo.[10] + return 1 if $field->arity eq 'literal'; # undefined symbols are all treated as variables - see undefined_name return 1 if $field->arity eq 'variable'; # allow ../../foo diff --git a/t/expressions.t b/t/expressions.t index f12022c..0026dbe 100644 --- a/t/expressions.t +++ b/t/expressions.t @@ -73,7 +73,28 @@ render_ok( "backtracking into other hash variables with ../ and ." ); -{ local $TODO = "unimplemented"; +render_ok( + '{{articles.[10].comments}}', + { + articles => { + 10 => { comments => "First post!" }, + }, + }, + 'First post!', + "field access with non-identifiers" +); + +render_ok( + '{{articles.[.foo\som#th"ing].comments}}', + { + articles => { + '.foo\som#th"ing' => { comments => "First post!" }, + }, + }, + 'First post!', + "field access with non-identifiers" +); + render_ok( '{{articles.[10].comments}}', { @@ -85,7 +106,6 @@ render_ok( 'First post!', "array dereferencing" ); -} render_ok( '{{.}} {{this}}', |