/[webpac]/trunk2/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 /trunk2/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 81 by dpavlin, Tue Jul 8 22:13:56 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 169  sub data2xml { Line 175  sub data2xml {
175                          }                          }
176                  }                  }
177    
178                    # now try to parse variables from configuration file
179                    foreach my $x (@{$config->{indexer}->{$field}->{'config'}}) {
180    
181                            my $delimiter = x($x->{delimiter}) || ' ';
182                            my $val = $cfg->val($database, x($x->{content}));
183    
184                            my ($s,$d,$i) = (1,1,0);        # swish, display default
185                            $s = 0 if (lc($x->{type}) eq "display");
186                            $d = 0 if (lc($x->{type}) eq "swish");
187                            ($s,$d,$i) = (0,0,1) if (lc($x->{type}) eq "index");
188    
189                            if ($val) {
190                                    $display_data .= $delimiter.$val if ($d);
191                                    $swish_data .= $val if ($s);
192                                    $index->insert($field, $val, $path) if ($i);
193                            }
194    
195                    }
196    
197    
198                  if ($display_data) {                  if ($display_data) {
199    
# Line 206  sub data2xml { Line 231  sub data2xml {
231    
232          # dump formatted output in <html>          # dump formatted output in <html>
233          if ($html) {          if ($html) {
234                  $xml .= xmlify("html",$html);                  #$xml .= xmlify("html",$html);
235                    $xml .= "<html><![CDATA[ $html ]]></html>";
236          }          }
237                    
238          if ($xml) {          if ($xml) {
# Line 240  foreach my $database ($cfg->Sections) { Line 266  foreach my $database ($cfg->Sections) {
266    
267  print STDERR "reading ./import_xml/$type.xml\n";  print STDERR "reading ./import_xml/$type.xml\n";
268    
269          $config=XMLin("./import_xml/$type.xml", forcearray => [ $type2tag{$type} ], forcecontent => 1);          # extract just type basic
270            my $type_base = $type;
271            $type_base =~ s/_.+$//g;
272    
273            $config=XMLin("./import_xml/$type.xml", forcearray => [ $type2tag{$type_base}, 'config' ], forcecontent => 1);
274    
275          # output current progress indicator          # output current progress indicator
276          my $last_p = 0;          my $last_p = 0;
277          sub progress {          sub progress {
278                  #return if (! $opts{q});        # FIXME                  #return if (! $opts{q});        # FIXME
279                  my $current = shift;                  my $current = shift;
280                  my $total = shift;                  my $total = shift || 1;
281                  my $p = int($current * 100 / $total);                  my $p = int($current * 100 / $total);
282                  if ($p != $last_p) {                  if ($p != $last_p) {
283                          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 285  print STDERR "reading ./import_xml/$type
285                  }                  }
286          }          }
287    
288            my $fake_dir = 1;
289            sub fakeprogress {
290                    my $current = shift @_;
291    
292                    my @ind = ('-','\\','|','/','-','\\','|','/', '-');
293    
294                    $last_p += $fake_dir;
295                    $fake_dir = -$fake_dir if ($last_p > 1000 || $last_p < 0);
296                    if ($last_p % 10 == 0) {
297                            printf STDERR ("%5d / %5s [%-51s]\r",$current,"?"," " x ($last_p/20).$ind[($last_p/20) % $#ind]);
298                    }
299            }
300    
301          # now read database          # now read database
302  print STDERR "using: $type...\n";  print STDERR "using: $type...\n";
303    
304          if ($type eq "isis") {          if ($type_base eq "isis") {
305    
306                  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!";
307    
308                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);
# Line 278  print STDERR "using: $type...\n"; Line 322  print STDERR "using: $type...\n";
322    
323                                  my $swishpath = $path."#".int($row->{mfn});                                  my $swishpath = $path."#".int($row->{mfn});
324    
325                                  if (my $xml = data2xml($type,$row,$add_xml)) {                                  if (my $xml = data2xml($type_base,$row,$add_xml,$cfg,$database)) {
326                                          $xml = $cp2utf->convert($xml);                                          $xml = $cp2utf->convert($xml);
327                                          use bytes;      # as opposed to chars                                          use bytes;      # as opposed to chars
328                                          print "Path-Name: $swishpath\n";                                          print "Path-Name: $swishpath\n";
# Line 289  print STDERR "using: $type...\n"; Line 333  print STDERR "using: $type...\n";
333                  }                  }
334                  print STDERR "\n";                  print STDERR "\n";
335    
336          } elsif ($type eq "excel") {          } elsif ($type_base eq "excel") {
337                  use Spreadsheet::ParseExcel;                  use Spreadsheet::ParseExcel;
338                  use Spreadsheet::ParseExcel::Utility qw(int2col);                  use Spreadsheet::ParseExcel::Utility qw(int2col);
339                                    
# Line 297  print STDERR "using: $type...\n"; Line 341  print STDERR "using: $type...\n";
341                  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!";
342    
343                  my $sheet = x($config->{sheet}) || die "no sheet in $type.xml";                  my $sheet = x($config->{sheet}) || die "no sheet in $type.xml";
344                  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";
345    
346                  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'";
347    
# Line 314  print STDERR "using: $type...\n"; Line 358  print STDERR "using: $type...\n";
358                  defined ($oWorksheet) || die "can't find sheet '$sheet' in $excel_file";                  defined ($oWorksheet) || die "can't find sheet '$sheet' in $excel_file";
359                  my $end_row = x($config->{end_row}) || $oWorksheet->{MaxRow};                  my $end_row = x($config->{end_row}) || $oWorksheet->{MaxRow};
360    
361                  for(my $iR = $oWorksheet->{MinRow} ; defined $end_row && $iR <= $end_row ; $iR++) {                  for(my $iR = $start_row ; defined $end_row && $iR <= $end_row ; $iR++) {
362                          my $row;                          my $row;
363                          for(my $iC = $oWorksheet->{MinCol} ; defined $oWorksheet->{MaxCol} && $iC <= $oWorksheet->{MaxCol} ; $iC++) {                          for(my $iC = $oWorksheet->{MinCol} ; defined $oWorksheet->{MaxCol} && $iC <= $oWorksheet->{MaxCol} ; $iC++) {
364                                  my $cell = $oWorksheet->{Cells}[$iR][$iC];                                  my $cell = $oWorksheet->{Cells}[$iR][$iC];
# Line 335  print STDERR "using: $type...\n"; Line 379  print STDERR "using: $type...\n";
379    
380                          next if (! $row);                          next if (! $row);
381    
382                          if (my $xml = data2xml($type,$row,$add_xml)) {                          if (my $xml = data2xml($type_base,$row,$add_xml,$cfg,$database)) {
383                                    $xml = $cp2utf->convert($xml);
384                                    use bytes;      # as opposed to chars
385                                    print "Path-Name: $swishpath\n";
386                                    print "Content-Length: ".(length($xml)+1)."\n";
387                                    print "Document-Type: XML\n\n$xml\n";
388                            }
389                    }
390            } elsif ($type_base eq "marc") {
391    
392                    use MARC;
393                    
394                    $import2cp = Text::Iconv->new($config->{marc_codepage},$codepage);
395                    my $marc_file = $cfg -> val($database, 'marc_file') || die "$database doesn't have 'marc_file' defined!";
396    
397                    # optional argument is format
398                    my $format = x($config->{format}) || 'usmarc';
399    
400                    print STDERR "Reading MARC file '$marc_file'\n";
401    
402                    my $marc = new MARC;
403                    my $nr = $marc->openmarc({
404                                    file=>$marc_file, format=>$format
405                            }) || die "Can't open MARC file '$marc_file'";
406    
407                    my $i=0;        # record nr.
408    
409                    my $rec;
410    
411                    while ($marc->nextmarc(1)) {
412    
413                            # XXX
414                            fakeprogress($i++);
415    
416                            my $swishpath = $database."#".$i;
417    
418                            if (my $xml = data2xml($type_base,$marc,$add_xml,$cfg,$database)) {
419                                  $xml = $cp2utf->convert($xml);                                  $xml = $cp2utf->convert($xml);
420                                  use bytes;      # as opposed to chars                                  use bytes;      # as opposed to chars
421                                  print "Path-Name: $swishpath\n";                                  print "Path-Name: $swishpath\n";
# Line 343  print STDERR "using: $type...\n"; Line 423  print STDERR "using: $type...\n";
423                                  print "Document-Type: XML\n\n$xml\n";                                  print "Document-Type: XML\n\n$xml\n";
424                          }                          }
425                  }                  }
426            } elsif ($type_base eq "feed") {
427    
428                    $import2cp = Text::Iconv->new($config->{feed_codepage},$codepage);
429                    my $prog = x($config->{prog}) || die "$database doesn't have 'prog' defined!";
430    
431                    print STDERR "Reading feed from program '$prog'\n";
432    
433                    open(FEED,"feeds/$prog |") || die "can't start $prog: $!";
434    
435                    my $i=1;        # record nr.
436    
437                    my $data;
438                    my $line=1;
439    
440                    while (<FEED>) {
441                            chomp;
442    
443                            if (/^$/) {
444                                    my $swishpath = $database."#".$i++;
445    
446                                    if (my $xml = data2xml($type_base,$data,$add_xml,$cfg,$database)) {
447                                            $xml = $cp2utf->convert($xml);
448                                            use bytes;      # as opposed to chars
449                                            print "Path-Name: $swishpath\n";
450                                            print "Content-Length: ".(length($xml)+1)."\n";
451                                            print "Document-Type: XML\n\n$xml\n";
452                                    }
453                                    $line = 1;
454                                    $data = {};
455                                    next;
456                            }
457    
458                            $line = $1 if (s/^(\d+):\s*//);
459                            $data->{$line++} = $_;
460    
461                            fakeprogress($i);
462    
463                    }
464          }          }
465  }  }
466    
# Line 355  __END__ Line 473  __END__
473    
474  =head1 NAME  =head1 NAME
475    
476  isis2xml.pl - read isis file and dump XML  all2xml.pl - read various file formats and dump XML for SWISH-E
477    
478  =head1 DESCRIPTION  =head1 DESCRIPTION
479    
480  This command will read ISIS data file using OpenIsis perl module and  This command will read ISIS data file using OpenIsis perl module, MARC
481  create XML file for usage with I<SWISH-E>  records using MARC module and optionally Micro$oft Excel files to
482  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,
483  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
484  script is tailor-made for SWISH-E.  has something like that). Output of this script is tailor-made for SWISH-E.
485    
486    =head1 BUGS
487    
488    Documentation is really lacking. However, in true Open Source spirit, source
489    is best documentation. I even made considerable effort to comment parts
490    which are not intuitively clear, so...
491    
492  =head1 AUTHOR  =head1 AUTHOR
493    

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

  ViewVC Help
Powered by ViewVC 1.1.26