local —
Attribute | Pos. | Req. | Default | Description |
---|---|---|---|---|
interpolate | 0 | interpolate input? | ||
reparse | 1 | interpolate output? | ||
hide | 0 | Hide the tag return value? |
Interchange 5.9.0:
Source: code/SystemTag/local.coretag
Lines: 138
# Copyright 2007 Interchange Development Group and others # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. See the LICENSE file for details. # # $Id: local.coretag,v 1.2 2007-08-09 13:40:52 pajamian Exp $ UserTag local Order scratch UserTag local attrAlias scratches scratch UserTag local attrAlias value values UserTag local posNumber 1 UserTag local hasEndTag UserTag local addAttr UserTag local Description Tag to localize scratch and/or values for block UserTag local Routine <<EOR sub { my ($scratch, $opt, $body) = @_; use Storable qw/ dclone /; $Storable::forgive_me = 1; ## It may seem simpler just to clone the top-level reference and ## be done with it, but we are going through all these gyrations ## to prevent the problem of overwriting code, which is not ## preserved with a cloning operation. ## ## Obviously (or maybe not) if you pass a top-level array which ## happens to contain a code reference, you are going to lose it. ## But code references which are in non-localized hash keys will ## survive. my %delete_top; my %delete; my %settings; # Perhaps {extra} is a bad option, but it has to be something. We # don't have the _ intro for a key, alas. Doubt it will often be # used, but discounts could be localized, I suppose. my @extra = split /[,\s\0]+/, $opt->{extra}; for my $top (qw/ values scratch /, @extra) { exists $Vend::Session->{$top} or do { $delete_top{$top} = 1; next; }; my $v = $Vend::Session->{$top}; unless (ref($v) eq 'HASH') { if(! ref $v) { $settings{$top} = $v; } else { $settings{$top} = dclone($v); } next; } my @values = Text::ParseWords::shellwords($opt->{$top}); for(@values) { if( ! exists $v->{$_}) { $delete{$top}{$_} = 1; } elsif(! ref $v->{$_}) { $settings{$top}{$_} = $v->{$_}; } else { $settings{$top}{$_} = dclone($v->{$_}); } } } my $result = interpolate_html($body); for my $top (qw/ values scratch /, @extra) { if(my $d = $delete_top{$top}) { delete $Vend::Session->{$top}; next; } unless (ref($settings{$top}) eq 'HASH') { $Vend::Session->{$top} = $settings{$top}; next; } my $s = $settings{$top}; my $d = $delete{$top}; my $v = $Vend::Session->{$top}; for(keys %$d) { delete $v->{$_}; } for(keys %$s) { $v->{$_} = $settings{$top}{$_}; } } return $result; } EOR UserTag local Documentation <<EOT =head1 NAME local -- localize scratch, values, etc. for code block. =head1 SYNOPSIS [set foo]bar[/set] [local scratch="foo"] [set foo]nonbar[/set] foo=[scratch foo] [/local] [if scratch foo eq bar] local worked. [else] local did not work, kept at [scratch foo]. [/else] [/if] =head1 DESCRIPTION The local tag allows you to drop some code using scratch or values settings in a page without the possibility of affecting the overall operation of the site. EOT