/[webpac]/trunk/all2xml.pl
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/all2xml.pl

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

revision 54 by dpavlin, Mon Jun 23 20:20:32 2003 UTC revision 90 by dpavlin, Sun Jul 13 13:22:50 2003 UTC
# Line 18  die "FATAL: can't find configuration fil Line 18  die "FATAL: can't find configuration fil
18    
19  my $config;  my $config;
20    
21  use index_DBI;  # there is no other, right now ;-)  #use index_DBI;         # default DBI module for index
22    use index_DBI_cache;    # faster DBI module using memory cache
23  my $index;  my $index;
24    
25  my %opts;  my %opts;
# Line 33  getopts('d:m:qs', \%opts); Line 34  getopts('d:m:qs', \%opts);
34    
35  my $path;       # this is name of database  my $path;       # this is name of database
36    
37  Text::Iconv->raise_error(1);     # Conversion errors raise exceptions  Text::Iconv->raise_error(0);     # Conversion errors don't raise exceptions
38    
39  # this is encoding of all files on disk, including import_xml/*.xml file and  # this is encoding of all files on disk, including import_xml/*.xml file and
40  # filter/*.pm files! It will be used to store strings in perl internally!  # filter/*.pm files! It will be used to store strings in perl internally!
# Line 55  my $cp2utf = Text::Iconv->new($codepage, Line 56  my $cp2utf = Text::Iconv->new($codepage,
56  # format in XML file  # format in XML file
57  my %type2tag = (  my %type2tag = (
58          'isis' => 'isis',          'isis' => 'isis',
59          'excel' => 'column'          'excel' => 'column',
60            'marc' => 'marc',
61            'feed' => 'feed'
62  );  );
63    
64  sub data2xml {  sub data2xml {
# Line 65  sub data2xml { Line 68  sub data2xml {
68          my $type = shift @_;          my $type = shift @_;
69          my $row = shift @_;          my $row = shift @_;
70          my $add_xml = shift @_;          my $add_xml = shift @_;
71            # needed to read values from configuration file
72            my $cfg = shift @_;
73            my $database = shift @_;
74    
75          my $xml;          my $xml;
76    
# Line 118  sub data2xml { Line 124  sub data2xml {
124                          # init vars so that we go into while...                          # init vars so that we go into while...
125                          ($swish,$display) = (1,1);                          ($swish,$display) = (1,1);
126    
127                          if ($swish || $display) {                          # while because of repeatable fields
128                            while ($swish || $display) {
129                                  ($swish,$display) = parse_format($type, $format,$row,$repeat_off++,$import2cp);                                  ($swish,$display) = parse_format($type, $format,$row,$repeat_off++,$import2cp);
130                                    if ($repeat_off > 1000) {
131                                            print STDERR "loop (more than 1000 repeatable fields) deteced in $row, $format\n";
132                                            last;
133                                    }
134                                    
135                                  # filter="name" ; filter this field through                                  # filter="name" ; filter this field through
136                                  # filter/[name].pm                                  # filter/[name].pm
137                                  my $filter = $x->{filter};                                  my $filter = $x->{filter};
# Line 169  sub data2xml { Line 181  sub data2xml {
181                          }                          }
182                  }                  }
183    
184                    # now try to parse variables from configuration file
185                    foreach my $x (@{$config->{indexer}->{$field}->{'config'}}) {
186    
187                            my $delimiter = x($x->{delimiter}) || ' ';
188                            my $val = $cfg->val($database, x($x->{content}));
189    
190                            my ($s,$d,$i) = (1,1,0);        # swish, display default
191                            $s = 0 if (lc($x->{type}) eq "display");
192                            $d = 0 if (lc($x->{type}) eq "swish");
193                            ($s,$d,$i) = (0,0,1) if (lc($x->{type}) eq "index");
194    
195                            if ($val) {
196                                    $display_data .= $delimiter.$val if ($d);
197                                    $swish_data .= $val if ($s);
198                                    $index->insert($field, $val, $path) if ($i);
199                            }
200    
201                    }
202    
203    
204                  if ($display_data) {                  if ($display_data) {
205    
# Line 206  sub data2xml { Line 237  sub data2xml {
237    
238          # dump formatted output in <html>          # dump formatted output in <html>
239          if ($html) {          if ($html) {
240                  $xml .= xmlify("html",$html);                  #$xml .= xmlify("html",$html);
241                    $xml .= "<html><![CDATA[ $html ]]></html>";
242          }          }
243                    
244          if ($xml) {          if ($xml) {
# Line 240  foreach my $database ($cfg->Sections) { Line 272  foreach my $database ($cfg->Sections) {
272    
273  print STDERR "reading ./import_xml/$type.xml\n";  print STDERR "reading ./import_xml/$type.xml\n";
274    
275          $config=XMLin("./import_xml/$type.xml", forcearray => [ $type2tag{$type} ], forcecontent => 1);          # extract just type basic
276            my $type_base = $type;
277            $type_base =~ s/_.+$//g;
278    
279            $config=XMLin("./import_xml/$type.xml", forcearray => [ $type2tag{$type_base}, 'config' ], forcecontent => 1);
280    
281          # output current progress indicator          # output current progress indicator
282          my $last_p = 0;          my $last_p = 0;
283          sub progress {          sub progress {
284                  #return if (! $opts{q});        # FIXME                  #return if (! $opts{q});        # FIXME
285                  my $current = shift;                  my $current = shift;
286                  my $total = shift;                  my $total = shift || 1;
287                  my $p = int($current * 100 / $total);                  my $p = int($current * 100 / $total);
288                  if ($p != $last_p) {                  if ($p != $last_p) {
289                          printf STDERR ("%5d / %5d [%-51s] %-2d %% \r",$current,$total,"=" x ($p/2).">", $p );                          printf STDERR ("%5d / %5d [%-51s] %-2d %% \r",$current,$total,"=" x ($p/2).">", $p );
# Line 255  print STDERR "reading ./import_xml/$type Line 291  print STDERR "reading ./import_xml/$type
291                  }                  }
292          }          }
293    
294            my $fake_dir = 1;
295            sub fakeprogress {
296                    my $current = shift @_;
297    
298                    my @ind = ('-','\\','|','/','-','\\','|','/', '-');
299    
300                    $last_p += $fake_dir;
301                    $fake_dir = -$fake_dir if ($last_p > 1000 || $last_p < 0);
302                    if ($last_p % 10 == 0) {
303                            printf STDERR ("%5d / %5s [%-51s]\r",$current,"?"," " x ($last_p/20).$ind[($last_p/20) % $#ind]);
304                    }
305            }
306    
307          # now read database          # now read database
308  print STDERR "using: $type...\n";  print STDERR "using: $type...\n";
309    
310          if ($type eq "isis") {          if ($type_base eq "isis") {
311    
312                  my $isis_db = $cfg -> val($database, 'isis_db') || die "$database doesn't have 'isis_db' defined!";                  my $isis_db = $cfg -> val($database, 'isis_db') || die "$database doesn't have 'isis_db' defined!";
313    
314                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);
# Line 278  print STDERR "using: $type...\n"; Line 328  print STDERR "using: $type...\n";
328    
329                                  my $swishpath = $path."#".int($row->{mfn});                                  my $swishpath = $path."#".int($row->{mfn});
330    
331                                  if (my $xml = data2xml($type,$row,$add_xml)) {                                  if (my $xml = data2xml($type_base,$row,$add_xml,$cfg,$database)) {
332                                          $xml = $cp2utf->convert($xml);                                          $xml = $cp2utf->convert($xml);
333                                          use bytes;      # as opposed to chars                                          use bytes;      # as opposed to chars
334                                          print "Path-Name: $swishpath\n";                                          print "Path-Name: $swishpath\n";
# Line 289  print STDERR "using: $type...\n"; Line 339  print STDERR "using: $type...\n";
339                  }                  }
340                  print STDERR "\n";                  print STDERR "\n";
341    
342          } elsif ($type eq "excel") {          } elsif ($type_base eq "excel") {
343                  use Spreadsheet::ParseExcel;                  use Spreadsheet::ParseExcel;
344                  use Spreadsheet::ParseExcel::Utility qw(int2col);                  use Spreadsheet::ParseExcel::Utility qw(int2col);
345                                    
# Line 297  print STDERR "using: $type...\n"; Line 347  print STDERR "using: $type...\n";
347                  my $excel_file = $cfg -> val($database, 'excel_file') || die "$database doesn't have 'excel_file' defined!";                  my $excel_file = $cfg -> val($database, 'excel_file') || die "$database doesn't have 'excel_file' defined!";
348    
349                  my $sheet = x($config->{sheet}) || die "no sheet in $type.xml";                  my $sheet = x($config->{sheet}) || die "no sheet in $type.xml";
350                  my $start_row = x($config->{start_row}) || die "no start_row in $type.xml";                  my $start_row = x($config->{start_row}) - 1 || die "no start_row in $type.xml";
351    
352                  my $oBook = Spreadsheet::ParseExcel::Workbook->Parse($excel_file) || die "can't open Excel file '$excel_file'";                  my $oBook = Spreadsheet::ParseExcel::Workbook->Parse($excel_file) || die "can't open Excel file '$excel_file'";
353    
# Line 314  print STDERR "using: $type...\n"; Line 364  print STDERR "using: $type...\n";
364                  defined ($oWorksheet) || die "can't find sheet '$sheet' in $excel_file";                  defined ($oWorksheet) || die "can't find sheet '$sheet' in $excel_file";
365                  my $end_row = x($config->{end_row}) || $oWorksheet->{MaxRow};                  my $end_row = x($config->{end_row}) || $oWorksheet->{MaxRow};
366    
367                  for(my $iR = $oWorksheet->{MinRow} ; defined $end_row && $iR <= $end_row ; $iR++) {                  for(my $iR = $start_row ; defined $end_row && $iR <= $end_row ; $iR++) {
368                          my $row;                          my $row;
369                          for(my $iC = $oWorksheet->{MinCol} ; defined $oWorksheet->{MaxCol} && $iC <= $oWorksheet->{MaxCol} ; $iC++) {                          for(my $iC = $oWorksheet->{MinCol} ; defined $oWorksheet->{MaxCol} && $iC <= $oWorksheet->{MaxCol} ; $iC++) {
370                                  my $cell = $oWorksheet->{Cells}[$iR][$iC];                                  my $cell = $oWorksheet->{Cells}[$iR][$iC];
# Line 335  print STDERR "using: $type...\n"; Line 385  print STDERR "using: $type...\n";
385    
386                          next if (! $row);                          next if (! $row);
387    
388                          if (my $xml = data2xml($type,$row,$add_xml)) {                          if (my $xml = data2xml($type_base,$row,$add_xml,$cfg,$database)) {
389                                  $xml = $cp2utf->convert($xml);                                  $xml = $cp2utf->convert($xml);
390                                  use bytes;      # as opposed to chars                                  use bytes;      # as opposed to chars
391                                  print "Path-Name: $swishpath\n";                                  print "Path-Name: $swishpath\n";
# Line 343  print STDERR "using: $type...\n"; Line 393  print STDERR "using: $type...\n";
393                                  print "Document-Type: XML\n\n$xml\n";                                  print "Document-Type: XML\n\n$xml\n";
394                          }                          }
395                  }                  }
396            } elsif ($type_base eq "marc") {
397    
398                    use MARC;
399                    
400                    $import2cp = Text::Iconv->new($config->{marc_codepage},$codepage);
401                    my $marc_file = $cfg -> val($database, 'marc_file') || die "$database doesn't have 'marc_file' defined!";
402    
403                    # optional argument is format
404                    my $format = x($config->{format}) || 'usmarc';
405    
406                    print STDERR "Reading MARC file '$marc_file'\n";
407    
408                    my $marc = new MARC;
409                    my $nr = $marc->openmarc({
410                                    file=>$marc_file, format=>$format
411                            }) || die "Can't open MARC file '$marc_file'";
412    
413                    my $i=0;        # record nr.
414    
415                    my $rec;
416    
417                    while ($marc->nextmarc(1)) {
418    
419                            # XXX
420                            fakeprogress($i++);
421    
422                            my $swishpath = $database."#".$i;
423    
424                            if (my $xml = data2xml($type_base,$marc,$add_xml,$cfg,$database)) {
425                                    $xml = $cp2utf->convert($xml);
426                                    use bytes;      # as opposed to chars
427                                    print "Path-Name: $swishpath\n";
428                                    print "Content-Length: ".(length($xml)+1)."\n";
429                                    print "Document-Type: XML\n\n$xml\n";
430                            }
431                    }
432            } elsif ($type_base eq "feed") {
433    
434                    $import2cp = Text::Iconv->new($config->{feed_codepage},$codepage);
435                    my $prog = x($config->{prog}) || die "$database doesn't have 'prog' defined!";
436    
437                    print STDERR "Reading feed from program '$prog'\n";
438    
439                    open(FEED,"feeds/$prog |") || die "can't start $prog: $!";
440    
441                    my $i=1;        # record nr.
442    
443                    my $data;
444                    my $line=1;
445    
446                    while (<FEED>) {
447                            chomp;
448    
449                            if (/^$/) {
450                                    my $swishpath = $database."#".$i++;
451    
452                                    if (my $xml = data2xml($type_base,$data,$add_xml,$cfg,$database)) {
453                                            $xml = $cp2utf->convert($xml);
454                                            use bytes;      # as opposed to chars
455                                            print "Path-Name: $swishpath\n";
456                                            print "Content-Length: ".(length($xml)+1)."\n";
457                                            print "Document-Type: XML\n\n$xml\n";
458                                    }
459                                    $line = 1;
460                                    $data = {};
461                                    next;
462                            }
463    
464                            $line = $1 if (s/^(\d+):\s*//);
465                            $data->{$line++} = $_;
466    
467                            fakeprogress($i);
468    
469                    }
470          }          }
471  }  }
472    
# Line 355  __END__ Line 479  __END__
479    
480  =head1 NAME  =head1 NAME
481    
482  isis2xml.pl - read isis file and dump XML  all2xml.pl - read various file formats and dump XML for SWISH-E
483    
484  =head1 DESCRIPTION  =head1 DESCRIPTION
485    
486  This command will read ISIS data file using OpenIsis perl module and  This command will read ISIS data file using OpenIsis perl module, MARC
487  create XML file for usage with I<SWISH-E>  records using MARC module and optionally Micro$oft Excel files to
488  indexer. Dispite it's name, this script B<isn't general xml generator>  create one XML file for usage with I<SWISH-E> indexer. Dispite it's name,
489  from isis files (isis allready has something like that). Output of this  this script B<isn't general xml generator> from isis files (isis allready
490  script is tailor-made for SWISH-E.  has something like that). Output of this script is tailor-made for SWISH-E.
491    
492    =head1 BUGS
493    
494    Documentation is really lacking. However, in true Open Source spirit, source
495    is best documentation. I even made considerable effort to comment parts
496    which are not intuitively clear, so...
497    
498  =head1 AUTHOR  =head1 AUTHOR
499    

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

  ViewVC Help
Powered by ViewVC 1.1.26