# TWiki Enterprise Collaboration Platform, http://TWiki.org/
#
# Copyright (C) 1999-2005 TWiki Contributors. All Rights Reserved.
# TWiki Contributors are listed in the AUTHORS file in the root of
# this distribution.
# NOTE: Please extend that file, not this notice.
#
# Additional copyrights apply to some or all of the code in this
# file as follows:
# Copyright (C) 2005 Martin Cleaver.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version. For
# more details read LICENSE in the root of this distribution.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# As per the GPL, removal of this notice is prohibited.

use strict;

=pod

---+ package TWiki::Plurals

Handle conversion of plural topic names to singular form.

=cut

package TWiki::Plurals;

use TWiki;

=pod

---++ StaticMethod singularForm($web, $pluralForm) -> $singularForm

Try to singularise plural topic name.
   * =$web= - the web the topic must be in
   * =$pluralForm= - topic name
Returns undef if no singular form exists, otherwise returns the
singular form of the topic

I18N - Only apply plural processing if site language is English, or
if a built-in English-language web (Main, TWiki or Plugins).  Plurals
apply to names ending in 's', where topic doesn't exist with plural
name.

SMELL: this is highly langauge specific, and shoud be overridable
on a per-installation basis.

=cut

sub singularForm {
    my( $web, $pluralForm ) = @_;
    $web =~ s#\.#/#go;

    # SMELL Plural processing should be set per web
    # SMELL Lang settings should be set per web
    return undef unless( $TWiki::cfg{PluralToSingular} );
    return undef unless( $pluralForm =~ /s$/ );
    return undef unless( (defined($TWiki::cfg{Site}{Lang}) and $TWiki::cfg{Site}{Lang} eq 'en')
                         or $web eq $TWiki::cfg{UsersWebName}
                         or $web eq $TWiki::cfg{SystemWebName}
                       );
    # Topic name is plural in form
    my $singularForm = $pluralForm;
    $singularForm =~ s/ies$/y/;      # plurals like policy / policies
    $singularForm =~ s/sses$/ss/;    # plurals like address / addresses
    $singularForm =~ s/ches$/ch/;    # plurals like search / searches
    $singularForm =~ s/(oes|os)$/o/; # plurals like veto / vetoes
    $singularForm =~ s/([Xx])es$/$1/;# plurals like box / boxes
    $singularForm =~ s/([^s])s$/$1/; # others, excluding ss like address(es)
    return $singularForm
}

1;
