| Template-TAL documentation | Contained in the Template-TAL distribution. |
Template::TAL::ValueParser - parse attribute values
my $string = "path:/foo/bar/0/baz"; my $value = Template::TAL::ValueParser->value( $string );
This module is responsible for parsing the values of attributes in templates, and returning them. It can also split multiple values up into a list, using semicolons as list seperators. The way that values are parsed is based very strongly on TALES (http://www.zope.org/Wikis/DevSite/Projects/ZPT/TALES) but the actual TALES spec is provided by the language module Template::TAL::Language::TALES.
commands in 'string' can be split by ';' characters, with raw semicolons represented as ';;'. This command splits the string on the semicolons, and de-escapes the ';;' pairs. For instance:
foo; bar; baz;; narf
splits to:
['foo', 'bar', 'baz; narf']
Not technically part of TALES, I think, but really useful for TAL anyway.
parse a TALES expression in the first param, such as
string:Hello there path:/a/b/c
using the passed contexts (in order) to look up path values. Contexts should be hashes, and we will look in each context for a defined key of the given path until we find one.
(note - I need the multiple contexts code because TAL lets you set globals in define statements, so I need a local context, and a global context)
The plugins value should be an arrayref of language plugins to ask about the various types of string. At a minimum, this should probably include Template::TAL::Language::TALES, or the module won't do a lot.
Written by Tom Insam, Copyright 2005 Fotango Ltd. All Rights Reserved
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| Template-TAL documentation | Contained in the Template-TAL distribution. |
package Template::TAL::ValueParser; use warnings; use strict; use Carp qw( croak );
sub split { my ($class, $string) = @_; # TODO this is _hokey_. Do it properly. $string =~ s/;;/\x{12345}/g; my @list = grep {$_} split(/\s*;\s*/, $string); s/\x{12345}/;/g for @list; return @list; }
sub value { my ($class, $exp, $contexts, $plugins) = @_; Carp::croak("contexts must be arrayref, not ".ref($contexts)) unless ref($contexts) eq 'ARRAY'; my ($type, $string) = $exp =~ /^\s*(?:(\w+):\s*)?(.*)/; $type ||= "path"; my $sub = "process_tales_$type"; for my $plugin (@{ $plugins || [] }) { if ($plugin->can($sub)) { return $plugin->$sub($string, $contexts, $plugins ); } } die "unknown TALES type '$type'\n"; }
1;