+ my @sorted_tags;
+ if ($cache->{tags_by_order}) {
+ @sorted_tags = @{$cache->{tags_by_order}};
+ } else {
+ @sorted_tags = sort by_order keys %{$config->{indexer}};
+ $cache->{tags_by_order} = \@sorted_tags;
+ }
+
+ # lookup key
+ my $lookup_key;
+
+ # cache for field in pages
+ delete $cache->{display_data};
+ delete $cache->{swish_data};
+ delete $cache->{swish_exact_data};
+ delete $cache->{index_data};
+ delete $cache->{index_delimiter};
+ my @page_fields; # names of fields
+
+
+ # subs used to produce output
+
+ sub get_field_name($$$) {
+ my ($config,$field,$field_usage) = @_;
+
+ # find field name (signular, plural)
+ my $field_name = "";
+ if ($config->{indexer}->{$field}->{name_singular} && $field_usage == 1) {
+ $field_name = $config->{indexer}->{$field}->{name_singular};
+ } elsif ($config->{indexer}->{$field}->{name_plural}) {
+ $field_name = $config->{indexer}->{$field}->{name_plural};
+ } elsif ($config->{indexer}->{$field}->{name}) {
+ $field_name = $config->{indexer}->{$field}->{name};
+ } else {
+ print STDERR "WARNING: field '$field' doesn't have 'name' attribute!";
+ }
+ if ($field_name) {
+ if (! $last_field_name) {
+ $last_field_name = x($field_name);
+ return $last_field_name;
+ } elsif ($field_name ne $last_field_name) {
+ $last_field_name = x($field_name);
+ return $last_field_name;
+ }
+ }
+ }
+
+
+ # init variables for different types
+ sub init_visible_type($) {
+ my $type = shift;
+
+ # swish, swish_exact, display, index, index_lookup
+ # swish and display defaults
+ my ($s,$se,$d,$i,$il) = (1,0,1,0,0);
+ if (lc($type) eq "display") {
+ $s = 0;
+ } elsif (lc($type) eq "swish") {
+ $d = 0;
+ } elsif (lc($type) eq "index") {
+ ($s,$se,$d,$i) = (0,1,0,1);
+ } elsif (lc($type) eq "swish_exact") {
+ ($s,$se,$d,$i) = (0,1,0,0);
+ } elsif (lc($type) =~ /^lookup/) {
+ ($s,$se,$d,$i,$il) = (0,1,0,0,1);
+ } elsif ($type) {
+ print STDERR "WARNING: unknown type: $type\n";
+ }
+ return ($s,$se,$d,$i,$il);
+ }
+
+
+ # convert
+ #
+ # <tag>
+ # <delimiter>, </delimiter>
+ # <value>200a</value>
+ # </tag>
+ #
+ # to
+ #
+ # <tag delimiter=", ">200a</tag>
+ #
+ # but without loosing spaces in delimiter (becasue
+ # new XML::Simple strips spaces in attribute values
+ # as defined in XML specification)
+ #
+ sub unroll_x($) {
+ my $x = shift;
+
+ if (defined $x->{value}) {
+ my ($v,$d) = ($x->{value}->{content}, $x->{delimiter}->{content});
+ delete $x->{value};
+ delete $x->{delimiter};
+ $x->{content} = $v;
+ $x->{delimiter} = $d;
+ }
+ return $x;
+ }
+
+ # begin real work: go field by field
+ foreach my $field (@sorted_tags) {