Changeset 6942
- Timestamp:
- 2004-03-05T16:24:30+13:00 (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gsdl/perllib/classify/List.pm
r6761 r6942 25 25 26 26 # simple list classifier plugin 27 # options are: 28 # metadata=Metaname -- (optional) all documents with Metaname metadata 29 # will be included in list. if not included all documents 30 # will be included in list. 31 # sort=Meta -- (optional) sort documents in list alphabetically by 32 # Meta. by default it will sort by Metaname, if neither 33 # are set documents will be in build (random) order. 34 # Meta may be Filename to sort by original filename or 35 # nosort to force not to sort 36 # buttonname=Title -- (optional) the title field for this classification. 37 # if not included title field will be Metaname. 38 # if metadata is also not included title will be 'List' 39 40 # 12/05/02 Added usage datastructure - John Thompson 27 # to see the options, run "perl -S classinfo.pl List" 41 28 42 29 use BasClas; … … 53 40 'desc' => "{List.metadata}", 54 41 'type' => "metadata", 55 'reqd' => " yes" },42 'reqd' => "no" }, 56 43 { 'name' => "buttonname", 57 44 'desc' => "{List.buttonname}", … … 71 58 'args' => $arguments }; 72 59 73 # sub print_usage {74 # print STDERR "75 # usage: classify List [options]76 # options:77 78 # -metadata X Metadata field used for classification,79 # list will be sorted by this element.80 81 # -buttonname X (optional) Title field for this classification.82 # if not included title field will be Metaname.83 84 # -sort X (optional) Sort documents in list by this metadata field.85 # By default it will sort by Metaname, or (if this is not86 # set) in build (random) order.87 # ";88 # }89 60 90 61 sub new { … … 96 67 push( @{$option_list}, $options ); 97 68 98 my ($meta name, $title, $sortname, $list);69 my ($metadata, $title, $sortname, $list); 99 70 100 71 if (!parsargv::parse(\@_, 101 q^metadata/.*/^, \$meta name,72 q^metadata/.*/^, \$metadata, 102 73 q^buttonname/.*/^, \$title, 103 74 q^sort/.*/^, \$sortname, … … 108 79 die "\n"; 109 80 } 81 my @meta_list; 82 my $meta1; 83 84 if ($metadata) { 85 @meta_list = split(/,/, $metadata); 86 $meta1 = $meta_list[0]; 87 } else { 88 $metadata = undef; 89 $meta1=undef; 90 @meta_list = undef; 91 } 110 92 111 93 if (!$title) { 112 if ( $metaname) {113 $title = $meta name;94 if (defined ($meta1)) { 95 $title = $meta1; 114 96 } else { 115 97 $title = 'List'; … … 117 99 } 118 100 101 # sortname is handled a bit differently - kjdon 102 # undef means to sort, but use the metadata value from -metadata 103 # because there is no one metadata value to get for sorting when 104 # we have a list of possible metadata 105 # to get no sorting, set sortname = 'nosort' 119 106 if (!$sortname) { 120 if ($metaname) { 121 $sortname = $metaname; 122 } else { 107 if (defined ($metadata)) { 123 108 $sortname = undef; 124 } 125 } 126 127 if ($metaname) { 109 } else { 110 $sortname = "nosort"; 111 } 112 } 113 114 if (defined $sortname && $sortname eq "nosort") { 115 $list = []; 116 } else { 128 117 $list = {}; 129 } else { 130 $list = []; 131 $metaname = undef; 132 } 133 118 } 119 134 120 $self->{'list'} = $list; 135 $self->{'metaname'} = $metaname; 121 if (defined $metadata) { 122 $self->{'meta_list'} = \@meta_list; 123 } 136 124 $self->{'title'} = $title; 137 125 $self->{'sortname'} = $sortname; … … 143 131 my $self = shift (@_); 144 132 145 if (defined $self->{'sortname'}) {146 $self->{'list'} = {};147 } else {148 $self->{'list'} = [];149 }150 133 } 151 134 … … 156 139 my $doc_OID = $doc_obj->get_OID(); 157 140 158 my $sortmeta = ""; 141 # are we sorting the list?? 142 my $nosort = 0; 143 if (defined $self->{'sortname'} && $self->{'sortname'} eq "nosort") { 144 $nosort = 1; 145 } 146 147 my $metavalue; 148 my $metaname; 149 if (defined $self->{'meta_list'}) { 150 # find the first available metadata 151 foreach $m (@{$self->{'meta_list'}}) { 152 $metavalue = $doc_obj->get_metadata_element($doc_obj->get_top_section(), $m); 153 $metaname = $m; 154 last if defined $metavalue; 155 } 156 #if we haven't found a metavalue here, then the doc shouldn't be included 157 return unless defined $metavalue; 158 } 159 160 # we know the doc should be included, add it now if we are not sorting 161 if ($nosort) { 162 push (@{$self->{'list'}}, $doc_OID); 163 return; 164 } 165 166 #check for a sort element other than our metadata 159 167 if (defined $self->{'sortname'}) { 168 my $sortmeta; 160 169 if ($self->{'sortname'} =~ /^filename$/i) { 161 170 $sortmeta = $doc_obj->get_source_filename(); 162 171 } else { 163 $sortmeta = $doc_obj->get_metadata_element($doc_obj->get_top_section(), 164 $self->{'sortname'}); 172 $sortmeta = $doc_obj->get_metadata_element($doc_obj->get_top_section(), $self->{'sortname'}); 165 173 if (defined $sortmeta) { 166 167 my $lang = $doc_obj->get_metadata_element ($doc_obj->get_top_section(), 'Language'); 168 $lang = 'en' unless defined $lang; 169 if ($lang eq 'en') { 170 if ($self->{'sortname'} eq "Creator") { 171 &sorttools::format_string_name_english (\$sortmeta); 172 } else { 173 &sorttools::format_string_english (\$sortmeta); 174 } 175 } 174 $sortmeta = &format_sort_meta($self->{'sortname'}, $sortmeta, $doc_obj); 176 175 } 177 176 } 178 177 $sortmeta = "" unless defined $sortmeta; 179 180 if (defined $self->{'metaname'}) { 181 my $metavalue = $doc_obj->get_metadata_element ($doc_obj->get_top_section(), 182 $self->{'metaname'}); 183 if (defined $metavalue) { 184 if (defined $self->{'list'}->{$doc_OID}) { 185 my $outhandle = $self->{'outhandle'}; 186 print $outhandle "WARNING: List::classify called multiple times for $doc_OID\n"; 187 } 188 $self->{'list'}->{$doc_OID} = $sortmeta; 189 } 190 } else { 191 if (defined $self->{'list'}->{$doc_OID}) { 192 my $outhandle = $self->{'outhandle'}; 193 print $outhandle "WARNING: List::classify called multiple times for $doc_OID\n"; 194 } 195 $self->{'list'}->{$doc_OID} = $sortmeta; 196 } 197 } else { 198 if (defined $self->{'metaname'}) { 199 my $metavalue = $doc_obj->get_metadata_element ($doc_obj->get_top_section(), 200 $self->{'metaname'}); 201 if (defined $metavalue) { 202 push (@{$self->{'list'}}, $doc_OID); 203 } 204 } else { 205 push (@{$self->{'list'}}, $doc_OID); 206 } 207 } 178 $self->{'list'}->{$doc_OID} = $sortmeta; 179 } else { 180 # we add to the list based on metadata value 181 # but we need to do the same formatting as for sort value 182 ($metavalue) = &format_sort_meta($metaname, $metavalue, $doc_obj); 183 $self->{'list'}->{$doc_OID} = $metavalue; 184 } 185 } 186 187 sub format_sort_meta { 188 my ($sortname, $sortvalue, $doc_obj) = @_; 189 190 my $lang = $doc_obj->get_metadata_element ($doc_obj->get_top_section(), 'Language'); 191 $lang = 'en' unless defined $lang; 192 if ($lang eq 'en') { 193 if ($sortname eq "Creator") { 194 &sorttools::format_string_name_english (\$sortvalue); 195 } else { 196 &sorttools::format_string_english (\$sortvalue); 197 } 198 } 199 return $sortvalue; 208 200 } 209 201 … … 214 206 215 207 my @list = (); 216 if (defined $self->{'sortname'}) { 208 if (defined $self->{'sortname'} && $self->{'sortname'} eq "nosort") { 209 @list = @{$self->{'list'}}; 210 } else { 217 211 if (keys %{$self->{'list'}}) { 218 212 @list = sort {$self->{'list'}->{$a} 219 213 cmp $self->{'list'}->{$b};} keys %{$self->{'list'}}; 220 } 221 } else { 222 @list = @{$self->{'list'}}; 214 } 223 215 } 224 216
Note:
See TracChangeset
for help on using the changeset viewer.