-
Notifications
You must be signed in to change notification settings - Fork 27
/
local.coretag
138 lines (108 loc) · 3.04 KB
/
local.coretag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# 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