unsorted perl tools and snippets
[webpac] / parse_format.pm
1 #-------------------------------------------------------------
2 #
3 # parse_format(...)
4 #
5
6
7 sub parse_format {
8         my $type = shift || die "parset_format must be called with type!";
9         my $format = shift || die "parse_format must be called with format!";
10         my $row = shift || die "parse_format must be called with row!";
11         my $i = shift || 0;     # isis repeatable number
12         my $codepage = shift || die "parse_format must be called with codepage!";
13         if ($type eq "isis") {
14                 return parse_isis_format($format,$row,$i,$codepage);
15         } elsif ($type eq "excel") {
16                 return parse_excel_format($format,$row,$i,$codepage);
17         }
18 }
19
20 #-------------------------------------------------------------
21
22 sub parse_isis_format {
23         use isis_sf;
24
25         my $format = shift;
26         my $row = shift;
27         my $i = shift;
28         my $codepage = shift;
29
30         my $out;
31         my $out_swish;
32
33         my $prefix = "";
34         if ($format =~ s/^([^\d]+)//) {
35                 $prefix = $1;
36         }
37
38         my $display;
39         my $swish;
40
41         while ($format) {
42 #print STDERR "\n#### $format";
43                 if ($format =~ s/^(\d\d\d)(\w?)//) {
44                         my $tmp = isis_sf($row,$1,$2,$i);
45                         if ($tmp) {
46                                 if ($codepage) {
47                                         $tmp = $codepage->convert($tmp) || warn "row: ",$row->{mfn},", $1$2 '$tmp' can't convert";
48                                 }
49                                 $display .= $prefix . $tmp;
50                                 $swish .= $tmp." ";
51 #print STDERR " == $tmp";
52                         }
53                         $prefix = "";
54                 # this might be our local scpeciality -- fields 10 and 11
55                 # (as opposed to 010 and 011) so they are strictly listed
56                 # here
57                 } elsif ($format =~ s/^(1[01])//) {
58                         my $tmp = isis_sf($row,$1,undef,$i);
59                         if ($tmp) {
60                                 if ($codepage) {
61                                         $tmp = $codepage->convert($tmp) || warn "row: ",$row->{mfn},", $1$2 '$tmp' can't convert";
62                                 }
63                                 $display .= $prefix . $tmp;
64                                 $swish .= $tmp." ";
65                         }
66                         $prefix = "";
67                 } elsif ($format =~ s/^mfn//i) {
68                         $display .= $prefix . $row->{mfn};
69                         $prefix = "";
70                 } elsif ($format =~ s/^([^\d]+)(\d{0,3})/$2/) {
71                         $prefix .= $1 if ($display);
72                 } elsif ($format =~ s/^([^\d]+\d{0,2})//) {
73                         $prefix .= $1 if ($display);
74                 } elsif ($format =~ s/^(\d{1,2})//) {
75                         $prefix .= $1 if ($display);
76                 } else {
77                         print STDERR "unparsed format: $format\n";
78                         $prefix .= $format;
79                         $format = "";
80                 }
81         }
82         # add suffix
83         $display .= $prefix if ($display);
84
85         return ($swish,$display);
86 }
87
88 #-------------------------------------------------------------
89
90 sub parse_excel_format {
91         my $format = shift;
92         my $row = shift;
93         my $i = shift;
94         my $codepage = shift;
95
96         my $out;
97         my $out_swish;
98
99         my $prefix = "";
100         if ($format =~ s/^([^A-Z\|]{1,3})//) {
101                 $prefix = $1;
102         }
103
104         my $display;
105         my $swish;
106
107         while ($format && length($format) > 0) {
108 #print STDERR "\n#### $format #";
109                 if ($format =~ s/^\|([A-Z]{1,2})\|//) {
110 #print STDERR "--$1-> $format -[",length($format),"] ";
111                         if ($row->{$1}) {
112                                 my $tmp = $row->{$1};
113                                 if ($codepage) {
114                                         $tmp = $codepage->convert($tmp) || warn "excel: $1 '$tmp' can't convert";
115                                 }
116                                 $display .= $prefix . $tmp;
117                                 $swish .= $tmp." ";
118 #print STDERR " == $tmp";
119                         }
120                         $prefix = "";
121                 } elsif ($format =~ s/^([^A-Z\|]+)(\|[A-Z]{1,2}\|)/$2/) {
122                         $prefix .= $1 if ($display);
123                 } else {
124                         print STDERR "unparsed format: $format\n";
125                         $prefix .= $format;
126                         $format = "";
127                 }
128 #print STDERR " display: $display swish: $swish [format: $format]";
129         }
130         # add suffix
131         $display .= $prefix if ($display);
132
133         return ($swish,$display);
134 }
135
136 1;