/[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 62 by dpavlin, Fri Jul 4 20:11:48 2003 UTC revision 163 by dpavlin, Thu Nov 20 21:23:40 2003 UTC
# Line 58  my %type2tag = ( Line 58  my %type2tag = (
58          'isis' => 'isis',          'isis' => 'isis',
59          'excel' => 'column',          'excel' => 'column',
60          'marc' => 'marc',          'marc' => 'marc',
61            'feed' => 'feed'
62  );  );
63    
64  sub data2xml {  sub data2xml {
# Line 81  sub data2xml { Line 82  sub data2xml {
82    
83          # sort subrouting using order="" attribute          # sort subrouting using order="" attribute
84          sub by_order {          sub by_order {
85                  return 0 if (! $config->{indexer}->{$a}->{order});                  my $va = $config->{indexer}->{$a}->{order} ||
86                  return 0 if (! $config->{indexer}->{$b}->{order});                          $config->{indexer}->{$a};
87                    my $vb = $config->{indexer}->{$b}->{order} ||
88                            $config->{indexer}->{$b};
89    
90                  return $config->{indexer}->{$a}->{order} <=>                  return $va <=> $vb;
                         $config->{indexer}->{$b}->{order} ;  
91          }          }
92    
93          foreach my $field (sort by_order keys %{$config->{indexer}}) {          foreach my $field (sort by_order keys %{$config->{indexer}}) {
94    
95                  $field=x($field);                  $field=x($field);
   
96                  $field_usage{$field}++;                  $field_usage{$field}++;
97    
98                  my $swish_data = "";                  my $swish_data = "";
99                    my $swish_exact_data = "";
100                  my $display_data = "";                  my $display_data = "";
101                  my $line_delimiter;                  my $line_delimiter;
102    
# Line 108  sub data2xml { Line 110  sub data2xml {
110    
111                          my $repeat_off = 0;             # repeatable offset                          my $repeat_off = 0;             # repeatable offset
112    
113                          my ($s,$d,$i) = (1,1,0);        # swish, display default                          my ($s,$se,$d,$i) = (1,0,1,0);  # swish, display default
114                          $s = 0 if (lc($x->{type}) eq "display");                          $s = 0 if (lc($x->{type}) eq "display");
115                          $d = 0 if (lc($x->{type}) eq "swish");                          $d = 0 if (lc($x->{type}) eq "swish");
116                            $se = 1 if (lc($x->{type}) eq "swish_exact");
117                          ($s,$d,$i) = (0,0,1) if (lc($x->{type}) eq "index");                          ($s,$d,$i) = (0,0,1) if (lc($x->{type}) eq "index");
118    
119                          # what will separate last line from this one?                          # what will separate last line from this one?
# Line 123  sub data2xml { Line 126  sub data2xml {
126                          # init vars so that we go into while...                          # init vars so that we go into while...
127                          ($swish,$display) = (1,1);                          ($swish,$display) = (1,1);
128    
129                          if ($swish || $display) {                          # placeholder for all repeatable entries for index
130                            my @index_data;
131                            my $index_filter;
132    
133                            sub mkformat {
134                                    my $x = shift || die "mkformat needs tag reference";
135                                    my $data = shift || return;
136                                    my $format_name = x($x->{format_name}) || return $data;
137                                    my $fmt = x($config->{format}->{$format_name}->{content}) || die "<format name=\"$format_name\"> is not defined!";
138                                    my $format_delimiter = x($x->{format_delimiter});
139                                    my @data;
140                                    if ($format_delimiter) {
141                                            @data = split(/$format_delimiter/,$data);
142                                    } else {
143                                            push @data,$data;
144                                    }
145    
146                                    if ($fmt) {
147                                            my $nr = scalar $fmt =~ s/%s/%s/g;
148                                            if (($#data+1) == $nr) {
149                                                    return sprintf($fmt,@data);
150                                            } else {
151                                                    print STDERR "mkformat: [$data] can't be split on [$format_delimiter] to $nr fields!\n";
152                                                    return $data;
153                                            }
154                                    } else {
155                                            print STDERR "usage of link '$format_name' without defined format (<link> tag)\n";
156                                    }
157                            }
158    
159                            # while because of repeatable fields
160                            while ($swish || $display) {
161                                  ($swish,$display) = parse_format($type, $format,$row,$repeat_off++,$import2cp);                                  ($swish,$display) = parse_format($type, $format,$row,$repeat_off++,$import2cp);
162                                    if ($repeat_off > 1000) {
163                                            print STDERR "loop (more than 1000 repeatable fields) deteced in $row, $format\n";
164                                            last;
165                                    }
166                                    
167                                  # filter="name" ; filter this field through                                  # filter="name" ; filter this field through
168                                  # filter/[name].pm                                  # filter/[name].pm
169                                  my $filter = $x->{filter};                                  my $filter = $x->{filter};
# Line 132  sub data2xml { Line 171  sub data2xml {
171                                          require "filter/".$filter.".pm";                                          require "filter/".$filter.".pm";
172                                  }                                  }
173                                  # type="swish" ; field for swish                                  # type="swish" ; field for swish
174                                  if ($s && $swish) {                                  if ($swish) {
175                                          if ($filter) {                                          if ($filter && ($s || $se)) {
176                                                  no strict 'refs';                                                  no strict 'refs';
177                                                  $swish_data .= join(" ",&$filter($swish));                                                  my $tmp = join(" ",&$filter($swish)) if ($s || $se);
178                                                    $swish_data .= $tmp if ($s);
179                                                    $swish_exact_data .= $tmp if ($se);
180    
181                                          } else {                                          } else {
182                                                  $swish_data .= $swish;                                                  $swish_data .= $swish if ($s);
183                                                    $swish_exact_data .= $swish if ($se);
184                                          }                                          }
185                                  }                                  }
186    
# Line 149  sub data2xml { Line 192  sub data2xml {
192                                          }                                          }
193                                          if ($filter) {                                          if ($filter) {
194                                                  no strict 'refs';                                                  no strict 'refs';
195                                                  $display_data .= join($delimiter,&$filter($display));                                                  if ($display_data) {
196                                                            $display_data .= $delimiter.join($delimiter,mkformat($x,&$filter($display)));
197                                                    } else {
198                                                            $display_data = join($delimiter,mkformat($x,&$filter($display)));
199                                                    }
200                                          } else {                                          } else {
201                                                  if ($display_data) {                                                  if ($display_data) {
202                                                          $display_data .= $delimiter.$display;                                                          $display_data .= $delimiter.mkformat($x,$display);
203                                                  } else {                                                  } else {
204                                                          $display_data .= $display;                                                          $display_data = mkformat($x,$display);
205                                                  }                                                  }
206                                          }                                          }
207                                  }                                  }
208                                                                                                    
209                                  # type="index" ; insert into index                                  # type="index" ; insert into index
210                                  if ($i && $display) {                                  if ($i && $display) {
211                                          my $index_data = $display;                                          push @index_data, $display;
212                                          if ($filter) {                                          $index_filter = $filter if ($filter);
213                                                  no strict 'refs';                                  }
214                                                  foreach my $d (&$filter($index_data)) {                          }
215                                                          $index->insert($field, $d, $path);  
216                                                  }                          # fill data in index
217                                          } else {                          if (@index_data) {
218                                                  $index->insert($field, $index_data, $path);                                  if ($index_filter) {
219                                            no strict 'refs';
220                                            foreach my $d (@index_data) {
221                                                    $index->insert($field, &$index_filter($d), $path);
222                                            }
223                                    } else {
224                                            foreach my $d (@index_data) {
225                                                    $index->insert($field, $d, $path);
226                                          }                                          }
227                                  }                                  }
228                          }                          }
# Line 183  sub data2xml { Line 237  sub data2xml {
237                          my ($s,$d,$i) = (1,1,0);        # swish, display default                          my ($s,$d,$i) = (1,1,0);        # swish, display default
238                          $s = 0 if (lc($x->{type}) eq "display");                          $s = 0 if (lc($x->{type}) eq "display");
239                          $d = 0 if (lc($x->{type}) eq "swish");                          $d = 0 if (lc($x->{type}) eq "swish");
240                            # no support for swish exact in config.
241                            # IMHO, it's useless
242                          ($s,$d,$i) = (0,0,1) if (lc($x->{type}) eq "index");                          ($s,$d,$i) = (0,0,1) if (lc($x->{type}) eq "index");
243    
244                          if ($val) {                          if ($val) {
# Line 225  sub data2xml { Line 281  sub data2xml {
281                          $xml .= xmlify($field."_swish", unac_string($codepage,$swish_data));                          $xml .= xmlify($field."_swish", unac_string($codepage,$swish_data));
282                  }                  }
283    
284                    if ($swish_exact_data) {
285                            $swish_exact_data =~ s/ +/ /g;
286                            $swish_exact_data =~ s/ +$//g;
287    
288                            # add delimiters before and after word.
289                            # That is required to produce exact match
290                            $xml .= xmlify($field."_swish_exact", unac_string($codepage,'xxbxx '.$swish_exact_data.' xxexx'));
291                    }
292    
293    
294          }          }
295    
296          # dump formatted output in <html>          # dump formatted output in <html>
297          if ($html) {          if ($html) {
298                  $xml .= xmlify("html",$html);                  #$xml .= xmlify("html",$html);
299                    $xml .= "<html><![CDATA[ $html ]]></html>";
300          }          }
301                    
302          if ($xml) {          if ($xml) {
# Line 257  $index = new index_DBI( Line 323  $index = new index_DBI(
323                  $cfg_global->val('global', 'dbi_passwd') || '',                  $cfg_global->val('global', 'dbi_passwd') || '',
324          );          );
325    
326    my $show_progress = $cfg_global->val('global', 'show_progress');
327    
328  foreach my $database ($cfg->Sections) {  foreach my $database ($cfg->Sections) {
329    
330          my $type = lc($cfg -> val($database, 'type')) || die "$database doesn't have 'type' defined";          my $type = lc($cfg -> val($database, 'type')) || die "$database doesn't have 'type' defined";
# Line 268  print STDERR "reading ./import_xml/$type Line 336  print STDERR "reading ./import_xml/$type
336          my $type_base = $type;          my $type_base = $type;
337          $type_base =~ s/_.+$//g;          $type_base =~ s/_.+$//g;
338    
339          $config=XMLin("./import_xml/$type.xml", forcearray => [ $type2tag{$type_base}, 'config' ], forcecontent => 1);          $config=XMLin("./import_xml/$type.xml", forcearray => [ $type2tag{$type_base}, 'config', 'format' ], forcecontent => 1);
340    
341          # output current progress indicator          # output current progress indicator
342          my $last_p = 0;          my $last_p = 0;
343          sub progress {          sub progress {
344                  #return if (! $opts{q});        # FIXME                  return if (! $show_progress);
345                  my $current = shift;                  my $current = shift;
346                  my $total = shift || 1;                  my $total = shift || 1;
347                  my $p = int($current * 100 / $total);                  my $p = int($current * 100 / $total);
# Line 283  print STDERR "reading ./import_xml/$type Line 351  print STDERR "reading ./import_xml/$type
351                  }                  }
352          }          }
353    
354            my $fake_dir = 1;
355            sub fakeprogress {
356                    return if (! $show_progress);
357                    my $current = shift @_;
358    
359                    my @ind = ('-','\\','|','/','-','\\','|','/', '-');
360    
361                    $last_p += $fake_dir;
362                    $fake_dir = -$fake_dir if ($last_p > 1000 || $last_p < 0);
363                    if ($last_p % 10 == 0) {
364                            printf STDERR ("%5d / %5s [%-51s]\r",$current,"?"," " x ($last_p/20).$ind[($last_p/20) % $#ind]);
365                    }
366            }
367    
368          # now read database          # now read database
369  print STDERR "using: $type...\n";  print STDERR "using: $type...\n";
370    
# Line 293  print STDERR "using: $type...\n"; Line 375  print STDERR "using: $type...\n";
375                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);
376                  my $db = OpenIsis::open( $isis_db );                  my $db = OpenIsis::open( $isis_db );
377    
378                    # check if .txt database for OpenIsis is zero length,
379                    # if so, erase it and re-open database
380                    sub check_txt_db {
381                            my $isis_db = shift || die "need isis database name";
382                            my $reopen = 0;
383    
384                            if (-e $isis_db.".TXT") {
385                                    print STDERR "WARNING: removing $isis_db.TXT OpenIsis database...\n";
386                                    unlink $isis_db.".TXT" || warn "FATAL: unlink error on '$isis_db.TXT': $!";
387                                    $reopen++;
388                            }
389                            if (-e $isis_db.".PTR") {
390                                    print STDERR "WARNING: removing $isis_db.PTR OpenIsis database...\n";
391                                    unlink $isis_db.".PTR" || warn "FATAL: unlink error on '$isis_db.PTR': $!";
392                                    $reopen++;
393                            }
394                            return OpenIsis::open( $isis_db ) if ($reopen);
395                    }
396    
397                    # EOF error
398                    if ($db == -1) {
399                            $db = check_txt_db($isis_db);
400                            if ($db == -1) {
401                                    print STDERR "FATAL: OpenIsis can't open zero size file $isis_db\n";
402                                    next;
403                            }
404                    }
405    
406                    # OpenIsis::ERR_BADF
407                    if ($db == -4) {
408                            print STDERR "FATAL: OpenIsis can't find file $isis_db\n";
409                            next;
410                    # OpenIsis::ERR_IO
411                    } elsif ($db == -5) {
412                            print STDERR "FATAL: OpenIsis can't access file $isis_db\n";
413                            next;
414                    } elsif ($db < 0) {
415                            print STDERR "FATAL: OpenIsis unknown error $db with file $isis_db\n";
416                            next;
417                    }
418    
419                  my $max_rowid = OpenIsis::maxRowid( $db );                  my $max_rowid = OpenIsis::maxRowid( $db );
420    
421                    # if 0 records, try to rease isis .txt database
422                    if ($max_rowid == 0) {
423                            # force removal of database
424                            $db = check_txt_db($isis_db);
425                            $max_rowid = OpenIsis::maxRowid( $db );
426                    }
427    
428                  print STDERR "Reading database: $isis_db [$max_rowid rows]\n";                  print STDERR "Reading database: $isis_db [$max_rowid rows]\n";
429    
430                  my $path = $database;                  my $path = $database;
# Line 316  print STDERR "using: $type...\n"; Line 446  print STDERR "using: $type...\n";
446                                  }                                  }
447                          }                          }
448                  }                  }
449                    # for this to work with current version of OpenIsis (0.9.0)
450                    # you might need my patch from
451                    # http://www.rot13.org/~dpavlin/projects/openisis-0.9.0-perl_close.diff
452                    OpenIsis::close($db);
453                  print STDERR "\n";                  print STDERR "\n";
454    
455          } elsif ($type_base eq "excel") {          } elsif ($type_base eq "excel") {
# Line 373  print STDERR "using: $type...\n"; Line 507  print STDERR "using: $type...\n";
507                          }                          }
508                  }                  }
509          } elsif ($type_base eq "marc") {          } elsif ($type_base eq "marc") {
510          ## XXX  
511                  use MARC;                  use MARC;
512                                    
513                  $import2cp = Text::Iconv->new($config->{marc_codepage},$codepage);                  $import2cp = Text::Iconv->new($config->{marc_codepage},$codepage);
# Line 382  print STDERR "using: $type...\n"; Line 516  print STDERR "using: $type...\n";
516                  # optional argument is format                  # optional argument is format
517                  my $format = x($config->{format}) || 'usmarc';                  my $format = x($config->{format}) || 'usmarc';
518    
                 my %id_stored;  # to aviod duplicates  
   
519                  print STDERR "Reading MARC file '$marc_file'\n";                  print STDERR "Reading MARC file '$marc_file'\n";
520    
521                  my $marc = new MARC;                  my $marc = new MARC;
# Line 392  print STDERR "using: $type...\n"; Line 524  print STDERR "using: $type...\n";
524                          }) || die "Can't open MARC file '$marc_file'";                          }) || die "Can't open MARC file '$marc_file'";
525    
526                  my $i=0;        # record nr.                  my $i=0;        # record nr.
                 my $inc=1;  
                 my $max_i=1000;  
