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

Last change on this file since 11274 was 11274, checked in by kjdon, 18 years ago

add in the gs2-standard replaceListRef to the collectionconfig just in case

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 20.0 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
440 # we add in the default replace list just in case we have macros in the
441 # collection
442 $collwriter->emptyTag('replaceListRef', 'id'=>'gs2-standard');
443 $collwriter->endTag('collectionConfig');
444 $collwriter->end();
445 $buildwriter->end();
446 $buildoutput->close();
447 $colloutput->close();
448 &close_database($database);
449}
450
451
452sub output_metadata {
453 my ($writer, $metaname, $metavalue) = @_;
454 $writer->startTag('metadata', 'name'=>$metaname);
455 $writer->characters($metavalue);
456 $writer->endTag('metadata');
457}
458
459sub output_display {
460 my ($writer, $name, $lang, $value) = @_;
461 $lang = 'en' if $lang eq 'default';
462 if ($lang =~ /^\[/) {
463 ($lang) = $lang =~ /\[l=(.*)\]/;
464 }
465 $writer->startTag('displayItem', 'name'=>$name, 'lang'=>$lang);
466 $writer->characters($value);
467 $writer->endTag('displayItem');
468}
469sub format_icon_value {
470 my ($value) = @_;
471 if ($value =~ /^_/) {
472 my ($newvalue) = $value =~ /\/([^\/]*)$/;
473 if ($newvalue) {
474 return $newvalue;
475 }
476 }
477 return $value;
478}
479
480sub write_format {
481 my ($writer, $old_format, $node_type) = @_;
482 # replace \' with '
483 $old_format =~ s/\\\'/\'/g;
484
485 #convert [] to <gsf:...>
486 # assume no nesting {If} or {Or} for now
487 $old_format =~ s/\{If\}\{([^\}]*)\}/&format_if($1, $node_type)/eg;
488 $old_format =~ s/\{Or\}\{([^\}]*)\}/&format_or($1)/eg;
489 $old_format =~ s/\[Text\]/\<gsf:text\/\>/g;
490 $old_format =~ s/\[num\]/\<gsf:num\/\>/g;
491 $old_format =~ s/\[link\]/\<gsf:link type=\'$node_type\'\>/g;
492 $old_format =~ s/\[\/link\]/\<\/gsf:link\>/g;
493 $old_format =~ s/\[srclink\]/\<gsf:link type=\'source\'\>/g;
494 $old_format =~ s/\[\/srclink\]/\<\/gsf:link\>/g;
495 $old_format =~ s/\[icon\]/\<gsf:icon type=\'$node_type\'\/\>/g;
496 $old_format =~ s/\[srcicon\]/\<gsf:icon type=\'source\'\/\>/g;
497
498 # what to do with hightlight??
499 $old_format =~ s/\[\/?highlight\]//g;
500
501 #now do the rest of the [] which are assumed to be metadata
502 $old_format =~ s/\[([^\]]*)\]/&format_metadata($1)/eg;
503
504 # some html tidy
505 #turn <br> into <br />
506 $old_format =~ s/\<br\>/\<br \/\>/g;
507 #turn <p> into <p />
508 $old_format =~ s/\<p\>/\<p \/\>/g;
509
510 #put quotes around any atts
511 $old_format =~ s/=([a-z]+)([> ])/=\'$1\'$2/g;
512
513 if ($node_type eq "document") {
514 $writer->startTag('gsf:template', 'match'=>'documentNode');
515 $writer->charactersXML($old_format);
516 $writer->endTag('gsf:template');
517 } elsif ($node_type eq "classifier") {
518 $writer->startTag('gsf:template', 'match'=>'classifierNode');
519 $writer->charactersXML($old_format);
520 $writer->endTag('gsf:template');
521 } elsif ($node_type eq "horizontal") {
522 $writer->startTag('gsf:template', 'match'=>'classifierNode', 'mode'=>'horizontal');
523 $writer->charactersXML($old_format);
524 $writer->endTag('gsf:template');
525
526 }
527}
528
529sub format_metadata {
530 my ($metadata_string) = @_;
531
532 #print STDERR "original meta = $metadata_string\n";
533
534 # what shall we do with cgisafe??
535 my $cgisafe = $metadata_string =~ s/^cgisafe://;
536
537 my ($select) = $metadata_string =~ /^(parent|sibling)/;
538 $metadata_string =~ s/^(parent|sibling)//;
539 my ($scope, $delim);
540
541 if ($select) {
542 ($scope) = $metadata_string =~ /^\((Top|All)/;
543 $metadata_string =~ s/^\((Top|All)\)?//;
544 if ($scope) {
545 ($delim) = $metadata_string =~ /^\'([^\']*)\'\)/;
546 $metadata_string =~ s/^\'([^\']*)\'\)//;
547 }
548 }
549 $metadata_string =~ s/^://;
550 # remove ex.
551 $metadata_string =~ s/^ex\.//;
552
553 #print STDERR "select=$select, scope=$scope, delim=|$delim|, meta = $metadata_string\n";
554
555 my $new_format = "<gsf:metadata name='$metadata_string' ";
556 if (defined $select) {
557 if ($select eq "sibling") {
558 $new_format .= "multiple='true' ";
559 if (defined $delim) {
560 $new_format .= "separator='$delim' ";
561 }
562 } elsif ($select eq "parent"){
563 if (defined $scope) {
564 if ($scope eq "Top") {
565 $new_format .= "select='root' ";
566 } elsif ($scope eq "All") {
567 $new_format .= "select='ancestors' ";
568 if (defined $delim) {
569 $new_format .= "separator='$delim' ";
570 }
571 }
572 } else {
573 $new_format .= "select='parent' ";
574 }
575 }
576 }
577 $new_format .= "/>";
578 #print STDERR "$new_format\n";
579 return $new_format;
580
581}
582
583sub format_if {
584
585 my ($if_string, $node_type) = @_;
586 #print STDERR "if string = $if_string\n";
587
588 my @parts = split /,/, $if_string;
589 my $test = $parts[0];
590 my $true_option = $parts[1];
591 my $false_option;
592 if (scalar (@parts) == 3) {
593 $false_option = $parts[2];
594 }
595 $test =~ s/^\s*//;
596 $test =~ s/\s*$//;
597 my ($test_meta, $test_type, $test_value);
598 if ($test =~ /^(\[.+\])$/) {
599 $test_meta = $1;
600 $test_type = 'exists';
601 } else {
602 my ($lhs, $exp, $rhs) = $test =~ /^(.+)\s+(eq|ne|lt|gt|le|ge|sw|ew)\s+(.+)$/;
603 #print STDERR "lhs, exp, rhs = $lhs, $exp, $rhs\n";
604 if ($exp eq "eq") {
605 $test_type = "equals";
606 } elsif ($exp eq "sw") {
607 $test_type = "startsWith";
608 } elsif ($exp eq "ew") {
609 $test_type = "endsWith";
610 } elsif ($exp eq "ne") {
611 $test_type = "notEquals";
612 } elsif ($exp eq "lt") {
613 $test_type = "lessThan";
614 }elsif ($exp eq "gt") {
615 $test_type = "greaterThan";
616 }elsif ($exp eq "le") {
617 $test_type = "lessThanOrEquals";
618 }elsif ($exp eq "ge") {
619 $test_type = "greaterThanOrEquals";
620 }
621 if ($lhs =~ /^\[.+\]$/) {
622 $test_meta = $lhs;
623 $test_value = $rhs;
624 } else {
625 # assume rhs has meta
626 $test_meta = $rhs;
627 $test_value = $lhs;
628 }
629
630 #remove beginning and end quotes
631 $test_value =~ s/^[\'\"]//;
632 $test_value =~ s/[\'\"]$//;
633 }
634 my $test_atts = "test='$test_type' ";
635 if (defined $test_value) {
636 $test_atts .= "test-value='$test_value' ";
637 }
638 #print STDERR "test, true, false = $test, $true_option, $false_option\n";
639 my $new_format = "<gsf:switch>$test_meta";
640 $new_format .= "<gsf:when $test_atts>$true_option</gsf:when>";
641 if (defined $false_option) {
642 $new_format .="<gsf:otherwise>$false_option</gsf:otherwise>";
643 }
644 $new_format .= "</gsf:switch>";
645
646 #print STDERR "new format = $new_format\n";
647 return $new_format;
648}
649
650sub format_or {
651 my ($or_string) = @_;
652 my @meta_list = split (',', $or_string);
653 return "" unless scalar (@meta_list);
654 my $new_format = "<gsf:choose-metadata>";
655 foreach my $m (@meta_list) {
656 if ($m =~ /^\[(.*)\]$/) {
657 $new_format .= &format_metadata($1);
658 } else {
659 # a default value
660 $new_format .= "<gsf:default>$m</gsf:default>";
661 last;
662 }
663 }
664 $new_format .= "</gsf:choose-metadata>";
665 return $new_format;
666}
667
668sub open_database {
669 my ($db_file) = @_;
670
671 my $database = ();
672# tie (%$database, 'GDBM_File', $db_file, GDBM_READER, 0400) ||
673# die "Couldn't open database $db_file\n";
674
675 return $database;
676}
677
678sub close_database {
679 my ($database) = @_;
680 untie %$database;
681}
682sub isHorizontalClassifier {
683 my ($database, $name) = @_;
684
685 return 0; # can't get this to work for windows
686 my $record = $database->{$name};
687 my ($childtype) = $record =~ /<childtype>(\w*)/;
688 if ($childtype eq "HList") {
689 return 1;
690 }
691 return 0;
692}
693#$writer->startTag('');
694#$writer->endTag('');
695#$writer->characters();
696#$writer->emptyTag('');
697
6981;
Note: See TracBrowser for help on using the repository browser.