summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-10-04 19:08:19 -0500
committerJesse Luehrs <doy@tozt.net>2012-10-04 19:08:19 -0500
commitaabf883a41f3172275e1a05b10f872cfde5b94c5 (patch)
tree4ef8aa96c37723d0bc98054bb20ce25691573839
parent3aa97f35d6a363350e2c3c41c731c93721b348ac (diff)
downloadtext-handlebars-aabf883a41f3172275e1a05b10f872cfde5b94c5.tar.gz
text-handlebars-aabf883a41f3172275e1a05b10f872cfde5b94c5.zip
support [] to mean literal strings
-rw-r--r--lib/Text/Xslate/Syntax/Handlebars.pm49
1 files changed, 47 insertions, 2 deletions
diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm
index 4ea5f52..dd543dc 100644
--- a/lib/Text/Xslate/Syntax/Handlebars.pm
+++ b/lib/Text/Xslate/Syntax/Handlebars.pm
@@ -2,7 +2,7 @@ package Text::Xslate::Syntax::Handlebars;
use Any::Moose;
use Carp 'confess';
-use Text::Xslate::Util qw($DEBUG $STRING neat p);
+use Text::Xslate::Util qw($DEBUG $NUMBER neat p);
extends 'Text::Xslate::Parser';
@@ -10,6 +10,15 @@ use constant _DUMP_PROTO => scalar($DEBUG =~ /\b dump=proto \b/xmsi);
my $nl = qr/\x0d?\x0a/;
+my $bracket_string = qr/\[ [^\]]* \]/xms;
+my $STRING = qr/(?: $Text::Xslate::Util::STRING | $bracket_string )/xms;
+
+my $single_char = '[.#^/>&;]';
+my $OPERATOR_TOKEN = sprintf(
+ "(?:%s|$single_char)",
+ join('|', map{ quotemeta } qw(..))
+);
+
sub _build_identity_pattern { qr/[A-Za-z_][A-Za-z0-9_?]*/ }
sub _build_comment_pattern { qr/\![^;]*/ }
@@ -27,7 +36,7 @@ sub split_tags {
my $tag_end = $self->tag_end;
my $lex_comment = $self->comment_pattern;
- my $lex_code = qr/(?: $lex_comment | (?: $STRING | [^'"] ) )/xms;
+ my $lex_code = qr/(?: $lex_comment | (?: $STRING | [^\['"] ) )/xms;
my @chunks;
@@ -222,6 +231,42 @@ sub init_symbols {
$self->prefix('..', 0)->set_nud($self->can('nud_uplevel'));
}
+# copied from Text::Xslate::Parser, but using different definitions of
+# $STRING and $OPERATOR_TOKEN
+sub tokenize {
+ my($parser) = @_;
+
+ local *_ = \$parser->{input};
+
+ my $comment_rx = $parser->comment_pattern;
+ my $id_rx = $parser->identity_pattern;
+ my $count = 0;
+ TRY: {
+ /\G (\s*) /xmsgc;
+ $count += ( $1 =~ tr/\n/\n/);
+ $parser->following_newline( $count );
+
+ if(/\G $comment_rx /xmsgc) {
+ redo TRY; # retry
+ }
+ elsif(/\G ($id_rx)/xmsgc){
+ return [ name => $1 ];
+ }
+ elsif(/\G ($NUMBER | $STRING)/xmsogc){
+ return [ literal => $1 ];
+ }
+ elsif(/\G ($OPERATOR_TOKEN)/xmsogc){
+ return [ operator => $1 ];
+ }
+ elsif(/\G (\S+)/xmsgc) {
+ Carp::confess("Oops: Unexpected token '$1'");
+ }
+ else { # empty
+ return [ special => '(end)' ];
+ }
+ }
+}
+
sub nud_name {
my $self = shift;
my ($symbol) = @_;