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

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

added stuff to strip new lines and escaped quotes from collection meta

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 20.3 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 } else {
156 $value = tidy_up_metadata($value);
157 }
158 &output_display($collwriter, $name, $lang, $value);
159 }
160 }
161 }
162 $collwriter->endTag('displayItemList');
163 }
164
165 # output building metadata to build config file
166 my $numdocs = $buildcfg->{'numdocs'};
167 $buildwriter->startTag('metadataList');
168 &output_metadata($buildwriter, 'numDocs', $numdocs);
169 &output_metadata($buildwriter, 'buildType', $buildtype);
170 $buildwriter->endTag('metadataList');
171
172
173 #indexes
174 my $indexmap = {};
175 my $firstindex = "";
176 my $first = 1;
177 if (defined $buildcfg->{'indexmap'}) {
178 my $indexmap_t = $buildcfg->{'indexmap'};
179 foreach my $i (@$indexmap_t) {
180 my ($k, $v) = $i =~ /^(.*)\-\>(.*)$/;
181 $indexmap->{$k} = $v;
182 if ($first) {
183 $firstindex = $v;
184 $first = 0;
185 }
186 }
187 } else {
188 print STDERR "indexmap not defined";
189 }
190 my $defaultindex;
191 if (defined $collectcfg->{'defaultindex'}) {
192 $defaultindex = $collectcfg->{'defaultindex'};
193 $defaultindex = $indexmap->{$defaultindex};
194 } else {
195 # use the first one
196 $defaultindex = $firstindex;
197 }
198
199 # format stuff
200 my $format = $collectcfg->{'format'};
201
202 #output the search stuff to coll cfg
203 $collwriter->startTag('search');
204 foreach my $i (keys %$indexmap) {
205 my $shortname = $indexmap->{$i};
206 $collwriter->startTag('index', 'name'=>$shortname);
207 #find the coll meta stuff
208 my $indexdisplay = ".$i";
209 foreach my $lang (keys %{$collectionmeta->{$indexdisplay}}) {
210 my $value = $collectionmeta->{$indexdisplay}->{$lang};
211 output_display($collwriter, 'name', $lang, $value);
212 }
213 $collwriter->endTag('index');
214
215 }
216
217 # add in the format stuff
218 if (defined $format->{'SearchVList'}) {
219
220 $collwriter->startTag('format');
221 write_format($collwriter, $format->{'SearchVList'}, "document");
222 $collwriter->endTag('format');
223 }
224
225 $collwriter->endTag('search');
226
227 $buildwriter->startTag('serviceRackList');
228
229 my @levels = ();
230 my $defaultlevel;
231
232 #do the retrieve service
233 # assume mgpp or mg
234 if ($buildtype eq 'mgpp') {
235 #for each level
236 if (defined $buildcfg->{'indexlevels'}) {
237 push @levels, @{$buildcfg->{'indexlevels'}};
238
239 if (defined $buildcfg->{'textlevel'}) {
240 $defaultlevel = $buildcfg->{'textlevel'};
241 } else {
242 $defaultlevel = $levels[0];
243 }
244 } else { #use levels from collect.cfg - must be an old collection
245 @levels = ('Document');
246 $defaultlevel = 'Document';
247 if (defined $collectcfg->{'levels'}) {
248 foreach my $l (@{$collectcfg->{'levels'}}) {
249 if ($l eq "Section") {
250 $defaultlevel = 'Section';
251 }
252 push @levels, $l;
253 }
254 }
255 }
256
257 $buildwriter->startTag('serviceRack', 'name'=>'GS2MGPPRetrieve');
258 $buildwriter->emptyTag('defaultLevel', 'name'=>$defaultlevel);
259
260
261 } else {
262 $buildwriter->startTag('serviceRack', 'name'=>'GS2MGRetrieve');
263 $buildwriter->emptyTag('defaultIndex', 'name'=>$defaultindex);
264
265 }
266 if (defined $indexstem) {
267 $buildwriter->emptyTag('indexStem', 'name'=>$indexstem);
268 }
269 # close off the Retrieve service
270 $buildwriter->endTag('serviceRack');
271
272 # add in the classifiers if needed
273
274 my $count = 1;
275 my $phind = 0;
276 my $started_classifiers = 0;
277 if (defined $collectcfg->{'classify'}) {
278 $collwriter->startTag('browse');
279 # add in default format if necessary
280 if (defined $format->{"VList"} || defined $format->{"HList"}) {
281 # global formats
282 $collwriter->startTag('format');
283 if (defined $format->{"VList"}) {
284 # VLIst applies to both classifier and doc nodes
285 write_format($collwriter, $format->{"VList"}, "document");
286 write_format($collwriter, $format->{"VList"}, "classifier");
287 }
288 if (defined $format->{"HList"}) {
289 # hlist is only for classifier nodes
290 write_format($collwriter, $format->{"HList"}, "horizontal");
291 }
292 $collwriter->endTag('format');
293 }
294 my $classifiers = $collectcfg->{'classify'};
295 foreach my $cl (@$classifiers) {
296 my $name = "CL$count";
297 $count++;
298 my ($classname) = @$cl[0];
299 if ($classname =~ /^phind$/i) {
300 $phind=1;
301 #should add it into coll config classifiers
302 next;
303 }
304
305 my $horizontalAtTop = &isHorizontalClassifier($database, $name);
306 if (not $started_classifiers) {
307 $buildwriter->startTag('serviceRack', 'name'=>'GS2Browse');
308 if (defined $indexstem) {
309 $buildwriter->emptyTag('indexStem', 'name'=>$indexstem);
310 }
311
312 $buildwriter->startTag('classifierList');
313 $started_classifiers = 1;
314 }
315 my $content = ''; #use buttonname first, then metadata
316 if ($classname eq "DateList") {
317 $content = "Date";
318 } else {
319 for (my $i=0; $i<scalar(@$cl); $i++) {
320 my $arg = @$cl[$i];
321 if ($arg eq "-buttonname"){
322 $content = @$cl[$i+1];
323 last;
324 } elsif ($arg eq "-metadata") {
325 $content = @$cl[$i+1];
326 }
327
328 }
329 }
330 if ($horizontalAtTop) {
331 $buildwriter->emptyTag('classifier', 'name'=>$name, 'content'=>$content, 'horizontalAtTop'=>'true');
332 } else {
333 $buildwriter->emptyTag('classifier', 'name'=>$name, 'content'=>$content);
334 }
335
336
337 $collwriter->startTag('classifier', 'name'=>$name);
338 my $vlist = $name."VList";
339 my $hlist = $name."HList";
340 my $dlist = "";
341 if ($classname eq "DateList") {
342 $dlist = "DateList";
343 }
344 # need to work out how to split into classifier and document
345 if (defined $format->{$vlist} || defined $format->{$hlist} || defined $format->{$dlist}) {
346 $collwriter->startTag('format');
347 if (defined $format->{$vlist}) {
348 write_format($collwriter, $format->{$vlist}, "document");
349 write_format($collwriter, $format->{$vlist}, "classifier");
350 }
351 if (defined $format->{$hlist}) {
352 write_format($collwriter, $format->{$hlist}, "horizontal");
353 }
354
355 if (defined $format->{$dlist}) {
356 write_format($collwriter, $format->{$dlist}, "document");
357 }
358 $collwriter->endTag('format');
359 }
360 $collwriter->endTag('classifier');
361 } #foreach classifier
362 if ($started_classifiers) {
363 # end the classifiers
364 $buildwriter->endTag('classifierList');
365 # close off the Browse service
366 $buildwriter->endTag('serviceRack');
367 }
368
369 $collwriter->endTag('browse');
370 }
371
372
373 # the phind classifier is a separate service
374 if ($phind) {
375 # if phind classifier
376 $buildwriter->emptyTag('serviceRack', 'name'=>'PhindPhraseBrowse');
377 }
378
379 # do the search service
380 if ($buildtype eq 'mgpp') {
381
382 $buildwriter->startTag('serviceRack', 'name'=>'GS2MGPPSearch');
383 $buildwriter->emptyTag('defaultLevel', 'name'=>$defaultlevel);
384 $buildwriter->startTag('levelList');
385 foreach my $level (@levels) {
386 $buildwriter->emptyTag('level', 'name'=>$level);
387 }
388 $buildwriter->endTag('levelList');
389
390 #fieldlist
391 my $fieldmap = {};
392 my $fieldlist = ();
393 if (defined $buildcfg->{'indexfields'}) {
394 push @$fieldlist, @{$buildcfg->{'indexfields'}};
395 if (defined $buildcfg->{'indexfieldmap'}) {
396 my $fieldmap_t = $buildcfg->{'indexfieldmap'};
397 foreach my $f (@$fieldmap_t) {
398 my ($k, $v) = $f =~ /^(.*)\-\>(.*)$/;
399 $fieldmap->{$k} = $v;
400 }
401 }
402 $buildwriter->startTag('fieldList');
403 foreach my $f (@$fieldlist) {
404 my $field = $fieldmap->{$f};
405 $buildwriter->emptyTag('field', 'shortname'=>$field, 'name'=>$f);
406 }
407 $buildwriter->endTag('fieldList');
408 } else {
409 print STDERR "indexfieldmap not defined";
410 }
411
412 # do the search types if there
413 if (defined $collectcfg->{'searchtype'}) {
414 $buildwriter->startTag('searchTypeList');
415 foreach my $st (@{$collectcfg->{'searchtype'}}) {
416 $buildwriter->emptyTag('searchType', 'name'=>$st);
417 }
418 $buildwriter->endTag('searchTypeList');
419 }
420 } elsif ($buildtype eq 'mg') {
421 $buildwriter->startTag('serviceRack', 'name'=>'GS2MGSearch');
422 }
423
424 if (defined $indexstem) {
425 $buildwriter->emptyTag('indexStem', 'name'=>$indexstem);
426 }
427
428 $buildwriter->emptyTag('defaultIndex', 'name'=>$defaultindex);
429 $buildwriter->startTag('indexList');
430 #for each index
431 foreach my $i (keys %$indexmap) {
432 my $index = $indexmap->{$i};
433 $buildwriter->emptyTag('index', 'name'=>$index);
434 }
435 $buildwriter->endTag('indexList');
436
437 $buildwriter->endTag('serviceRack');
438
439 $buildwriter->endTag('serviceRackList');
440 $buildwriter->endTag('buildConfig');
441
442 # we add in the default replace list just in case we have macros in the
443 # collection
444 $collwriter->emptyTag('replaceListRef', 'id'=>'gs2-standard');
445 $collwriter->endTag('collectionConfig');
446 $collwriter->end();
447 $buildwriter->end();
448 $buildoutput->close();
449 $colloutput->close();
450 &close_database($database);
451}
452
453
454sub output_metadata {
455 my ($writer, $metaname, $metavalue) = @_;
456 $writer->startTag('metadata', 'name'=>$metaname);
457 $writer->characters($metavalue);
458 $writer->endTag('metadata');
459}
460
461sub output_display {
462 my ($writer, $name, $lang, $value) = @_;
463 $lang = 'en' if $lang eq 'default';
464 if ($lang =~ /^\[/) {
465 ($lang) = $lang =~ /\[l=(.*)\]/;
466 }
467 $writer->startTag('displayItem', 'name'=>$name, 'lang'=>$lang);
468 $writer->characters($value);
469 $writer->endTag('displayItem');
470}
471sub format_icon_value {
472 my ($value) = @_;
473 if ($value =~ /^_/) {
474 my ($newvalue) = $value =~ /\/([^\/]*)$/;
475 if ($newvalue) {
476 return $newvalue;
477 }
478 }
479 return $value;
480}
481
482sub tidy_up_metadata {
483 my ($value) = @_;
484 # remove \n
485 $value =~ s/\\n//g;
486 # replace \' with '
487 $value =~ s/\\\'/\'/g;
488 # replace \" with "
489 $value =~ s/\\\"/\"/g;
490 return $value;
491}
492
493sub write_format {
494 my ($writer, $old_format, $node_type) = @_;
495 # replace \' with '
496 $old_format =~ s/\\\'/\'/g;
497 # replace \" with "
498 $old_format =~ s/\\\"/\"/g;
499 #convert [] to <gsf:...>
500 # assume no nesting {If} or {Or} for now
501 $old_format =~ s/\{If\}\{([^\}]*)\}/&format_if($1, $node_type)/eg;
502 $old_format =~ s/\{Or\}\{([^\}]*)\}/&format_or($1)/eg;
503 $old_format =~ s/\[Text\]/\<gsf:text\/\>/g;
504 $old_format =~ s/\[num\]/\<gsf:num\/\>/g;
505 $old_format =~ s/\[link\]/\<gsf:link type=\'$node_type\'\>/g;
506 $old_format =~ s/\[\/link\]/\<\/gsf:link\>/g;
507 $old_format =~ s/\[srclink\]/\<gsf:link type=\'source\'\>/g;
508 $old_format =~ s/\[\/srclink\]/\<\/gsf:link\>/g;
509 $old_format =~ s/\[icon\]/\<gsf:icon type=\'$node_type\'\/\>/g;
510 $old_format =~ s/\[srcicon\]/\<gsf:icon type=\'source\'\/\>/g;
511
512 # what to do with hightlight??
513 $old_format =~ s/\[\/?highlight\]//g;
514
515 #now do the rest of the [] which are assumed to be metadata
516 $old_format =~ s/\[([^\]]*)\]/&format_metadata($1)/eg;
517
518 # some html tidy
519 #turn <br> into <br />
520 $old_format =~ s/\<br\>/\<br \/\>/g;
521 #turn <p> into <p />
522 $old_format =~ s/\<p\>/\<p \/\>/g;
523
524 #put quotes around any atts
525 $old_format =~ s/=([a-z]+)([> ])/=\'$1\'$2/g;
526
527 if ($node_type eq "document") {
528 $writer->startTag('gsf:template', 'match'=>'documentNode');
529 $writer->charactersXML($old_format);
530 $writer->endTag('gsf:template');
531 } elsif ($node_type eq "classifier") {
532 $writer->startTag('gsf:template', 'match'=>'classifierNode');
533 $writer->charactersXML($old_format);
534 $writer->endTag('gsf:template');
535 } elsif ($node_type eq "horizontal") {
536 $writer->startTag('gsf:template', 'match'=>'classifierNode', 'mode'=>'horizontal');
537 $writer->charactersXML($old_format);
538 $writer->endTag('gsf:template');
539
540 }
541}
542
543sub format_metadata {
544 my ($metadata_string) = @_;
545
546 #print STDERR "original meta = $metadata_string\n";
547
548 # what shall we do with cgisafe??
549 my $cgisafe = $metadata_string =~ s/^cgisafe://;
550
551 my ($select) = $metadata_string =~ /^(parent|sibling)/;
552 $metadata_string =~ s/^(parent|sibling)//;
553 my ($scope, $delim);
554
555 if ($select) {
556 ($scope) = $metadata_string =~ /^\((Top|All)/;
557 $metadata_string =~ s/^\((Top|All)\)?//;
558 if ($scope) {
559 ($delim) = $metadata_string =~ /^\'([^\']*)\'\)/;
560 $metadata_string =~ s/^\'([^\']*)\'\)//;
561 }
562 }
563 $metadata_string =~ s/^://;
564 # remove ex.
565 $metadata_string =~ s/^ex\.//;
566
567 #print STDERR "select=$select, scope=$scope, delim=|$delim|, meta = $metadata_string\n";
568
569 my $new_format = "<gsf:metadata name='$metadata_string' ";
570 if (defined $select) {
571 if ($select eq "sibling") {
572 $new_format .= "multiple='true' ";
573 if (defined $delim) {
574 $new_format .= "separator='$delim' ";
575 }
576 } elsif ($select eq "parent"){
577 if (defined $scope) {
578 if ($scope eq "Top") {
579 $new_format .= "select='root' ";
580 } elsif ($scope eq "All") {
581 $new_format .= "select='ancestors' ";
582 if (defined $delim) {
583 $new_format .= "separator='$delim' ";
584 }
585 }
586 } else {
587 $new_format .= "select='parent' ";
588 }
589 }
590 }
591 $new_format .= "/>";
592 #print STDERR "$new_format\n";
593 return $new_format;
594
595}
596
597sub format_if {
598
599 my ($if_string, $node_type) = @_;
600 #print STDERR "if string = $if_string\n";
601
602 my @parts = split /,/, $if_string;
603 my $test = $parts[0];
604 my $true_option = $parts[1];
605 my $false_option;
606 if (scalar (@parts) == 3) {
607 $false_option = $parts[2];
608 }
609 $test =~ s/^\s*//;
610 $test =~ s/\s*$//;
611 my ($test_meta, $test_type, $test_value);
612 if ($test =~ /^(\[.+\])$/) {
613 $test_meta = $1;
614 $test_type = 'exists';
615 } else {
616 my ($lhs, $exp, $rhs) = $test =~ /^(.+)\s+(eq|ne|lt|gt|le|ge|sw|ew)\s+(.+)$/;
617 #print STDERR "lhs, exp, rhs = $lhs, $exp, $rhs\n";
618 if ($exp eq "eq") {
619 $test_type = "equals";
620 } elsif ($exp eq "sw") {
621 $test_type = "startsWith";
622 } elsif ($exp eq "ew") {
623 $test_type = "endsWith";
624 } elsif ($exp eq "ne") {
625 $test_type = "notEquals";
626 } elsif ($exp eq "lt") {
627 $test_type = "lessThan";
628 }elsif ($exp eq "gt") {
629 $test_type = "greaterThan";
630 }elsif ($exp eq "le") {
631 $test_type = "lessThanOrEquals";
632 }elsif ($exp eq "ge") {
633 $test_type = "greaterThanOrEquals";
634 }
635 if ($lhs =~ /^\[.+\]$/) {
636 $test_meta = $lhs;
637 $test_value = $rhs;
638 } else {
639 # assume rhs has meta
640 $test_meta = $rhs;
641 $test_value = $lhs;
642 }
643
644 #remove beginning and end quotes
645 $test_value =~ s/^[\'\"]//;
646 $test_value =~ s/[\'\"]$//;
647 }
648 my $test_atts = "test='$test_type' ";
649 if (defined $test_value) {
650 $test_atts .= "test-value='$test_value' ";
651 }
652 #print STDERR "test, true, false = $test, $true_option, $false_option\n";
653 my $new_format = "<gsf:switch>$test_meta";
654 $new_format .= "<gsf:when $test_atts>$true_option</gsf:when>";
655 if (defined $false_option) {
656 $new_format .="<gsf:otherwise>$false_option</gsf:otherwise>";
657 }
658 $new_format .= "</gsf:switch>";
659
660 #print STDERR "new format = $new_format\n";
661 return $new_format;
662}
663
664sub format_or {
665 my ($or_string) = @_;
666 my @meta_list = split (',', $or_string);
667 return "" unless scalar (@meta_list);
668 my $new_format = "<gsf:choose-metadata>";
669 foreach my $m (@meta_list) {
670 if ($m =~ /^\[(.*)\]$/) {
671 $new_format .= &format_metadata($1);
672 } else {
673 # a default value
674 $new_format .= "<gsf:default>$m</gsf:default>";
675 last;
676 }
677 }
678 $new_format .= "</gsf:choose-metadata>";
679 return $new_format;
680}
681
682sub open_database {
683 my ($db_file) = @_;
684
685 my $database = ();
686# tie (%$database, 'GDBM_File', $db_file, GDBM_READER, 0400) ||
687# die "Couldn't open database $db_file\n";
688
689 return $database;
690}
691
692sub close_database {
693 my ($database) = @_;
694 untie %$database;
695}
696sub isHorizontalClassifier {
697 my ($database, $name) = @_;
698
699 return 0; # can't get this to work for windows
700 my $record = $database->{$name};
701 my ($childtype) = $record =~ /<childtype>(\w*)/;
702 if ($childtype eq "HList") {
703 return 1;
704 }
705 return 0;
706}
707#$writer->startTag('');
708#$writer->endTag('');
709#$writer->characters();
710#$writer->emptyTag('');
711
7121;
Note: See TracBrowser for help on using the repository browser.