diff --git a/lib/inflections.js b/lib/inflections.js index 891800b..7ea4090 100644 --- a/lib/inflections.js +++ b/lib/inflections.js @@ -20,6 +20,10 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +const Rxi = (pattern) => RegExp(pattern, 'gi'), + Rxia = (pattern) => [Rxi(pattern)], + Rxiar = (pattern, replacement) => [Rxi(pattern), '$1' + (replacement || '')]; + let S; let InflectionJS = { @@ -34,107 +38,106 @@ let InflectionJS = { // These rules translate from the singular form of a noun to its plural form. plural_rules: [ // do not replace if its already a plural word - [ RegExp( '(m)en$', 'gi' )], - [ RegExp( '(pe)ople$', 'gi' )], - [ RegExp( '(child)ren$', 'gi' )], - [ RegExp( '([ti])a$', 'gi' )], - [ RegExp( '((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$','gi' )], - [ RegExp( '(hive)s$', 'gi' )], - [ RegExp( '(tive)s$', 'gi' )], - [ RegExp( '(curve)s$', 'gi' )], - [ RegExp( '([lr])ves$', 'gi' )], - [ RegExp( '([^fo])ves$', 'gi' )], - [ RegExp( '([^aeiouy]|qu)ies$', 'gi' )], - [ RegExp( '(s)eries$', 'gi' )], - [ RegExp( '(m)ovies$', 'gi' )], - [ RegExp( '(x|ch|ss|sh)es$', 'gi' )], - [ RegExp( '([m|l])ice$', 'gi' )], - [ RegExp( '(bus)es$', 'gi' )], - [ RegExp( '(o)es$', 'gi' )], - [ RegExp( '(shoe)s$', 'gi' )], - [ RegExp( '(cris|ax|test)es$', 'gi' )], - [ RegExp( '(octop|vir)i$', 'gi' )], - [ RegExp( '(alias|status)es$', 'gi' )], - [ RegExp( '^(ox)en', 'gi' )], - [ RegExp( '(vert|ind)ices$', 'gi' )], - [ RegExp( '(matr)ices$', 'gi' )], - [ RegExp( '(quiz)zes$', 'gi' )], - - [ RegExp( '(m)an$', 'gi' ), '$1en' ], - [ RegExp( '(pe)rson$', 'gi' ), '$1ople' ], - [ RegExp( '(child)$', 'gi' ), '$1ren' ], - [ RegExp( '^(ox)$', 'gi' ), '$1en' ], - [ RegExp( '(ax|test)is$', 'gi' ), '$1es' ], - [ RegExp( '(octop|vir)us$', 'gi' ), '$1i' ], - [ RegExp( '(alias|status)$', 'gi' ), '$1es' ], - [ RegExp( '(bu)s$', 'gi' ), '$1ses' ], - [ RegExp( '(buffal|tomat|potat)o$', 'gi' ), '$1oes' ], - [ RegExp( '([ti])um$', 'gi' ), '$1a' ], - [ RegExp( 'sis$', 'gi' ), 'ses' ], - [ RegExp( '(?:([^f])fe|([lr])f)$', 'gi' ), '$1$2ves' ], - [ RegExp( '(hive)$', 'gi' ), '$1s' ], - [ RegExp( '([^aeiouy]|qu)y$', 'gi' ), '$1ies' ], - [ RegExp( '(x|ch|ss|sh)$', 'gi' ), '$1es' ], - [ RegExp( '(matr|vert|ind)ix|ex$', 'gi' ), '$1ices' ], - [ RegExp( '([m|l])ouse$', 'gi' ), '$1ice' ], - [ RegExp( '(quiz)$', 'gi' ), '$1zes' ], - [ RegExp( '(criter)ion$', 'gi'), '$1ia' ], - - [ RegExp( 's$', 'gi' ), 's' ], - [ RegExp( '$', 'gi' ), 's' ] + Rxia('(m)en$'), + Rxia('(pe)ople$'), + Rxia('(child)ren$'), + Rxia('([ti])a$'), + Rxia('((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$'), + Rxia('(hive)s$'), + Rxia('(tive)s$'), + Rxia('(curve)s$'), + Rxia('([lr])ves$'), + Rxia('([^fo])ves$'), + Rxia('([^aeiouy]|qu)ies$'), + Rxia('(s)eries$'), + Rxia('(m)ovies$'), + Rxia('(x|ch|ss|sh)es$'), + Rxia('([m|l])ice$'), + Rxia('(bus)es$'), + Rxia('(o)es$'), + Rxia('(shoe)s$'), + Rxia('(cris|ax|test)es$'), + Rxia('(octop|vir)i$'), + Rxia('(alias|status)es$'), + Rxia('^(ox)en'), + Rxia('(vert|ind)ices$'), + Rxia('(matr)ices$'), + Rxia('(quiz)zes$'), + + Rxiar('(m)an$', 'en'), + Rxiar('(pe)rson$', 'ople'), + Rxiar('(child)$', 'ren'), + Rxiar('^(ox)$', 'en'), + Rxiar('(ax|test)is$', 'es'), + Rxiar('(octop|vir)us$', 'i'), + Rxiar('(alias|status)$', 'es'), + Rxiar('(bu)s$', 'ses'), + Rxiar('(buffal|tomat|potat)o$', 'oes'), + Rxiar('([ti])um$', 'a'), + [Rxi('sis$'), 'ses'], + Rxiar('(?:([^f])fe|([lr])f)$', '$2ves'), + Rxiar('(hive)$', 's'), + Rxiar('([^aeiouy]|qu)y$', 'ies'), + Rxiar('(x|ch|ss|sh)$', 'es'), + Rxiar('(matr|vert|ind)ix|ex$', 'ices'), + Rxiar('([m|l])ouse$', 'ice'), + Rxiar('(quiz)$', 'zes'), + Rxiar('(criter)ion$', 'ia'), + [Rxi('s$'), 's'], + [Rxi('$'), 's'] ], // These rules translate from the plural form of a noun to its singular form. singular_rules: [ // do not replace if its already a singular word - [ RegExp( '(m)an$', 'gi' )], - [ RegExp( '(pe)rson$', 'gi' )], - [ RegExp( '(child)$', 'gi' )], - [ RegExp( '^(ox)$', 'gi' )], - [ RegExp( '(ax|test)is$', 'gi' )], - [ RegExp( '(octop|vir)us$', 'gi' )], - [ RegExp( '(alias|status)$', 'gi' )], - [ RegExp( '(bu)s$', 'gi' )], - [ RegExp( '(buffal|tomat|potat)o$', 'gi' )], - [ RegExp( '([ti])um$', 'gi' )], - [ RegExp( 'sis$', 'gi' )], - [ RegExp( '(?:([^f])fe|([lr])f)$', 'gi' )], - [ RegExp( '(hive)$', 'gi' )], - [ RegExp( '([^aeiouy]|qu)y$', 'gi' )], - [ RegExp( '(x|ch|ss|sh)$', 'gi' )], - [ RegExp( '(matr|vert|ind)ix|ex$', 'gi' )], - [ RegExp( '([m|l])ouse$', 'gi' )], - [ RegExp( '(quiz)$', 'gi' )], + Rxia('(m)an$'), + Rxia('(pe)rson$'), + Rxia('(child)$'), + Rxia('^(ox)$'), + Rxia('(ax|test)is$'), + Rxia('(octop|vir)us$'), + Rxia('(alias|status)$'), + Rxia('(bu)s$'), + Rxia('(buffal|tomat|potat)o$'), + Rxia('([ti])um$'), + Rxia('sis$'), + Rxia('(?:([^f])fe|([lr])f)$'), + Rxia('(hive)$'), + Rxia('([^aeiouy]|qu)y$'), + Rxia('(x|ch|ss|sh)$'), + Rxia('(matr|vert|ind)ix|ex$'), + Rxia('([m|l])ouse$'), + Rxia('(quiz)$'), // original rule - [ RegExp( '(m)en$', 'gi' ), '$1an' ], - [ RegExp( '(pe)ople$', 'gi' ), '$1rson' ], - [ RegExp( '(child)ren$', 'gi' ), '$1' ], - [ RegExp( '(criteri)a$', 'gi' ), '$1on'], - [ RegExp( '([ti])a$', 'gi' ), '$1um' ], - [ RegExp( '((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$','gi' ), '$1$2sis' ], - [ RegExp( '(hive)s$', 'gi' ), '$1' ], - [ RegExp( '(tive)s$', 'gi' ), '$1' ], - [ RegExp( '(curve)s$', 'gi' ), '$1' ], - [ RegExp( '([lr])ves$', 'gi' ), '$1f' ], - [ RegExp( '([^fo])ves$', 'gi' ), '$1fe' ], - [ RegExp( '(m)ovies$', 'gi' ), '$1ovie' ], - [ RegExp( '([^aeiouy]|qu)ies$', 'gi' ), '$1y' ], - [ RegExp( '(s)eries$', 'gi' ), '$1eries' ], - [ RegExp( '(x|ch|ss|sh)es$', 'gi' ), '$1' ], - [ RegExp( '([m|l])ice$', 'gi' ), '$1ouse' ], - [ RegExp( '(bus)es$', 'gi' ), '$1' ], - [ RegExp( '(o)es$', 'gi' ), '$1' ], - [ RegExp( '(shoe)s$', 'gi' ), '$1' ], - [ RegExp( '(cris|ax|test)es$', 'gi' ), '$1is' ], - [ RegExp( '(octop|vir)i$', 'gi' ), '$1us' ], - [ RegExp( '(alias|status)es$', 'gi' ), '$1' ], - [ RegExp( '^(ox)en', 'gi' ), '$1' ], - [ RegExp( '(vert|ind)ices$', 'gi' ), '$1ex' ], - [ RegExp( '(matr)ices$', 'gi' ), '$1ix' ], - [ RegExp( '(quiz)zes$', 'gi' ), '$1' ], - [ RegExp( 'ss$', 'gi' ), 'ss' ], - [ RegExp( 's$', 'gi' ), '' ], + Rxiar('(m)en$', 'an'), + Rxiar('(pe)ople$', 'rson'), + Rxiar('(child)ren$'), + Rxiar('(criteri)a$', 'on'), + Rxiar('([ti])a$', 'um'), + Rxiar('((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$', '$2sis'), + Rxiar('(hive)s$'), + Rxiar('(tive)s$'), + Rxiar('(curve)s$'), + Rxiar('([lr])ves$', 'f'), + Rxiar('([^fo])ves$', 'fe'), + Rxiar('(m)ovies$', 'ovie'), + Rxiar('([^aeiouy]|qu)ies$', 'y'), + Rxiar('(s)eries$', 'eries'), + Rxiar('(x|ch|ss|sh)es$'), + Rxiar('([m|l])ice$', 'ouse'), + Rxiar('(bus)es$'), + Rxiar('(o)es$'), + Rxiar('(shoe)s$'), + Rxiar('(cris|ax|test)es$', 'is'), + Rxiar('(octop|vir)i$', 'us'), + Rxiar('(alias|status)es$'), + Rxiar('^(ox)en'), + Rxiar('(vert|ind)ices$', 'ex'), + Rxiar('(matr)ices$', 'ix'), + Rxiar('(quiz)zes$'), + [Rxi('ss$'), 'ss'], + [Rxi('s$'), ''], ], // This is a list of words that should not be capitalized for title case