use strict;
use warnings;
-our $VERSION = '0.19';
+our $VERSION = '0.22';
use URI;
use URI::Escape ();
sub new {
my $class = shift;
- my $templ = shift || '';
+ my $templ = shift;
+ $templ = '' unless defined $templ;
my $self = bless { template => $templ, _vars => {} } => $class;
$self->_study;
sub _study {
my ( $self ) = @_;
my @hunks = grep { defined && length } split /(\{.+?\})/, $self->template;
+ my $pos = 1;
for ( @hunks ) {
next unless /^\{(.+?)\}$/;
- $_ = $self->_compile_expansion( $1 );
+ $_ = $self->_compile_expansion( $1, $pos++ );
}
$self->{ studied } = \@hunks;
}
sub _compile_expansion {
- my ( $self, $str ) = @_;
+ my ( $self, $str, $pos ) = @_;
my %exp = ( op => '', vars => [], str => $str );
if ( $str =~ /^([+#.\/;?&|!\@])(.+)/ ) {
# remove "optional" flag (for opensearch compatibility)
$var{ name } =~ s{\?$}{};
- $self->{ _vars }->{ $var{ name } }++;
+ $self->{ _vars }->{ $var{ name } } = $pos;
push @{ $exp{ vars } }, \%var;
}
sub template {
my $self = shift;
- my $new_template = shift;
+ my $templ = shift;
# Update template
- if ( $new_template && $new_template ne $self->{ template } ) {
- $self->{ template } = $new_template;
+ if ( defined $templ && $templ ne $self->{ template } ) {
+ $self->{ template } = $templ;
$self->{ _vars } = {};
$self->_study;
return $self;
}
sub variables {
- return keys %{ $_[ 0 ]->{ _vars } };
+ my @vars = sort {$_[ 0 ]->{ _vars }->{ $a } <=> $_[ 0 ]->{ _vars }->{ $b } } keys %{ $_[ 0 ]->{ _vars } };
+ return @vars;
}
sub expansions {
=head2 variables
-Returns an array of unique variable names found in the template. NB: they are returned in random order.
+Returns an array of unique variable names found in the template (in the order of appearance).
=head2 expansions