Changeset 6942


Ignore:
Timestamp:
2004-03-05T16:24:30+13:00 (20 years ago)
Author:
kjdon
Message:

tidied up List classifier: now takes comma separated list for -metadata, -sort can be nosort

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gsdl/perllib/classify/List.pm

    r6761 r6942  
    2525
    2626# 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"
    4128
    4229use BasClas;
     
    5340    'desc' => "{List.metadata}",
    5441    'type' => "metadata",
    55     'reqd' => "yes" },
     42    'reqd' => "no" },
    5643      { 'name' => "buttonname",
    5744    'desc' => "{List.buttonname}",
     
    7158        'args'     => $arguments };
    7259
    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 not
    86 #                    set) in build (random) order.
    87 #  ";
    88 #  }
    8960
    9061sub new {
     
    9667    push( @{$option_list}, $options );
    9768
    98     my ($metaname, $title, $sortname, $list);
     69    my ($metadata, $title, $sortname, $list);
    9970
    10071    if (!parsargv::parse(\@_,
    101              q^metadata/.*/^, \$metaname,
     72             q^metadata/.*/^, \$metadata,
    10273             q^buttonname/.*/^, \$title,
    10374             q^sort/.*/^, \$sortname,
     
    10879    die "\n";
    10980    }
     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    }
    11092
    11193    if (!$title) {
    112     if ($metaname) {
    113         $title = $metaname;
     94    if (defined ($meta1)) {
     95        $title = $meta1;
    11496    } else {
    11597        $title = 'List';
     
    11799    }
    118100
     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'
    119106    if (!$sortname) {
    120     if ($metaname) {
    121         $sortname = $metaname;
    122     } else {
     107    if (defined ($metadata)) {
    123108        $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 {
    128117    $list = {};
    129     } else {
    130     $list = [];
    131     $metaname = undef;
    132     }
    133 
     118    }
     119   
    134120    $self->{'list'} = $list;
    135     $self->{'metaname'} = $metaname;
     121    if (defined $metadata) {
     122    $self->{'meta_list'} = \@meta_list;
     123    }
    136124    $self->{'title'} = $title;
    137125    $self->{'sortname'} = $sortname;
     
    143131    my $self = shift (@_);
    144132
    145     if (defined $self->{'sortname'}) {
    146     $self->{'list'} = {};
    147     } else {
    148     $self->{'list'} = [];
    149     }
    150133}
    151134
     
    156139    my $doc_OID = $doc_obj->get_OID();
    157140
    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
    159167    if (defined $self->{'sortname'}) {
     168    my $sortmeta;
    160169    if ($self->{'sortname'} =~ /^filename$/i) {
    161170        $sortmeta = $doc_obj->get_source_filename();
    162171    } 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'});
    165173        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);
    176175        }
    177176    }
    178177    $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
     187sub 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;
    208200}
    209201
     
    214206
    215207    my @list = ();
    216     if (defined $self->{'sortname'}) {
     208    if (defined $self->{'sortname'} && $self->{'sortname'} eq "nosort") {
     209    @list = @{$self->{'list'}};
     210    } else {
    217211    if (keys %{$self->{'list'}}) {
    218212        @list = sort {$self->{'list'}->{$a}
    219213              cmp $self->{'list'}->{$b};} keys %{$self->{'list'}};
    220     }
    221     } else {
    222     @list = @{$self->{'list'}};
     214    }   
    223215    }
    224216
Note: See TracChangeset for help on using the changeset viewer.