527    
528                  my $rec;                  my $rec;
529    
530                  while ($marc->nextmarc(1)) {                  while ($marc->nextmarc(1)) {
531    
532                          # XXX                          # XXX
533                          progress($i, $max_i);                          fakeprogress($i++);
                         $i += $inc;  
                         $inc = -$inc if ($i > $max_i || $i < 0);  
534    
535                          my $swishpath = $database."#".$i;                          my $swishpath = $database."#".$i;
536    
# Line 414  print STDERR "using: $type...\n"; Line 542  print STDERR "using: $type...\n";
542                                  print "Document-Type: XML\n\n$xml\n";                                  print "Document-Type: XML\n\n$xml\n";
543                          }                          }
544                  }                  }
545            } elsif ($type_base eq "feed") {
546    
547                    $import2cp = Text::Iconv->new($config->{feed_codepage},$codepage);
548                    my $prog = x($config->{prog}) || die "$database doesn't have 'prog' defined!";
549    
550                    print STDERR "Reading feed from program '$prog'\n";
551    
552                    open(FEED,"feeds/$prog |") || die "can't start $prog: $!";
553    
554                    my $i=1;        # record nr.
555    
556                    my $data;
557                    my $line=1;
558    
559                    while (<FEED>) {
560                            chomp;
561    
562                            if (/^$/) {
563                                    my $swishpath = $database."#".$i++;
564    
565                                    if (my $xml = data2xml($type_base,$data,$add_xml,$cfg,$database)) {
566                                            $xml = $cp2utf->convert($xml);
567                                            use bytes;      # as opposed to chars
568                                            print "Path-Name: $swishpath\n";
569                                            print "Content-Length: ".(length($xml)+1)."\n";
570                                            print "Document-Type: XML\n\n$xml\n";
571                                    }
572                                    $line = 1;
573                                    $data = {};
574                                    next;
575                            }
576    
577                            $line = $1 if (s/^(\d+):\s*//);
578                            $data->{$line++} = $_;
579    
580                            fakeprogress($i);
581    
582                    }
583          }          }
584  }  }
585    
# Line 426  __END__ Line 592  __END__
592    
593  =head1 NAME  =head1 NAME
594    
595  isis2xml.pl - read isis file and dump XML  all2xml.pl - read various file formats and dump XML for SWISH-E
596    
597  =head1 DESCRIPTION  =head1 DESCRIPTION
598    
599  This command will read ISIS data file using OpenIsis perl module and  This command will read ISIS data file using OpenIsis perl module, MARC
600  create XML file for usage with I<SWISH-E>  records using MARC module and optionally Micro$oft Excel files to
601  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,
602  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
603  script is tailor-made for SWISH-E.  has something like that). Output of this script is tailor-made for SWISH-E.
604    
605    =head1 BUGS
606    
607    Documentation is really lacking. However, in true Open Source spirit, source
608    is best documentation. I even made considerable effort to comment parts
609    which are not intuitively clear, so...
610    
611  =head1 AUTHOR  =head1 AUTHOR
612    

Legend:
Removed from v.62  
changed lines
  Added in v.163

  ViewVC Help
Powered by ViewVC 1.1.26