1 package WebPAC::Lookup;
8 use base qw/WebPAC::Common/;
14 WebPAC::Lookup - simple normalisation plugin to produce lookup
22 our $VERSION = '0.01';
26 This module will produce in-memory lookups for easy resolution of lookups
27 to different records in source files. This will enable you to resolve
28 relational data in source format.
30 It can also be use with C<WebPAC::Tree> to produce tree hierarchies.
32 Lookups are defined in C<conf/lookup/isis.pm>.
34 C<lookup> argument is an array of lookups to create. Each lookup must have C<key> and
35 C<val>. Optional parametar C<eval> is perl code to evaluate before storing
39 { 'key' => 'd:v900', 'val' => 'v250^a' },
40 { 'eval' => '"v901^a" eq "Podruèje"',
41 'key' => 'pa:v561^4:v562^4:v461^1',
50 Create new lookup object.
52 my $lookup = new WebPAC::Lookup(
53 lookup_file => '/path/to/conf/lookup/lookup.pm',
54 is_lookup_regex => 'lookup{[^\{\}]+}';
55 save_lookup_regex => 'lookup{([^\{\}]+)}';
65 my $log = $self->_get_logger();
67 my $lookup_file = $self->{'lookup_file'} || $log->logconfess("need path to lookup file in lookup_file parametar");
69 my $lookup_code = read_file($lookup_file) || $log->logconfess("can't read lookup file $lookup_file: $!");
73 do $lookup_file or $log->logdie("Failed to read configuration parameters '$lookup_file' $! $@");
74 $self->{'lookup_def'} = \@lookup || $log->logdie("lookup config $lookup_file doesn't produce \@lookup array");
77 $log->logconfess("lookup config file isn't ARRAY", sub { Dumper( $self->{'lookup_def'} ) }) if ($self->{'lookup_def'} !~ /ARRAY/o);
79 $self->{'is_lookup_regex'} ||= 'lookup{[^\{\}]+}';
80 $self->{'save_lookup_regex'} ||= 'lookup{([^\{\}]+)}';
83 $self->{'LOOKUP_REGEX'} = qr/$self->{'is_lookup_regex'}/;
84 $self->{'LOOKUP_REGEX_SAVE'} = qr/$self->{'save_lookup_regex'}/;
86 $log->debug("regexps: ", $self->{'LOOKUP_REGEX'}, " ", $self->{'LOOKUP_REGEX_SAVE'});
88 $self ? return $self : return undef;
93 Create lookup from record using lookup definition.
97 Returns true if this record produced lookup.
104 my $log = $self->_get_logger();
106 my $rec = shift || $log->logconfess("need record to create lookup");
107 $log->logconfess("need HASH as first argument!") if ($rec !~ /HASH/o);
108 $log->logconfess("need HASH as first argument!") if ($self->{'lookup_def'} !~ /ARRAY/o);
112 foreach my $i (@{ $self->{'lookup_def'} }) {
113 $log->logconfess("need key") unless defined($i->{'key'});
114 $log->logconfess("need val") unless defined($i->{'val'});
118 if (defined($i->{'eval'})) {
119 # eval first, so we can skip fill_in for key and val
120 my $eval = $self->fill_in($rec,$i->{'eval'}) || next;
121 if ($self->_eval($eval)) {
122 my $key = $self->fill_in($rec,$i->{'key'}) || next;
123 my @val = $self->fill_in($rec,$i->{'val'}) || next;
124 $log->debug("stored $key = ",sub { join(" | ",@val) });
125 push @{$self->{'lookup'}->{$key}}, @val;
128 my $key = $self->fill_in($rec,$i->{'key'}) || next;
129 my @val = $self->fill_in($rec,$i->{'val'}) || next;
130 $log->debug("stored $key = ",sub { join(" | ",@val) });
131 push @{$self->{'lookup'}->{$key}}, @val;
140 Perform lookups on format supplied to it.
142 my $text = $lookup->lookup('[v900]');
144 Lookups can be nested (like C<[d:[a:[v900]]]>).
151 my $log = $self->_get_logger();
153 my $tmp = shift || $log->logconfess("need format");
155 if ($tmp =~ $self->{'LOOKUP_REGEX'}) {
158 $log->debug("lookup for: ",$tmp);
161 while (my $f = shift @in) {
162 if ($f =~ $self->{'LOOKUP_REGEX_SAVE'}) {
164 if ($self->{'lookup'}->{$k}) {
165 foreach my $nv (@{$self->{'lookup'}->{$k}}) {
167 $tmp2 =~ s/lookup{$k}/$nv/g;
177 $log->logconfess("return is array and it's not expected!") unless wantarray;
186 Returns precompiled regex for lookup format.
188 if ($foo =~ $lookup->reges) { ... }
195 return $self->{'LOOKUP_REGEX'};
200 Dobrica Pavlinusic, C<< <dpavlin@rot13.org> >>
202 =head1 COPYRIGHT & LICENSE
204 Copyright 2005 Dobrica Pavlinusic, All Rights Reserved.
206 This program is free software; you can redistribute it and/or modify it
207 under the same terms as Perl itself.
211 1; # End of WebPAC::Lookup