Skip to content

Commit

Permalink
♻️ Deduplicate inflection rules
Browse files Browse the repository at this point in the history
  • Loading branch information
skerit committed Feb 13, 2024
1 parent a630214 commit e3d710a
Showing 1 changed file with 97 additions and 94 deletions.
191 changes: 97 additions & 94 deletions lib/inflections.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand All @@ -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
Expand Down

0 comments on commit e3d710a

Please sign in to comment.