/[cvs]/nfo/perl/libs/Regexp/Group.pm
ViewVC logotype

Contents of /nfo/perl/libs/Regexp/Group.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (show annotations)
Fri Feb 14 14:17:42 2003 UTC (21 years, 3 months ago) by joko
Branch: MAIN
Changes since 1.1: +14 -2 lines
+ more warnings and verbosing

1 ## ------------------------------------------------------------------------
2 ## $Id: Group.pm,v 1.1 2002/12/22 14:16:39 joko Exp $
3 ## ------------------------------------------------------------------------
4 ## $Log: Group.pm,v $
5 ## Revision 1.1 2002/12/22 14:16:39 joko
6 ## + initial check-in
7 ##
8 ## ------------------------------------------------------------------------
9
10
11 package Regexp::Group;
12
13 use strict;
14 use warnings;
15
16 use base 'DesignPattern::Object::Logger';
17
18
19 use Data::Dumper;
20
21 use Data::Compare::Struct qw( isEmpty );
22
23 my @patterns;
24
25 # ------------ common perl object constructor ------------
26 sub new {
27 my $invocant = shift;
28 my $class = ref($invocant) || $invocant;
29 my @args = ();
30 @_ && (@args = @_);
31 #$logger->debug( __PACKAGE__ . "->new( @args )" ); # this is not "common"!
32 my $self = { @_ };
33 bless $self, $class;
34 $self->{caller} = caller;
35
36 #print Dumper(caller(2));
37 #exit;
38
39 $self->_init();
40 return $self;
41 }
42
43 sub _init {
44 my $self = shift;
45
46 # TODO/REVIEW: compile patterns?
47 #@patterns = map{ qr/$_/ } @patterns;
48
49 # dereference main/raw data (payload)
50 $self->{data} = ${$self->{data}};
51 }
52
53 sub scan {
54 my $self = shift;
55 my $stepkeys = shift;
56 my $coderef = shift;
57
58 #my $nodecount_default = shift;
59 my $nodecount_default = 19;
60
61 #print "SCAN", "\n";
62 #print $self->{pattern}, "\n";
63 $self->{result} = [];
64 $self->{result_raw} = [];
65
66 # configure tracing
67 # respects additional trace-options passed to _trace-method
68 $self->{TRACE_OPTIONS} = 1;
69 # disables _any_ tracing - even if sub-conditions evaluate to true values
70 $self->{TRACE_DISABLED} = 0;
71
72 $self->log('starting to scan');
73
74 #for (1..20) {
75
76 my $patterncount = 0;
77 my $match_in_loop;
78
79 my $steps;
80 if ($stepkeys) {
81 $steps = $stepkeys;
82 $patterncount++;
83 } else {
84 $steps = $self->{metadata}->{steps};
85 }
86
87 #print "cb-2: $coderef", "\n";
88
89 foreach my $stepkey_current (@{$steps}) {
90 $self->_scan_step($stepkey_current, $coderef);
91 $patterncount++;
92 }
93
94 #}
95
96 # ... propagate them to processing
97
98 # assign result to property of object's current instance
99 #push @{$self->{result}}, $result;
100
101 #$self->{code}->($self->{caller}, $self);
102
103 }
104
105 sub _scan_step {
106
107 my $self = shift;
108 my $stepkey = shift;
109 my $callback = shift;
110
111 #print "cb-3: $callback", "\n";
112
113 #$self->log("running step '$stepkey'", 'debug');
114 $self->log("running step '$stepkey'");
115
116 my $dataref = $self->{data};
117 my $metadata = $self->{metadata}->{$stepkey};
118 my $pattern = $self->{patterns}->{$stepkey};
119 my $coderef = $self->{coderefs}->{$stepkey};
120
121 #print Dumper($coderef);
122 #print Dumper($self->{data});
123 #exit;
124
125 $self->trace("data used", $dataref, 0, undef, { tag => '', exit => 0 });
126 $self->trace("metadata used", $metadata, 0, undef, { tag => '', exit => 0 });
127 $self->trace("pattern used", $pattern, 0, undef, { tag => '', exit => 0 });
128 $self->trace("coderef used", $coderef, 0, undef, { tag => '', exit => 0 });
129
130 #print "pattern: $pattern", "\n";
131 #exit;
132
133 # if metadata variable "noscan" is supplied, don't kick off the regex-engine, just call the coderef
134 # TODO: log this event
135 if ($metadata->{noscan} && $metadata->{noscan} == 1) {
136 $coderef->($self, undef, undef, $callback);
137 return;
138 }
139
140 # dereference data if its still referenced
141 my $data = ${$self->{data}};
142
143 if (!$data) {
144 $self->log("data is empty: stepkey=$stepkey", 'warning');
145 return;
146 }
147
148 #$self->{data} =~ s{
149 $data =~ s{
150
151 $pattern # the pattern itself - as contained in a string - actually gets interpolated here
152
153 }{
154
155 print "." if $self->{verbose};
156
157 $self->log("match in step '$stepkey'");
158
159 # have a clean item to fill in slots
160 my $result_item = [];
161
162 # 1. build matched structure from slots - grouping functionality for slots
163
164 # V1 - hand-rolled
165 #my $result = [$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20];
166 #print Dumper($result);
167
168 my $count = $metadata->{nodecount};
169
170 # TODO: re-renable this!
171 #$count ||= $nodecount_default;
172
173 # V2 - iterate!
174 # push dummy item to slot '0' to mimic known behaviour of accessing $1, $2, $3, ....
175 push @{$result_item}, 'n/a';
176 for my $i (1..$count) {
177 my $slot = '$' . $i;
178 push @{$result_item}, eval($slot);
179 }
180
181
182 # 2. remember built result (raw) in object - grouping functionality for items
183 $self->log("pushing raw result");
184 push @{$self->{result_raw}}, $result_item;
185
186
187 # 4. check/modify further metadata
188 # e.g. 'column_positions' means: "this step is a ColumnProvider"
189 #print Dumper($metadata);
190 if (my $positions = $metadata->{column_positions}) {
191 $self->trace('positions', $positions, 0);
192
193 #print Dumper($result_item);
194
195 # build column-names array from position-metadata
196 my @column_names;
197 map {
198 push @column_names, $result_item->[$_];
199 } @$positions;
200
201 # store additional metadata
202 $metadata->{column_names} = \@column_names;
203 }
204
205 $self->trace('column-names', $metadata->{column_names}, 0);
206
207
208 #return '';
209 #$&;
210 push(@{$self->{matches}->{parsed_chunks}}, $&);
211 #undef;
212
213 my $matchpos = pos($data);
214 $self->{matches}->{position} = $matchpos;
215 push @{$self->{matches}->{positions}}, $matchpos;
216
217
218 # 3. call coderef to get _processed_ result if given (callback)
219 $self->log("calling coderef '$coderef'");
220 if ($coderef) {
221 my $result_processed = {};
222 if ($coderef->($self, $result_item, $result_processed, $callback)) {
223 $self->trace("pushing processed result", $result_processed, 0);
224 push @{$self->{result}}, $result_processed if $result_processed;
225 } else {
226 $self->log('processing of container failed', 'warning');
227 return;
228 }
229 } else {
230 # TODO: croak 'no coderef';
231 }
232
233 # pass back matched content if we are not the ones to delete something (pass-back-if-not-remover)
234 # with this mechanism, we can iterate over the same content again and again and don't loose data while doing this
235 # without this, multiple scan stepping would not be possible since each step would either remove its
236 # matched content - or not: no flexibility.
237 # as it seems we need flexibility at any point ;-( in order not to break our necks with code-maintenance ;-)
238 # this also can get configured here (this flag is contained in the metadata-part of your filter-declaration)
239 $& if !$metadata->{remover};
240
241 }xge;
242
243
244 #$self->{data_rest} = \$data;
245 $self->{data} = \$data;
246
247 #$self->trace('matches', $self->getMatches(), 1);
248 #$self->trace('matches-positions', $self->getMatchPositions(), 1);
249
250 #print "\r" if $self->{verbose};
251 print " " x 50 if $self->{verbose};
252 print "\r" if $self->{verbose};
253
254 }
255
256 sub continue {
257 my $self = shift;
258 my $scankey = shift;
259 #print "CONTINUE!", "\n";
260 #$self->{data} = $self->{data_rest};
261 return $self->scan($scankey);
262 }
263
264 sub getMatches {
265 my $self = shift;
266 return $self->{result_raw};
267 }
268
269 sub getResults {
270 my $self = shift;
271 return $self->{result};
272 }
273
274 sub getDataRest {
275 my $self = shift;
276 return $self->{data_rest};
277 }
278
279 sub getMatchCount {
280 my $self = shift;
281
282 my $matches = $self->getMatches();
283 return if isEmpty($matches);
284
285 my $count = $#{$matches};
286 $count++;
287 return $count;
288 }
289
290 sub getMatchPositions {
291 my $self = shift;
292 if (!$self->getMatchCount()) {
293 $self->{matches}->{positions} = [];
294 }
295 return $self->{matches}->{positions};
296 }
297
298 sub getMatchPosition {
299 my $self = shift;
300 return $self->{matches}->{position};
301 }
302
303 1;

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed