模仿Rails的Inflection方法,用actionscript 改寫如下:
Inflection#singularize : 將複數轉單數
如:
Inflection.singularize( “cars” ); //cars => car
Inflection#pluralize : 將單數轉複數
如:
Inflection.pluralize( “apple” ); // apple => apples
原始碼如下:(source)
package net.shiue.util
{
public class Inflection
{
public function Inflection()
{
}
public static function pluralize( word:String ):String
{
if( isUncountable( word ) )
return word;
for each( var r:Replacer in plurals )
{
if( word.search( r.pattern ) >= 0 )
return word.replace( r.pattern , r.repalcePattern );
}
return word;
}
public static function singularize( word:String ):String
{
if( isUncountable( word ) )
return word;
for each( var r:Replacer in singulars )
{
if( word.search( r.pattern ) >= 0 )
return word.replace( r.pattern , r.repalcePattern );
}
return word;
}
private static var _plurals:Array;
private static function get plurals():Array
{
if( _plurals == null )
{
_plurals = [];
_plurals.push( new Replacer( /(quiz)$/i , "$1zes" ) );
_plurals.push( new Replacer( /^(ox)$/i , "$1en" ) );
_plurals.push( new Replacer( /([m|l])ouse$/i , "$1ice" ) );
_plurals.push( new Replacer( /(matr|vert|ind)(?:ix|ex)$/i , "$1ices" ) );
_plurals.push( new Replacer( /(x|ch|ss|sh)$/i , "$1es" ) );
_plurals.push( new Replacer( /([^aeiouy]|qu)y$/i , "$1ies" ) );
_plurals.push( new Replacer( /(hive)$/i , "$1s" ) );
_plurals.push( new Replacer( /(?:([^f])fe|([lr])f)$/i , "$1$2ves" ) );
_plurals.push( new Replacer( /sis$/i , "ses" ) );
_plurals.push( new Replacer( /([ti])um$/i , "$1a" ) );
_plurals.push( new Replacer( /(buffal|tomat)o$/i , "$1oes" ) );
_plurals.push( new Replacer( /(bu)s$/i , "$1ses" ) );
_plurals.push( new Replacer( /(alias|status)$/i , "$1es" ) );
_plurals.push( new Replacer( /(octop|vir)us$/i , "$1i" ) );
_plurals.push( new Replacer( /(ax|test)is$/i , "$1es" ) );
_plurals.push( new Replacer( /s$/i , "s" ) );
_plurals.push( new Replacer( /$/i , "s" ) );
}
return _plurals;
}
private static var _singulars:Array;
private static function get singulars():Array
{
if( _singulars == null )
{
_singulars = [];
_singulars.push( new Replacer(/(database)s$/i , "$1") );
_singulars.push( new Replacer(/(quiz)zes$/i , "$1") );
_singulars.push( new Replacer(/(matr)ices$/i , "$1ix") );
_singulars.push( new Replacer(/(vert|ind)ices$/i , "$1ex") );
_singulars.push( new Replacer(/^(ox)en/i , "$1") );
_singulars.push( new Replacer(/(alias|status)es$/i, "$1") );
_singulars.push( new Replacer(/(octop|vir)i$/i, "$1us") );
_singulars.push( new Replacer(/(cris|ax|test)es$/i, "$1is") );
_singulars.push( new Replacer(/(shoe)s$/i, "$1") );
_singulars.push( new Replacer(/(o)es$/i, "$1") );
_singulars.push( new Replacer(/(bus)es$/i, "$1") );
_singulars.push( new Replacer(/([m|l])ice$/i, "$1ouse") );
_singulars.push( new Replacer(/(x|ch|ss|sh)es$/i, "$1") );
_singulars.push( new Replacer(/(m)ovies$/i, "$1ovie") );
_singulars.push( new Replacer(/(s)eries$/i, "$1eries") );
_singulars.push( new Replacer(/([^aeiouy]|qu)ies$/i, "$1y") );
_singulars.push( new Replacer(/([lr])ves$/i, "$1f") );
_singulars.push( new Replacer(/(tive)s$/i, "$1") );
_singulars.push( new Replacer(/(hive)s$/i, "$1") );
_singulars.push( new Replacer(/([^f])ves$/i, "$1fe") );
_singulars.push( new Replacer(/(^analy)ses$/i, "$1sis") );
_singulars.push( new Replacer(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i, "$1$2sis") );
_singulars.push( new Replacer(/([ti])a$/i, "$1um") );
_singulars.push( new Replacer(/(n)ews$/i, "$1ews") );
_singulars.push( new Replacer(/s$/i, "") );
}
return _singulars;
}
private static var _irregular:Array;
private static function get irregular():Array
{
if( _irregular == null )
{
_irregular = [];
_irregular.push( new Replacer(/person/i , "people") );
_irregular.push( new Replacer(/man/i , "men") );
_irregular.push( new Replacer(/woman/i , "women") );
_irregular.push( new Replacer(/child/i , "children") );
_irregular.push( new Replacer(/sex/i , "sexes") );
_irregular.push( new Replacer(/move/i , "moves") );
_irregular.push( new Replacer(/cow/i , "kine") );
}
return _irregular;
}
private static var _uncountable:Array;
private static function get uncountable():Array
{
if( _uncountable == null )
{
_uncountable = [];
_uncountable.push("equipment");
_uncountable.push("information");
_uncountable.push("rice");
_uncountable.push("money");
_uncountable.push("species");
_uncountable.push("series");
_uncountable.push("fish");
_uncountable.push("sheep");
}
return _uncountable;
}
public static function isUncountable( word:String ):Boolean
{
return uncountable.indexOf( word )>=0;
}
}
}
class Replacer
{
public function Replacer( pattern:RegExp , replacePattern:String )
{
this.pattern = pattern;
this.repalcePattern = replacePattern;
}
public var pattern:RegExp;
public var repalcePattern:String;
}