/Library/TMInflector+Inflections.m

http://github.com/RISCfuture/TMInflector · Objective C · 199 lines · 150 code · 49 blank · 0 comment · 0 complexity · 460d814e4be27278d08d41a6f91a8842 MD5 · raw file

  1. #import "TMInflector+Inflections.h"
  2. @implementation TMInflector (Inflections)
  3. + (void) initialize {
  4. [self addPluralRules];
  5. [self addSingularRules];
  6. [self addIrregularRules];
  7. [self addUncountables];
  8. }
  9. + (void) addPluralRules {
  10. RKRegex *rule;
  11. [[TMInflector inflector] addPluralRule:@"$" replacement:@"s"];
  12. rule = [[RKRegex alloc] initWithRegexString:@"s$" options:RKCompileCaseless];
  13. [[TMInflector inflector] addPluralRule:rule replacement:@"s"];
  14. [rule release];
  15. rule = [[RKRegex alloc] initWithRegexString:@"(ax|test)is$" options:RKCompileCaseless];
  16. [[TMInflector inflector] addPluralRule:rule replacement:@"$1es"];
  17. [rule release];
  18. rule = [[RKRegex alloc] initWithRegexString:@"(octop|vir)us$" options:RKCompileCaseless];
  19. [[TMInflector inflector] addPluralRule:rule replacement:@"$1i"];
  20. [rule release];
  21. rule = [[RKRegex alloc] initWithRegexString:@"(alias|status)$" options:RKCompileCaseless];
  22. [[TMInflector inflector] addPluralRule:rule replacement:@"$1es"];
  23. [rule release];
  24. rule = [[RKRegex alloc] initWithRegexString:@"(bu)s$" options:RKCompileCaseless];
  25. [[TMInflector inflector] addPluralRule:rule replacement:@"$1ses"];
  26. [rule release];
  27. rule = [[RKRegex alloc] initWithRegexString:@"(buffal|tomat)o$" options:RKCompileCaseless];
  28. [[TMInflector inflector] addPluralRule:rule replacement:@"$1oes"];
  29. [rule release];
  30. rule = [[RKRegex alloc] initWithRegexString:@"([ti])um$" options:RKCompileCaseless];
  31. [[TMInflector inflector] addPluralRule:rule replacement:@"$1a"];
  32. [rule release];
  33. rule = [[RKRegex alloc] initWithRegexString:@"sis$" options:RKCompileCaseless];
  34. [[TMInflector inflector] addPluralRule:rule replacement:@"ses"];
  35. [rule release];
  36. rule = [[RKRegex alloc] initWithRegexString:@"(?:([^f])fe|([lr])f)$" options:RKCompileCaseless];
  37. [[TMInflector inflector] addPluralRule:rule replacement:@"$1$2ves"];
  38. [rule release];
  39. rule = [[RKRegex alloc] initWithRegexString:@"(hive)$" options:RKCompileCaseless];
  40. [[TMInflector inflector] addPluralRule:rule replacement:@"$1s"];
  41. [rule release];
  42. rule = [[RKRegex alloc] initWithRegexString:@"([^aeiouy]|qu)y$" options:RKCompileCaseless];
  43. [[TMInflector inflector] addPluralRule:rule replacement:@"$1ies"];
  44. [rule release];
  45. rule = [[RKRegex alloc] initWithRegexString:@"(x|ch|ss|sh)$" options:RKCompileCaseless];
  46. [[TMInflector inflector] addPluralRule:rule replacement:@"$1es"];
  47. [rule release];
  48. rule = [[RKRegex alloc] initWithRegexString:@"(matr|vert|ind)(?:ix|ex)$" options:RKCompileCaseless];
  49. [[TMInflector inflector] addPluralRule:rule replacement:@"$1ices"];
  50. [rule release];
  51. rule = [[RKRegex alloc] initWithRegexString:@"([m|l])ouse$" options:RKCompileCaseless];
  52. [[TMInflector inflector] addPluralRule:rule replacement:@"$1ice"];
  53. [rule release];
  54. rule = [[RKRegex alloc] initWithRegexString:@"^(ox)$" options:RKCompileCaseless];
  55. [[TMInflector inflector] addPluralRule:rule replacement:@"$1en"];
  56. [rule release];
  57. rule = [[RKRegex alloc] initWithRegexString:@"(quiz)$" options:RKCompileCaseless];
  58. [[TMInflector inflector] addPluralRule:rule replacement:@"$1zes"];
  59. [rule release];
  60. }
  61. + (void) addSingularRules {
  62. RKRegex *rule;
  63. rule = [[RKRegex alloc] initWithRegexString:@"s$" options:RKCompileCaseless];
  64. [[TMInflector inflector] addSingularRule:rule replacement:@""];
  65. [rule release];
  66. rule = [[RKRegex alloc] initWithRegexString:@"(n)ews$" options:RKCompileCaseless];
  67. [[TMInflector inflector] addSingularRule:rule replacement:@"$1ews"];
  68. [rule release];
  69. rule = [[RKRegex alloc] initWithRegexString:@"([ti])a$" options:RKCompileCaseless];
  70. [[TMInflector inflector] addSingularRule:rule replacement:@"$1um"];
  71. [rule release];
  72. rule = [[RKRegex alloc] initWithRegexString:@"((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$" options:RKCompileCaseless];
  73. [[TMInflector inflector] addSingularRule:rule replacement:@"$1$2sis"];
  74. [rule release];
  75. rule = [[RKRegex alloc] initWithRegexString:@"(^analy)ses$" options:RKCompileCaseless];
  76. [[TMInflector inflector] addSingularRule:rule replacement:@"$1sis"];
  77. [rule release];
  78. rule = [[RKRegex alloc] initWithRegexString:@"([^f])ves$" options:RKCompileCaseless];
  79. [[TMInflector inflector] addSingularRule:rule replacement:@"\1fe"];
  80. [rule release];
  81. rule = [[RKRegex alloc] initWithRegexString:@"(hive)s$" options:RKCompileCaseless];
  82. [[TMInflector inflector] addSingularRule:rule replacement:@"$1"];
  83. [rule release];
  84. rule = [[RKRegex alloc] initWithRegexString:@"(tive)s$" options:RKCompileCaseless];
  85. [[TMInflector inflector] addSingularRule:rule replacement:@"$1"];
  86. [rule release];
  87. rule = [[RKRegex alloc] initWithRegexString:@"([lr])ves$" options:RKCompileCaseless];
  88. [[TMInflector inflector] addSingularRule:rule replacement:@"\1f"];
  89. [rule release];
  90. rule = [[RKRegex alloc] initWithRegexString:@"([^aeiouy]|qu)ies$" options:RKCompileCaseless];
  91. [[TMInflector inflector] addSingularRule:rule replacement:@"$1y"];
  92. [rule release];
  93. rule = [[RKRegex alloc] initWithRegexString:@"(s)eries$" options:RKCompileCaseless];
  94. [[TMInflector inflector] addSingularRule:rule replacement:@"$1eries"];
  95. [rule release];
  96. rule = [[RKRegex alloc] initWithRegexString:@"(m)ovies$" options:RKCompileCaseless];
  97. [[TMInflector inflector] addSingularRule:rule replacement:@"$1ovie"];
  98. [rule release];
  99. rule = [[RKRegex alloc] initWithRegexString:@"(x|ch|ss|sh)es$" options:RKCompileCaseless];
  100. [[TMInflector inflector] addSingularRule:rule replacement:@"$1"];
  101. [rule release];
  102. rule = [[RKRegex alloc] initWithRegexString:@"([m|l])ice$" options:RKCompileCaseless];
  103. [[TMInflector inflector] addSingularRule:rule replacement:@"$1ouse"];
  104. [rule release];
  105. rule = [[RKRegex alloc] initWithRegexString:@"(bus)es$" options:RKCompileCaseless];
  106. [[TMInflector inflector] addSingularRule:rule replacement:@"$1"];
  107. [rule release];
  108. rule = [[RKRegex alloc] initWithRegexString:@"(o)es$" options:RKCompileCaseless];
  109. [[TMInflector inflector] addSingularRule:rule replacement:@"$1"];
  110. [rule release];
  111. rule = [[RKRegex alloc] initWithRegexString:@"(shoe)s$" options:RKCompileCaseless];
  112. [[TMInflector inflector] addSingularRule:rule replacement:@"$1"];
  113. [rule release];
  114. rule = [[RKRegex alloc] initWithRegexString:@"(cris|ax|test)es$" options:RKCompileCaseless];
  115. [[TMInflector inflector] addSingularRule:rule replacement:@"$1is"];
  116. [rule release];
  117. rule = [[RKRegex alloc] initWithRegexString:@"(octop|vir)i$" options:RKCompileCaseless];
  118. [[TMInflector inflector] addSingularRule:rule replacement:@"$1us"];
  119. [rule release];
  120. rule = [[RKRegex alloc] initWithRegexString:@"(alias|status)es$" options:RKCompileCaseless];
  121. [[TMInflector inflector] addSingularRule:rule replacement:@"$1"];
  122. [rule release];
  123. rule = [[RKRegex alloc] initWithRegexString:@"^(ox)en" options:RKCompileCaseless];
  124. [[TMInflector inflector] addSingularRule:rule replacement:@"$1"];
  125. [rule release];
  126. rule = [[RKRegex alloc] initWithRegexString:@"(vert|ind)ices$" options:RKCompileCaseless];
  127. [[TMInflector inflector] addSingularRule:rule replacement:@"$1ex"];
  128. [rule release];
  129. rule = [[RKRegex alloc] initWithRegexString:@"(matr)ices$" options:RKCompileCaseless];
  130. [[TMInflector inflector] addSingularRule:rule replacement:@"$1ix"];
  131. [rule release];
  132. rule = [[RKRegex alloc] initWithRegexString:@"(quiz)zes$" options:RKCompileCaseless];
  133. [[TMInflector inflector] addSingularRule:rule replacement:@"$1"];
  134. [rule release];
  135. rule = [[RKRegex alloc] initWithRegexString:@"(database)s$" options:RKCompileCaseless];
  136. [[TMInflector inflector] addSingularRule:rule replacement:@"$1"];
  137. [rule release];
  138. }
  139. + (void) addIrregularRules {
  140. [[TMInflector inflector] addIrregularRuleWithSingular:@"person" plural:@"people"];
  141. [[TMInflector inflector] addIrregularRuleWithSingular:@"man" plural:@"men"];
  142. [[TMInflector inflector] addIrregularRuleWithSingular:@"child" plural:@"children"];
  143. [[TMInflector inflector] addIrregularRuleWithSingular:@"sex" plural:@"sexes"];
  144. [[TMInflector inflector] addIrregularRuleWithSingular:@"move" plural:@"moves"];
  145. [[TMInflector inflector] addIrregularRuleWithSingular:@"cow" plural:@"kine"];
  146. }
  147. + (void) addUncountables {
  148. [[TMInflector inflector] addUncountableWords:@"equipment", @"information", @"rice", @"money", @"species", @"series", @"fish", @"sheep", NULL];
  149. }
  150. @end