/[webpac]/trunk/parse_format.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/parse_format.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 54 by dpavlin, Mon Jun 23 20:20:32 2003 UTC revision 381 by dpavlin, Wed Jul 7 17:34:42 2004 UTC
# Line 3  Line 3 
3  # parse_format(...)  # parse_format(...)
4  #  #
5    
   
6  sub parse_format {  sub parse_format {
7          my $type = shift || die "parset_format must be called with type!";          my $type = shift || die "parset_format must be called with type!";
8          my $format = shift || die "parse_format must be called with format!";          my $format = shift || die "parse_format must be called with format!";
# Line 11  sub parse_format { Line 10  sub parse_format {
10          my $i = shift || 0;     # isis repeatable number          my $i = shift || 0;     # isis repeatable number
11          my $codepage = shift || die "parse_format must be called with codepage!";          my $codepage = shift || die "parse_format must be called with codepage!";
12          if ($type eq "isis") {          if ($type eq "isis") {
13                  return parse_isis_format($format,$row,$i,$codepage);                  return parse_iso_format($format,$row,$i,$codepage,'isis_sf');
14          } elsif ($type eq "excel") {          } elsif ($type eq "excel") {
15                  return parse_excel_format($format,$row,$i,$codepage);                  return parse_excel_format($format,$row,$i,$codepage);
16            } elsif ($type eq "marc") {
17                    return parse_iso_format($format,$row,$i,$codepage,'marc_sf');
18            } elsif ($type eq "feed") {
19                    return parse_feed_format($format,$row,$i,$codepage);
20          }          }
21  }  }
22    
23  #-------------------------------------------------------------  #-------------------------------------------------------------
24    
25  sub parse_isis_format {  sub parse_iso_format {
         use isis_sf;  
26    
27          my $format = shift;          my $format = shift;
28          my $row = shift;          my $row = shift;
29          my $i = shift;          my $i = shift;
30          my $codepage = shift;          my $codepage = shift;
31    
32            my $func = shift || die "need to know which sub-field function to use";
33    
34            require $func.".pm";
35    
36            my $out;
37            my $out_swish;
38    
39            my $display;
40            my $swish;
41    
42            sub cnv_cp {
43                    my $codepage = shift;
44                    my $tmp = shift || return;
45                    if ($codepage) {
46                            $tmp = $codepage->convert($tmp) || print STDERR "iso: '$tmp' can't convert\n";
47                    }
48                    return $tmp;
49            }
50    
51            # if format doesn't exits, store it in cache
52            if (! defined($cache->{format}->{$format})) {
53    #               print STDERR "parsing format for '$format'\n";
54                    my @fmt;
55    
56                    my $f = $format;
57    
58                    my $eval;
59                    $eval = $1 if ($f =~ s/^eval{([^}]+)}//);
60    
61                    if ($f =~ s/^([^\d]+)//) {
62                            if ($f) {       # there is more to parse
63                                    push @fmt,$1;
64                            } else {
65                                    @fmt = ('',$1,undef,'');
66    #print STDERR "just one field: $1\n";
67                            }
68                    } else {
69                            push @fmt,'';
70                    }
71    
72                    while ($f) {
73    #       print STDERR "\n#### $f";
74                            # this is EBSCO special to support numeric subfield in
75                            # form of 856#3
76                            if ($f =~ s/^(\d\d\d)#*(\w?)//) {
77                                    push @fmt,$1;
78                                    if ($2) {
79                                            push @fmt,$2;
80                                    } else {
81                                            push @fmt,undef;
82                                    }
83                            # this might be our local scpeciality -- fields 10 and 11
84                            # (as opposed to 010 and 011) so they are strictly listed
85                            # here
86                            } elsif ($f =~ s/^(1[01]\w?)//) {
87                                    push @fmt,$1;
88                                    push @fmt,undef;
89                            } elsif ($f =~ s/^mfn//i) {
90                                    push @fmt,'mfn';
91                                    push @fmt,'';
92                            } elsif ($f =~ s/^([^\d]+)(\d{0,3})/$2/) {
93                                    # still prefix?
94                                    if ($#fmt == 0) {
95                                            $fmt[0] .= $1;
96                                    } else {
97                                            push @fmt,$1;
98                                    }
99                            } elsif ($f =~ s/^([^\d]+\d{0,2})//) {
100                                    if ($#fmt == 0) {
101                                            $fmt[0] .= $1;
102                                    } else {
103                                            push @fmt,$1;
104                                    }
105                            } elsif ($f =~ s/^(\d{1,2})//) {
106                                    if ($#fmt == 0) {
107                                            $fmt[0] .= $1;
108                                    } else {
109                                            push @fmt,$1;
110                                    }
111                            } else {
112                                    print STDERR "unparsed format: $f\n";
113                                    $f = "";
114                            }
115                    }
116                    push @fmt,'' if ($#fmt % 3 != 0);       # add empty suffix
117    
118                    $cache->{format_eval}->{$format} = $eval; # store eval string (if any)
119    
120                    $cache->{format}->{$format} = \@fmt;
121                    
122    #               print STDERR "storing format for '$format': [",join("|",@fmt),"]\n";
123    #               print STDERR "storing format for '$format':",Dumper(@fmt),"\n";
124    #               print STDERR Dumper($cache->{format}->{$format});
125            }
126    
127            # now produce actual record
128            my $tmp = $cache->{format}->{$format} || die "no format cache for '$format'";
129            my @fmt = @{$tmp};
130    #       print STDERR "using format for '$format':",Dumper(@fmt),"\n";
131    #       print STDERR "tmp ",Dumper($tmp);
132    #       print STDERR "cache: ",Dumper($cache->{format}->{$format});
133    
134            # prefix
135            my $prefix = shift @fmt;
136            my $sufix;
137            while($#fmt > 1) {
138                    my $f = shift @fmt || die "BUG: field name can't be empty!";
139                    my $sf = shift @fmt;
140    
141                    if ($f eq 'mfn' && $i == 0) {
142                            $display .= $sufix if ($display);
143                            $display .= $row->{mfn};
144                    } else {
145                            my $val = &$func($row,$f,$sf,$i);
146                            if ($val) {
147    #                               print STDERR "val: $val\n";
148                                    my $tmp = cnv_cp($codepage,$val);
149                                    if ($display) {
150                                            $display .= $sufix.$tmp;
151                                    } else {
152                                            $display = $tmp;
153                                    }
154                                    $swish .= $tmp." ";
155                            }
156                    }
157                    $sufix = shift @fmt;
158            }
159            $display = $prefix.$display.$sufix if ($display);
160    
161            my $eval = $cache->{format_eval}->{$format};
162            if ($eval) {
163                    sub fld2str {
164                            my ($func,$row,$f,$sf,$i) = @_;
165    #print STDERR "## in fld2str\n";
166                            my $tmp = $codepage->convert(&$func($row,$f,$sf,$i)) ||  $codepage->convert(&$func($row,$f,$sf,0)) || '';
167                            return "'$tmp'";
168                    }
169    
170                    $eval =~ s/v(\d+)\^(\w*)/fld2str($func,$row,$1,$2,$i)/eg;
171    #print STDERR "## eval: $eval\n";
172                    if (eval "$eval") {
173                            die "eval error: eval{$eval}: $@" if ($@);
174                            return ($swish,$display);
175                    } else {
176                            die "eval error: eval{$eval}: $@" if ($@);
177                            return (undef,undef);
178                    }
179            }
180    
181            if (@fmt) {
182                    print STDERR "format left unused: [",join("|",@fmt),"]\n";
183                    print STDERR "format: [",join("|",@{$tmp}),"]\n";
184            }
185    
186    #       print STDERR "format: {",$format || '',"} display: {",$display || '',"} swish: {",$swish || '',"}\n";
187    
188            return ($swish,$display);
189    }
190    
191    #-------------------------------------------------------------
192    
193    sub parse_excel_format {
194            my $format = shift;
195            my $row = shift;
196            my $i = shift;
197            my $codepage = shift;
198    
199            return if ($i > 0);     # Excel doesn't support repeatable fields
200    
201          my $out;          my $out;
202          my $out_swish;          my $out_swish;
203    
204          my $prefix = "";          my $prefix = "";
205          if ($format =~ s/^([^\d]+)//) {          if ($format =~ s/^([^A-Z\|]{1,3})//) {
206                  $prefix = $1;                  $prefix = $1;
207          }          }
208    
209          my $display;          my $display;
210          my $swish;          my $swish;
211    
212          while ($format) {          while ($format && length($format) > 0) {
213  #print STDERR "\n#### $format";  #print STDERR "\n#### $format #";
214                  if ($format =~ s/^(\d\d\d)(\w?)//) {                  if ($format =~ s/^\|([A-Z]{1,2})\|//) {
215                          my $isis_tmp = isis_sf($row,$1,$2,$i);  #print STDERR "--$1-> $format -[",length($format),"] ";
216                          if ($isis_tmp) {                          if ($row->{$1}) {
217                                  $isis_tmp = $codepage->convert($isis_tmp) if ($codepage);                                  my $tmp = $row->{$1};
218                                  $display .= $prefix . $isis_tmp;                                  if ($codepage) {
219                                  $swish .= $isis_tmp." ";                                          $tmp = $codepage->convert($tmp) || warn "excel: $1 '$tmp' can't convert";
220  #print STDERR " == $isis_tmp";                                  }
221                          }                                  $display .= $prefix . $tmp;
222                          $prefix = "";                                  $swish .= $tmp." ";
223                  # this might be our local scpeciality -- fields 10 and 11  #print STDERR " == $tmp";
                 # (as opposed to 010 and 011) so they are strictly listed  
                 # here  
                 } elsif ($format =~ s/^(1[01])//) {  
                         my $isis_tmp = isis_sf($row,$1,undef,$i);  
                         if ($isis_tmp) {  
                                 $isis_tmp = $codepage->convert($isis_tmp) if ($codepage);  
                                 $display .= $prefix . $isis_tmp;  
                                 $swish .= $isis_tmp." ";  
224                          }                          }
225                          $prefix = "";                          $prefix = "";
226                  } elsif ($format =~ s/^mfn//i) {                  } elsif ($format =~ s/^([^A-Z\|]+)(\|[A-Z]{1,2}\|)/$2/) {
                         $display .= $prefix . $row->{mfn};  
                         $prefix = "";  
                 } elsif ($format =~ s/^([^\d]+)(\d{0,3})/$2/) {  
                         $prefix .= $1 if ($display);  
                 } elsif ($format =~ s/^([^\d]+\d{0,2})//) {  
                         $prefix .= $1 if ($display);  
                 } elsif ($format =~ s/^(\d{1,2})//) {  
227                          $prefix .= $1 if ($display);                          $prefix .= $1 if ($display);
228                  } else {                  } else {
229                          print STDERR "unparsed format: $format\n";                          #print STDERR "unparsed format: $format\n";
230                          $prefix .= $format;                          $prefix .= $format;
231                          $format = "";                          $format = "";
232                  }                  }
233    #print STDERR " display: $display swish: $swish [format: $format]";
234          }          }
235          # add suffix          # add suffix
236          $display .= $prefix if ($display);          $display .= $prefix if ($display);
# Line 83  sub parse_isis_format { Line 240  sub parse_isis_format {
240    
241  #-------------------------------------------------------------  #-------------------------------------------------------------
242    
243  sub parse_excel_format {  sub parse_feed_format {
244          my $format = shift;          my $format = shift;
245          my $row = shift;          my $data = shift;
246          my $i = shift;          my $i = shift;
247          my $codepage = shift;          my $codepage = shift;
248    
249            # XXX feed doesn't support repeatable fields, but they really
250            # should, This is a bug. It should be fixed!
251            return if ($i > 0);
252    
253          my $out;          my $out;
254          my $out_swish;          my $out_swish;
255    
256          my $prefix = "";          my $prefix = "";
257          if ($format =~ s/^([^A-Z\|]{1,3})//) {          if ($format =~ s/^([^\d\|]{1,3})//) {
258                  $prefix = $1;                  $prefix = $1;
259          }          }
260    
# Line 102  sub parse_excel_format { Line 263  sub parse_excel_format {
263    
264          while ($format && length($format) > 0) {          while ($format && length($format) > 0) {
265  #print STDERR "\n#### $format #";  #print STDERR "\n#### $format #";
266                  if ($format =~ s/^\|([A-Z]{1,2})\|//) {                  if ($format =~ s/^\|(\d+)\|//) {
267  #print STDERR "--$1-> $format -[",length($format),"] ";  #print STDERR "--$1-> $format -[",length($format),"] ";
268                          if ($row->{$1}) {                          if ($data->{$1}) {
269                                  my $tmp = $row->{$1};                                  my $tmp = $data->{$1};
270                                  $tmp = $codepage->convert($tmp) if ($codepage);                                  if ($codepage) {
271                                            $tmp = $codepage->convert($tmp) || warn "feed: $1 '$tmp' can't convert\n";
272                                    }
273                                  $display .= $prefix . $tmp;                                  $display .= $prefix . $tmp;
274                                  $swish .= $tmp." ";                                  $swish .= $tmp." ";
275  #print STDERR " == $tmp";  #print STDERR " == $tmp";
276                          }                          }
277                          $prefix = "";                          $prefix = "";
278                  } elsif ($format =~ s/^([^A-Z\|]+)(\|[A-Z]{1,2}\|)/$2/) {                  } elsif ($format =~ s/^([^\d\|]+)(\|\d+\|)/$2/) {
279                          $prefix .= $1 if ($display);                          $prefix .= $1 if ($display);
280                  } else {                  } else {
281                          print STDERR "unparsed format: $format\n";                          print STDERR "unparsed format: $format\n";
# Line 127  sub parse_excel_format { Line 290  sub parse_excel_format {
290          return ($swish,$display);          return ($swish,$display);
291  }  }
292    
293    #-------------------------------------------------------------
294    
295  1;  1;

Legend:
Removed from v.54  
changed lines
  Added in v.381

  ViewVC Help
Powered by ViewVC 1.1.26