blob: f54dac019e9c35e8b82eae1e1968c3dc143636e2 [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Derek Allard2067d1a2008-11-13 22:59:24 +00002/**
3 * CodeIgniter
4 *
Andrey Andreevfe9309d2015-01-09 17:48:58 +02005 * An open source application development framework for PHP
Derek Allard2067d1a2008-11-13 22:59:24 +00006 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +02007 * This content is released under the MIT License (MIT)
Eric Barnescde712c2011-12-09 11:27:51 -05008 *
Andrey Andreev125ef472016-01-11 12:33:00 +02009 * Copyright (c) 2014 - 2016, British Columbia Institute of Technology
Eric Barnescde712c2011-12-09 11:27:51 -050010 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020011 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
Derek Jonesf4a4bd82011-10-20 12:18:42 -050017 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020018 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 * THE SOFTWARE.
28 *
29 * @package CodeIgniter
30 * @author EllisLab Dev Team
Andrey Andreev1924e872016-01-11 12:55:34 +020031 * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
Andrey Andreev125ef472016-01-11 12:33:00 +020032 * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/)
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020033 * @license http://opensource.org/licenses/MIT MIT License
Andrey Andreevbd202c92016-01-11 12:50:18 +020034 * @link https://codeigniter.com
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020035 * @since Version 1.0.0
Derek Allard2067d1a2008-11-13 22:59:24 +000036 * @filesource
37 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020038defined('BASEPATH') OR exit('No direct script access allowed');
Derek Allard2067d1a2008-11-13 22:59:24 +000039
Derek Allard2067d1a2008-11-13 22:59:24 +000040/**
41 * CodeIgniter Inflector Helpers
42 *
43 * @package CodeIgniter
44 * @subpackage Helpers
45 * @category Helpers
Derek Jonesf4a4bd82011-10-20 12:18:42 -050046 * @author EllisLab Dev Team
Andrey Andreevbd202c92016-01-11 12:50:18 +020047 * @link https://codeigniter.com/user_guide/helpers/inflector_helper.html
Derek Allard2067d1a2008-11-13 22:59:24 +000048 */
49
Derek Allard2067d1a2008-11-13 22:59:24 +000050// --------------------------------------------------------------------
51
Derek Allard2067d1a2008-11-13 22:59:24 +000052if ( ! function_exists('singular'))
Barry Mienydd671972010-10-04 16:33:58 +020053{
Timothy Warrenb75faa12012-04-27 12:03:32 -040054 /**
55 * Singular
56 *
57 * Takes a plural word and makes it singular
58 *
Andrey Andreev53b8ef52012-11-08 21:38:53 +020059 * @param string $str Input string
Timothy Warren16642c72012-05-17 08:20:16 -040060 * @return string
Timothy Warrenb75faa12012-04-27 12:03:32 -040061 */
Derek Allard2067d1a2008-11-13 22:59:24 +000062 function singular($str)
63 {
Phil Sturgeon50e57bc2011-08-13 10:26:04 -060064 $result = strval($str);
Barry Mienydd671972010-10-04 16:33:58 +020065
Phil Sturgeon002b4be2012-02-29 12:12:49 +000066 if ( ! is_countable($result))
67 {
68 return $result;
69 }
Andrey Andreev52a31ba2012-03-10 15:38:49 +020070
Phil Sturgeon50e57bc2011-08-13 10:26:04 -060071 $singular_rules = array(
Andrey Andreev838a9d62012-12-03 14:37:47 +020072 '/(matr)ices$/' => '\1ix',
73 '/(vert|ind)ices$/' => '\1ex',
74 '/^(ox)en/' => '\1',
75 '/(alias)es$/' => '\1',
76 '/([octop|vir])i$/' => '\1us',
77 '/(cris|ax|test)es$/' => '\1is',
78 '/(shoe)s$/' => '\1',
79 '/(o)es$/' => '\1',
80 '/(bus|campus)es$/' => '\1',
81 '/([m|l])ice$/' => '\1ouse',
82 '/(x|ch|ss|sh)es$/' => '\1',
83 '/(m)ovies$/' => '\1\2ovie',
84 '/(s)eries$/' => '\1\2eries',
85 '/([^aeiouy]|qu)ies$/' => '\1y',
86 '/([lr])ves$/' => '\1f',
87 '/(tive)s$/' => '\1',
88 '/(hive)s$/' => '\1',
89 '/([^f])ves$/' => '\1fe',
90 '/(^analy)ses$/' => '\1sis',
Phil Sturgeon50e57bc2011-08-13 10:26:04 -060091 '/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/' => '\1\2sis',
Andrey Andreev838a9d62012-12-03 14:37:47 +020092 '/([ti])a$/' => '\1um',
93 '/(p)eople$/' => '\1\2erson',
94 '/(m)en$/' => '\1an',
95 '/(s)tatuses$/' => '\1\2tatus',
96 '/(c)hildren$/' => '\1\2hild',
97 '/(n)ews$/' => '\1\2ews',
98 '/([^us])s$/' => '\1'
Phil Sturgeon50e57bc2011-08-13 10:26:04 -060099 );
Eric Barnescde712c2011-12-09 11:27:51 -0500100
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000101 foreach ($singular_rules as $rule => $replacement)
102 {
103 if (preg_match($rule, $result))
104 {
105 $result = preg_replace($rule, $replacement, $result);
106 break;
107 }
108 }
109
110 return $result;
Derek Allard2067d1a2008-11-13 22:59:24 +0000111 }
112}
113
114// --------------------------------------------------------------------
115
Derek Allard2067d1a2008-11-13 22:59:24 +0000116if ( ! function_exists('plural'))
Barry Mienydd671972010-10-04 16:33:58 +0200117{
Timothy Warrenb75faa12012-04-27 12:03:32 -0400118 /**
119 * Plural
120 *
121 * Takes a singular word and makes it plural
122 *
Andrey Andreev53b8ef52012-11-08 21:38:53 +0200123 * @param string $str Input string
Timothy Warren16642c72012-05-17 08:20:16 -0400124 * @return string
Timothy Warrenb75faa12012-04-27 12:03:32 -0400125 */
Andrey Andreev53b8ef52012-11-08 21:38:53 +0200126 function plural($str)
Andrey Andreev52a31ba2012-03-10 15:38:49 +0200127 {
Phil Sturgeon50e57bc2011-08-13 10:26:04 -0600128 $result = strval($str);
Eric Barnescde712c2011-12-09 11:27:51 -0500129
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000130 if ( ! is_countable($result))
131 {
132 return $result;
133 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000134
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000135 $plural_rules = array(
ftwbzhao1a973c32015-04-14 16:59:44 +0800136 '/(quiz)$/' => '\1zes', // quizzes
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000137 '/^(ox)$/' => '\1\2en', // ox
138 '/([m|l])ouse$/' => '\1ice', // mouse, louse
139 '/(matr|vert|ind)ix|ex$/' => '\1ices', // matrix, vertex, index
140 '/(x|ch|ss|sh)$/' => '\1es', // search, switch, fix, box, process, address
141 '/([^aeiouy]|qu)y$/' => '\1ies', // query, ability, agency
142 '/(hive)$/' => '\1s', // archive, hive
143 '/(?:([^f])fe|([lr])f)$/' => '\1\2ves', // half, safe, wife
144 '/sis$/' => 'ses', // basis, diagnosis
145 '/([ti])um$/' => '\1a', // datum, medium
146 '/(p)erson$/' => '\1eople', // person, salesperson
147 '/(m)an$/' => '\1en', // man, woman, spokesman
148 '/(c)hild$/' => '\1hildren', // child
149 '/(buffal|tomat)o$/' => '\1\2oes', // buffalo, tomato
150 '/(bu|campu)s$/' => '\1\2ses', // bus, campus
151 '/(alias|status|virus)$/' => '\1es', // alias
152 '/(octop)us$/' => '\1i', // octopus
153 '/(ax|cris|test)is$/' => '\1es', // axis, crisis
154 '/s$/' => 's', // no change (compatibility)
155 '/$/' => 's',
156 );
Andrey Andreev52a31ba2012-03-10 15:38:49 +0200157
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000158 foreach ($plural_rules as $rule => $replacement)
159 {
160 if (preg_match($rule, $result))
161 {
162 $result = preg_replace($rule, $replacement, $result);
163 break;
164 }
165 }
166
167 return $result;
Derek Allard2067d1a2008-11-13 22:59:24 +0000168 }
169}
170
171// --------------------------------------------------------------------
172
Derek Allard2067d1a2008-11-13 22:59:24 +0000173if ( ! function_exists('camelize'))
Barry Mienydd671972010-10-04 16:33:58 +0200174{
Timothy Warrenb75faa12012-04-27 12:03:32 -0400175 /**
176 * Camelize
177 *
178 * Takes multiple words separated by spaces or underscores and camelizes them
179 *
Andrey Andreev53b8ef52012-11-08 21:38:53 +0200180 * @param string $str Input string
Timothy Warren16642c72012-05-17 08:20:16 -0400181 * @return string
Timothy Warrenb75faa12012-04-27 12:03:32 -0400182 */
Derek Allard2067d1a2008-11-13 22:59:24 +0000183 function camelize($str)
Barry Mienydd671972010-10-04 16:33:58 +0200184 {
Phil Sturgeone40c7632012-03-10 13:05:08 +0000185 return strtolower($str[0]).substr(str_replace(' ', '', ucwords(preg_replace('/[\s_]+/', ' ', $str))), 1);
Derek Allard2067d1a2008-11-13 22:59:24 +0000186 }
187}
188
189// --------------------------------------------------------------------
190
Derek Allard2067d1a2008-11-13 22:59:24 +0000191if ( ! function_exists('underscore'))
192{
Timothy Warrenb75faa12012-04-27 12:03:32 -0400193 /**
194 * Underscore
195 *
196 * Takes multiple words separated by spaces and underscores them
197 *
Andrey Andreev53b8ef52012-11-08 21:38:53 +0200198 * @param string $str Input string
Timothy Warren16642c72012-05-17 08:20:16 -0400199 * @return string
Timothy Warrenb75faa12012-04-27 12:03:32 -0400200 */
Derek Allard2067d1a2008-11-13 22:59:24 +0000201 function underscore($str)
202 {
Andrey Andreev6ce47462014-02-13 03:28:00 +0200203 return preg_replace('/[\s]+/', '_', trim(MB_ENABLED ? mb_strtolower($str) : strtolower($str)));
Derek Allard2067d1a2008-11-13 22:59:24 +0000204 }
205}
206
207// --------------------------------------------------------------------
208
Derek Allard2067d1a2008-11-13 22:59:24 +0000209if ( ! function_exists('humanize'))
Barry Mienydd671972010-10-04 16:33:58 +0200210{
Timothy Warrenb75faa12012-04-27 12:03:32 -0400211 /**
212 * Humanize
213 *
214 * Takes multiple words separated by the separator and changes them to spaces
215 *
Andrey Andreev53b8ef52012-11-08 21:38:53 +0200216 * @param string $str Input string
217 * @param string $separator Input separator
Timothy Warren16642c72012-05-17 08:20:16 -0400218 * @return string
Timothy Warrenb75faa12012-04-27 12:03:32 -0400219 */
Eric Barnescde712c2011-12-09 11:27:51 -0500220 function humanize($str, $separator = '_')
Derek Allard2067d1a2008-11-13 22:59:24 +0000221 {
Ivan Tcholakov9fee9e42016-02-07 21:33:46 +0200222 return ucwords(preg_replace('/['.preg_quote($separator).']+/', ' ', trim(MB_ENABLED ? mb_strtolower($str) : strtolower($str))));
Derek Allard2067d1a2008-11-13 22:59:24 +0000223 }
224}
Barry Mienydd671972010-10-04 16:33:58 +0200225
Timothy Warrenb75faa12012-04-27 12:03:32 -0400226// --------------------------------------------------------------------
227
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000228if ( ! function_exists('is_countable'))
229{
Timothy Warrenb75faa12012-04-27 12:03:32 -0400230 /**
231 * Checks if the given word has a plural version.
232 *
Andrey Andreev53b8ef52012-11-08 21:38:53 +0200233 * @param string $word Word to check
234 * @return bool
Timothy Warrenb75faa12012-04-27 12:03:32 -0400235 */
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000236 function is_countable($word)
237 {
Andrey Andreev6ce47462014-02-13 03:28:00 +0200238 return ! in_array(
239 strtolower($word),
240 array(
Andrey Andreev72705122016-10-11 15:18:40 +0300241 'audio',
242 'bison',
243 'chassis',
244 'compensation',
245 'coreopsis',
246 'data',
247 'deer',
248 'education',
249 'emoji',
250 'equipment',
251 'fish',
252 'furniture',
253 'gold',
254 'information',
255 'knowledge',
256 'love',
257 'rain',
258 'money',
259 'moose',
260 'nutrition',
261 'offspring',
262 'plankton',
263 'pokemon',
264 'police',
265 'rice',
266 'series',
267 'sheep',
268 'species',
269 'swine',
270 'traffic',
Andrey Andreev4c7323e2016-10-28 13:18:17 +0300271 'wheat'
Andrey Andreev6ce47462014-02-13 03:28:00 +0200272 )
273 );
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000274 }
275}