source: trunk/gsdl3/bin/script/convert_coll_from_gs2.pl@ 10782

Last change on this file since 10782 was 10782, checked in by kjdon, 19 years ago

added in some basic {If} handling. not sure whether it covers all possibilities, but its a start

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 19.8 KB
Line 
1#!/usr/bin/perl -w
2
3BEGIN {
4 die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
5 die "GSDL3HOME not set\n" unless defined $ENV{'GSDL3HOME'};
6 die "GSDL3SRCHOME not set\n" unless defined $ENV{'GSDL3SRCHOME'};
7 die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
8 unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
9 unshift (@INC, "$ENV{'GSDL3SRCHOME'}/lib/perl/cpan");
10}
11
12use colcfg;
13use util;
14use parsargv;
15use FileHandle;
16use XML::Writer;
17#can't get this to work on windows
18#use GDBM_File;
19
20use strict;
21
22&main();
23sub print_usage() {
24 print STDOUT "Usage: convert_coll_from_gs2.pl [options] coll-name\n";
25 print STDOUT "options:\n";
26
27 print STDOUT " -collectdir Directory where collection lives.\n";
28 print STDOUT " -verbosity Controls the amount of output.\n";
29 print STDOUT " -defaultlang The language that is considered the default (for display text etc). defaults to 'en'\n\n";
30}
31
32sub main {
33
34 my ($defaultlang, $verbosity, $collectdir);
35 # note that no defaults are passed for most options as they're set
36 # later (after we check the collect.cfg file)
37 if (!&parsargv::parse(\@ARGV,
38 'verbosity/\d+/', \$verbosity,
39 'collectdir/.*/', \$collectdir,
40 'defaultlang/.*/', \$defaultlang)) {
41 &print_usage();
42 die "\n";
43 }
44
45 # get and check the collection name
46 my ($collection) = @ARGV;
47 if (!defined($collection) || $collection eq "") {
48 die "No collection specified\n";
49 }
50 if ($collection eq "gs2model") {
51 die "You cant convert the model collection\n";
52 }
53
54 if (!defined $collectdir || $collectdir eq "") {
55 $collectdir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect");
56 }
57
58 if (!defined $defaultlang || $defaultlang eq "") {
59 $defaultlang = 'en';
60 }
61 # add on the coll name
62 $collectdir = &util::filename_cat ($collectdir, $collection);
63
64 my $collconfigfilename = &util::filename_cat ($collectdir, "etc", "collect.cfg");
65 print STDOUT "coll config=$collconfigfilename\n";
66 my $collectcfg;
67 if (-e $collconfigfilename) {
68 $collectcfg = &colcfg::read_collect_cfg ($collconfigfilename);
69
70 } else {
71 print STDERR "collect.cfg not found!!";
72 die "\n";
73 }
74
75
76 my $buildconfigfilename = &util::filename_cat ($collectdir, "index", "build.cfg");
77 my $buildcfg;
78 if (-e $buildconfigfilename) {
79 $buildcfg = &colcfg::read_build_cfg ($buildconfigfilename);
80
81 } else {
82 print STDERR "build.cfg not found!!";
83 die "\n";
84 }
85
86
87
88 my $colloutfile = &util::filename_cat ($collectdir, "etc", "collectionConfig.xml");
89 if (-e $colloutfile) {
90 print STDOUT "collectionConfig file already exists! overwriting it!\n";
91
92 }
93
94 my $buildoutfile = &util::filename_cat ($collectdir, "index", "buildConfig.xml");
95 if (-e $buildoutfile) {
96 print STDOUT "buildConfig file already exists! overwriting it!\n";
97
98 }
99
100# my $db_file = &util::filename_cat ($collectdir, "index", "text", "$collection.ldb");
101 my $database;
102# if (-e $db_file) {
103# $database = &open_database($db_file);
104# } else {
105# print STDERR "gdbm database file $db_file not found!!";
106# die "\n";
107# }
108
109 my $buildtype;
110 if (defined $buildcfg->{'buildtype'}) {
111 $buildtype = $buildcfg->{'buildtype'};
112 } else {
113 $buildtype = 'mg';
114 }
115
116 my $indexstem = undef;
117 if (defined $buildcfg->{'indexstem'}) {
118 $indexstem = $buildcfg->{'indexstem'};
119 }
120
121 my $buildoutput = new IO::File(">$buildoutfile");
122 my $buildwriter = new XML::Writer(OUTPUT => $buildoutput, NEWLINES => 1);
123
124 $buildwriter->startTag('buildConfig', 'xmlns:gsf'=>"http://www.greenstone.org/greenstone3/schema/ConfigFormat");
125
126 my $colloutput = new IO::File(">$colloutfile");
127 my $collwriter = new XML::Writer(OUTPUT => $colloutput, NEWLINES => 1);
128
129 $collwriter->startTag('collectionConfig', 'xmlns:gsf'=>"http://www.greenstone.org/greenstone3/schema/ConfigFormat", 'xmlns:xsl'=>'http://www.w3.org/1999/XSL/Transform');
130
131 #output the collection metadata to the collectionConfig file
132 $collwriter->startTag('metadataList');
133
134 my $creator = $collectcfg->{'creator'};
135 &output_metadata($collwriter, 'creator', $creator);
136 $collwriter->endTag('metadataList');
137
138 #output the display collectionmeta to collectionConfig.xml
139
140 my $collectionmeta = $collectcfg->{'collectionmeta'};
141 if (defined $collectionmeta) {
142 my %name_map = ('collectionname', 'name',
143 'collectionextra', 'description',
144 'iconcollection', 'icon',
145 'iconcollectionsmall', 'smallicon');
146
147 $collwriter->startTag('displayItemList');
148 foreach my $entry ( keys %$collectionmeta) {
149 if (defined $name_map{$entry}) {
150 my $name= $name_map{$entry};
151 foreach my $lang (keys %{$collectionmeta->{$entry}}) {
152 my $value = $collectionmeta->{$entry}->{$lang};
153 if ($entry =~ /^icon/) {
154 $value = format_icon_value($value);
155 }
156 &output_display($collwriter, $name, $lang, $value);
157 }
158 }
159 }
160 $collwriter->endTag('displayItemList');
161 }
162
163 # output building metadata to build config file
164 my $numdocs = $buildcfg->{'numdocs'};
165 $buildwriter->startTag('metadataList');
166 &output_metadata($buildwriter, 'numDocs', $numdocs);
167 &output_metadata($buildwriter, 'buildType', $buildtype);
168 $buildwriter->endTag('metadataList');
169
170
171 #indexes
172 my $indexmap = {};
173 my $firstindex = "";
174 my $first = 1;
175 if (defined $buildcfg->{'indexmap'}) {
176 my $indexmap_t = $buildcfg->{'indexmap'};
177 foreach my $i (@$indexmap_t) {
178 my ($k, $v) = $i =~ /^(.*)\-\>(.*)$/;
179 $indexmap->{$k} = $v;
180 if ($first) {
181 $firstindex = $v;
182 $first = 0;
183 }
184 }
185 } else {
186 print STDERR "indexmap not defined";
187 }
188 my $defaultindex;
189 if (defined $collectcfg->{'defaultindex'}) {
190 $defaultindex = $collectcfg->{'defaultindex'};
191 $defaultindex = $indexmap->{$defaultindex};
192 } else {
193 # use the first one
194 $defaultindex = $firstindex;
195 }
196
197 # format stuff
198 my $format = $collectcfg->{'format'};
199
200 #output the search stuff to coll cfg
201 $collwriter->startTag('search');
202 foreach my $i (keys %$indexmap) {
203 my $shortname = $indexmap->{$i};
204 $collwriter->startTag('index', 'name'=>$shortname);
205 #find the coll meta stuff
206 my $indexdisplay = ".$i";
207 foreach my $lang (keys %{$collectionmeta->{$indexdisplay}}) {
208 my $value = $collectionmeta->{$indexdisplay}->{$lang};
209 output_display($collwriter, 'name', $lang, $value);
210 }
211 $collwriter->endTag('index');
212
213 }
214
215 # add in the format stuff
216 if (defined $format->{'SearchVList'}) {
217
218 $collwriter->startTag('format');
219 write_format($collwriter, $format->{'SearchVList'}, "document");
220 $collwriter->endTag('format');
221 }
222
223 $collwriter->endTag('search');
224
225 $buildwriter->startTag('serviceRackList');
226
227 my @levels = ();
228 my $defaultlevel;
229
230 #do the retrieve service
231 # assume mgpp or mg
232 if ($buildtype eq 'mgpp') {
233 #for each level
234 if (defined $buildcfg->{'indexlevels'}) {
235 push @levels, @{$buildcfg->{'indexlevels'}};
236
237 if (defined $buildcfg->{'textlevel'}) {
238 $defaultlevel = $buildcfg->{'textlevel'};
239 } else {
240 $defaultlevel = $levels[0];
241 }
242 } else { #use levels from collect.cfg - must be an old collection
243 @levels = ('Document');
244 $defaultlevel = 'Document';
245 if (defined $collectcfg->{'levels'}) {
246 foreach my $l (@{$collectcfg->{'levels'}}) {
247 if ($l eq "Section") {
248 $defaultlevel = 'Section';
249 }
250 push @levels, $l;
251 }
252 }
253 }
254
255 $buildwriter->startTag('serviceRack', 'name'=>'GS2MGPPRetrieve');
256 $buildwriter->emptyTag('defaultLevel', 'name'=>$defaultlevel);
257
258
259 } else {
260 $buildwriter->startTag('serviceRack', 'name'=>'GS2MGRetrieve');
261 $buildwriter->emptyTag('defaultIndex', 'name'=>$defaultindex);
262
263 }
264 if (defined $indexstem) {
265 $buildwriter->emptyTag('indexStem', 'name'=>$indexstem);
266 }
267 # close off the Retrieve service
268 $buildwriter->endTag('serviceRack');
269
270 # add in the classifiers if needed
271
272 my $count = 1;
273 my $phind = 0;
274 my $started_classifiers = 0;
275 if (defined $collectcfg->{'classify'}) {
276 $collwriter->startTag('browse');
277 # add in default format if necessary
278 if (defined $format->{"VList"} || defined $format->{"HList"}) {
279 # global formats
280 $collwriter->startTag('format');
281 if (defined $format->{"VList"}) {
282 # VLIst applies to both classifier and doc nodes
283 write_format($collwriter, $format->{"VList"}, "document");
284 write_format($collwriter, $format->{"VList"}, "classifier");
285 }
286 if (defined $format->{"HList"}) {
287 # hlist is only for classifier nodes
288 write_format($collwriter, $format->{"HList"}, "horizontal");
289 }
290 $collwriter->endTag('format');
291 }
292 my $classifiers = $collectcfg->{'classify'};
293 foreach my $cl (@$classifiers) {
294 my $name = "CL$count";
295 $count++;
296 my ($classname) = @$cl[0];
297 if ($classname =~ /^phind$/i) {
298 $phind=1;
299 #should add it into coll config classifiers
300 next;
301 }
302
303 my $horizontalAtTop = &isHorizontalClassifier($database, $name);
304 if (not $started_classifiers) {
305 $buildwriter->startTag('serviceRack', 'name'=>'GS2Browse');
306 if (defined $indexstem) {
307 $buildwriter->emptyTag('indexStem', 'name'=>$indexstem);
308 }
309
310 $buildwriter->startTag('classifierList');
311 $started_classifiers = 1;
312 }
313 my $content = ''; #use buttonname first, then metadata
314 if ($classname eq "DateList") {
315 $content = "Date";
316 } else {
317 for (my $i=0; $i<scalar(@$cl); $i++) {
318 my $arg = @$cl[$i];
319 if ($arg eq "-buttonname"){
320 $content = @$cl[$i+1];
321 last;
322 } elsif ($arg eq "-metadata") {
323 $content = @$cl[$i+1];
324 }
325
326 }
327 }
328 if ($horizontalAtTop) {
329 $buildwriter->emptyTag('classifier', 'name'=>$name, 'content'=>$content, 'horizontalAtTop'=>'true');
330 } else {
331 $buildwriter->emptyTag('classifier', 'name'=>$name, 'content'=>$content);
332 }
333
334
335 $collwriter->startTag('classifier', 'name'=>$name);
336 my $vlist = $name."VList";
337 my $hlist = $name."HList";
338 my $dlist = "";
339 if ($classname eq "DateList") {
340 $dlist = "DateList";
341 }
342 # need to work out how to split into classifier and document
343 if (defined $format->{$vlist} || defined $format->{$hlist} || defined $format->{$dlist}) {
344 $collwriter->startTag('format');
345 if (defined $format->{$vlist}) {
346 write_format($collwriter, $format->{$vlist}, "document");
347 write_format($collwriter, $format->{$vlist}, "classifier");
348 }
349 if (defined $format->{$hlist}) {
350 write_format($collwriter, $format->{$hlist}, "horizontal");
351 }
352
353 if (defined $format->{$dlist}) {
354 write_format($collwriter, $format->{$dlist}, "document");
355 }
356 $collwriter->endTag('format');
357 }
358 $collwriter->endTag('classifier');
359 } #foreach classifier
360 if ($started_classifiers) {
361 # end the classifiers
362 $buildwriter->endTag('classifierList');
363 # close off the Browse service
364 $buildwriter->endTag('serviceRack');
365 }
366
367 $collwriter->endTag('browse');
368 }
369
370
371 # the phind classifier is a separate service
372 if ($phind) {
373 # if phind classifier
374 $buildwriter->emptyTag('serviceRack', 'name'=>'PhindPhraseBrowse');
375 }
376
377 # do the search service
378 if ($buildtype eq 'mgpp') {
379
380 $buildwriter->startTag('serviceRack', 'name'=>'GS2MGPPSearch');
381 $buildwriter->emptyTag('defaultLevel', 'name'=>$defaultlevel);
382 $buildwriter->startTag('levelList');
383 foreach my $level (@levels) {
384 $buildwriter->emptyTag('level', 'name'=>$level);
385 }
386 $buildwriter->endTag('levelList');
387
388 #fieldlist
389 my $fieldmap = {};
390 my $fieldlist = ();
391 if (defined $buildcfg->{'indexfields'}) {
392 push @$fieldlist, @{$buildcfg->{'indexfields'}};
393 if (defined $buildcfg->{'indexfieldmap'}) {
394 my $fieldmap_t = $buildcfg->{'indexfieldmap'};
395 foreach my $f (@$fieldmap_t) {
396 my ($k, $v) = $f =~ /^(.*)\-\>(.*)$/;
397 $fieldmap->{$k} = $v;
398 }
399 }
400 $buildwriter->startTag('fieldList');
401 foreach my $f (@$fieldlist) {
402 my $field = $fieldmap->{$f};
403 $buildwriter->emptyTag('field', 'shortname'=>$field, 'name'=>$f);
404 }
405 $buildwriter->endTag('fieldList');
406 } else {
407 print STDERR "indexfieldmap not defined";
408 }
409
410 # do the search types if there
411 if (defined $collectcfg->{'searchtype'}) {
412 $buildwriter->startTag('searchTypeList');
413 foreach my $st (@{$collectcfg->{'searchtype'}}) {
414 $buildwriter->emptyTag('searchType', 'name'=>$st);
415 }
416 $buildwriter->endTag('searchTypeList');
417 }
418 } elsif ($buildtype eq 'mg') {
419 $buildwriter->startTag('serviceRack', 'name'=>'GS2MGSearch');
420 }
421
422 if (defined $indexstem) {
423 $buildwriter->emptyTag('indexStem', 'name'=>$indexstem);
424 }
425
426 $buildwriter->emptyTag('defaultIndex', 'name'=>$defaultindex);
427 $buildwriter->startTag('indexList');
428 #for each index
429 foreach my $i (keys %$indexmap) {
430 my $index = $indexmap->{$i};
431 $buildwriter->emptyTag('index', 'name'=>$index);
432 }
433 $buildwriter->endTag('indexList');
434
435 $buildwriter->endTag('serviceRack');
436
437 $buildwriter->endTag('serviceRackList');
438 $buildwriter->endTag('buildConfig');
439 $collwriter->endTag('collectionConfig');
440 $collwriter->end();
441 $buildwriter->end();
442 $buildoutput->close();
443 $colloutput->close();
444 &close_database($database);
445}
446
447
448sub output_metadata {
449 my ($writer, $metaname, $metavalue) = @_;
450 $writer->startTag('metadata', 'name'=>$metaname);
451 $writer->characters($metavalue);
452 $writer->endTag('metadata');
453}
454
455sub output_display {
456 my ($writer, $name, $lang, $value) = @_;
457 $lang = 'en' if $lang eq 'default';
458 if ($lang =~ /^\[/) {
459 ($lang) = $lang =~ /\[l=(.*)\]/;
460 }
461 $writer->startTag('displayItem', 'name'=>$name, 'lang'=>$lang);
462 $writer->characters($value);
463 $writer->endTag('displayItem');
464}
465sub format_icon_value {
466 my ($value) = @_;
467 if ($value =~ /^_/) {
468 my ($newvalue) = $value =~ /\/([^\/]*)$/;
469 if ($newvalue) {
470 return $newvalue;
471 }
472 }
473 return $value;
474}
475
476sub write_format {
477 my ($writer, $old_format, $node_type) = @_;
478 # replace \' with '
479 $old_format =~ s/\\\'/\'/g;
480
481 #convert [] to <gsf:...>
482 # assume no nesting {If} or {Or} for now
483 $old_format =~ s/\{If\}\{([^\}]*)\}/&format_if($1, $node_type)/eg;
484 $old_format =~ s/\{Or\}\{([^\}]*)\}/&format_or($1)/eg;
485 $old_format =~ s/\[Text\]/\<gsf:text\/\>/g;
486 $old_format =~ s/\[num\]/\<gsf:num\/\>/g;
487 $old_format =~ s/\[link\]/\<gsf:link type=\'$node_type\'\>/g;
488 $old_format =~ s/\[\/link\]/\<\/gsf:link\>/g;
489 $old_format =~ s/\[srclink\]/\<gsf:link type=\'source\'\>/g;
490 $old_format =~ s/\[\/srclink\]/\<\/gsf:link\>/g;
491 $old_format =~ s/\[icon\]/\<gsf:icon type=\'$node_type\'\/\>/g;
492 $old_format =~ s/\[srcicon\]/\<gsf:icon type=\'source\'\/\>/g;
493
494 # what to do with hightlight??
495 $old_format =~ s/\[\/?highlight\]//g;
496
497 #now do the rest of the [] which are assumed to be metadata
498 $old_format =~ s/\[([^\]]*)\]/&format_metadata($1)/eg;
499
500 # some html tidy
501 #turn <br> into <br />
502 $old_format =~ s/\<br\>/\<br \/\>/g;
503 #turn <p> into <p />
504 $old_format =~ s/\<p\>/\<p \/\>/g;
505
506 #put quotes around any atts
507 $old_format =~ s/=([a-z]+)([> ])/=\'$1\'$2/g;
508
509 if ($node_type eq "document") {
510 $writer->startTag('gsf:template', 'match'=>'documentNode');
511 $writer->charactersXML($old_format);
512 $writer->endTag('gsf:template');
513 } elsif ($node_type eq "classifier") {
514 $writer->startTag('gsf:template', 'match'=>'classifierNode');
515 $writer->charactersXML($old_format);
516 $writer->endTag('gsf:template');
517 } elsif ($node_type eq "horizontal") {
518 $writer->startTag('gsf:template', 'match'=>'classifierNode', 'mode'=>'horizontal');
519 $writer->charactersXML($old_format);
520 $writer->endTag('gsf:template');
521
522 }
523}
524
525sub format_metadata {
526 my ($metadata_string) = @_;
527
528 #print STDERR "original meta = $metadata_string\n";
529
530 # what shall we do with cgisafe??
531 my $cgisafe = $metadata_string =~ s/^cgisafe://;
532
533 my ($select) = $metadata_string =~ /^(parent|sibling)/;
534 $metadata_string =~ s/^(parent|sibling)//;
535 my ($scope, $delim);
536
537 if ($select) {
538 ($scope) = $metadata_string =~ /^\((Top|All)/;
539 $metadata_string =~ s/^\((Top|All)\)?//;
540 if ($scope) {
541 ($delim) = $metadata_string =~ /^\'([^\']*)\'\)/;
542 $metadata_string =~ s/^\'([^\']*)\'\)//;
543 }
544 }
545 $metadata_string =~ s/^://;
546 # remove ex.
547 $metadata_string =~ s/^ex\.//;
548
549 #print STDERR "select=$select, scope=$scope, delim=|$delim|, meta = $metadata_string\n";
550
551 my $new_format = "<gsf:metadata name='$metadata_string' ";
552 if (defined $select) {
553 if ($select eq "sibling") {
554 $new_format .= "multiple='true' ";
555 if (defined $delim) {
556 $new_format .= "separator='$delim' ";
557 }
558 } elsif ($select eq "parent"){
559 if (defined $scope) {
560 if ($scope eq "Top") {
561 $new_format .= "select='root' ";
562 } elsif ($scope eq "All") {
563 $new_format .= "select='ancestors' ";
564 if (defined $delim) {
565 $new_format .= "separator='$delim' ";
566 }
567 }
568 } else {
569 $new_format .= "select='parent' ";
570 }
571 }
572 }
573 $new_format .= "/>";
574 #print STDERR "$new_format\n";
575 return $new_format;
576
577}
578
579sub format_if {
580
581 my ($if_string, $node_type) = @_;
582 #print STDERR "if string = $if_string\n";
583
584 my @parts = split /,/, $if_string;
585 my $test = $parts[0];
586 my $true_option = $parts[1];
587 my $false_option;
588 if (scalar (@parts) == 3) {
589 $false_option = $parts[2];
590 }
591 $test =~ s/^\s*//;
592 $test =~ s/\s*$//;
593 my ($test_meta, $test_type, $test_value);
594 if ($test =~ /^(\[.+\])$/) {
595 $test_meta = $1;
596 $test_type = 'exists';
597 } else {
598 my ($lhs, $exp, $rhs) = $test =~ /^(.+)\s+(eq|ne|lt|gt|le|ge|sw|ew)\s+(.+)$/;
599 #print STDERR "lhs, exp, rhs = $lhs, $exp, $rhs\n";
600 if ($exp eq "eq") {
601 $test_type = "equals";
602 } elsif ($exp eq "sw") {
603 $test_type = "startsWith";
604 } elsif ($exp eq "ew") {
605 $test_type = "endsWith";
606 } elsif ($exp eq "ne") {
607 $test_type = "notEquals";
608 } elsif ($exp eq "lt") {
609 $test_type = "lessThan";
610 }elsif ($exp eq "gt") {
611 $test_type = "greaterThan";
612 }elsif ($exp eq "le") {
613 $test_type = "lessThanOrEquals";
614 }elsif ($exp eq "ge") {
615 $test_type = "greaterThanOrEquals";
616 }
617 if ($lhs =~ /^\[.+\]$/) {
618 $test_meta = $lhs;
619 $test_value = $rhs;
620 } else {
621 # assume rhs has meta
622 $test_meta = $rhs;
623 $test_value = $lhs;
624 }
625
626 #remove beginning and end quotes
627 $test_value =~ s/^[\'\"]//;
628 $test_value =~ s/[\'\"]$//;
629 }
630 my $test_atts = "test='$test_type' ";
631 if (defined $test_value) {
632 $test_atts .= "test-value='$test_value' ";
633 }
634 #print STDERR "test, true, false = $test, $true_option, $false_option\n";
635 my $new_format = "<gsf:switch>$test_meta";
636 $new_format .= "<gsf:when $test_atts>$true_option</gsf:when>";
637 if (defined $false_option) {
638 $new_format .="<gsf:otherwise>$false_option</gsf:otherwise>";
639 }
640 $new_format .= "</gsf:switch>";
641
642 #print STDERR "new format = $new_format\n";
643 return $new_format;
644}
645
646sub format_or {
647 my ($or_string) = @_;
648 my @meta_list = split (',', $or_string);
649 return "" unless scalar (@meta_list);
650 my $new_format = "<gsf:choose-metadata>";
651 foreach my $m (@meta_list) {
652 if ($m =~ /^\[(.*)\]$/) {
653 $new_format .= &format_metadata($1);
654 } else {
655 # a default value
656 $new_format .= "<gsf:default>$m</gsf:default>";
657 last;
658 }
659 }
660 $new_format .= "</gsf:choose-metadata>";
661 return $new_format;
662}
663
664sub open_database {
665 my ($db_file) = @_;
666
667 my $database = ();
668# tie (%$database, 'GDBM_File', $db_file, GDBM_READER, 0400) ||
669# die "Couldn't open database $db_file\n";
670
671 return $database;
672}
673
674sub close_database {
675 my ($database) = @_;
676 untie %$database;
677}
678sub isHorizontalClassifier {
679 my ($database, $name) = @_;
680
681 return 0; # can't get this to work for windows
682 my $record = $database->{$name};
683 my ($childtype) = $record =~ /<childtype>(\w*)/;
684 if ($childtype eq "HList") {
685 return 1;
686 }
687 return 0;
688}
689#$writer->startTag('');
690#$writer->endTag('');
691#$writer->characters();
692#$writer->emptyTag('');
693
6941;
Note: See TracBrowser for help on using the repository browser.