blob: c064d8de470a694c2fe6594d9af705ed45e68566 [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(
241 'equipment', 'information', 'rice', 'money',
242 'species', 'series', 'fish', 'meta'
243 )
244 );
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000245 }
246}