blob: 8ce6713670173931e572af6cb851cbc3988f72ed [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 Andreevfe9309d2015-01-09 17:48:58 +02009 * Copyright (c) 2014 - 2015, 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
darwinel871754a2014-02-11 17:34:57 +010031 * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
Andrey Andreevfe9309d2015-01-09 17:48:58 +020032 * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020033 * @license http://opensource.org/licenses/MIT MIT License
34 * @link http://codeigniter.com
35 * @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
Phil Sturgeon002b4be2012-02-29 12:12:49 +000047 * @link http://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(
136 '/^(ox)$/' => '\1\2en', // ox
137 '/([m|l])ouse$/' => '\1ice', // mouse, louse
138 '/(matr|vert|ind)ix|ex$/' => '\1ices', // matrix, vertex, index
139 '/(x|ch|ss|sh)$/' => '\1es', // search, switch, fix, box, process, address
140 '/([^aeiouy]|qu)y$/' => '\1ies', // query, ability, agency
141 '/(hive)$/' => '\1s', // archive, hive
142 '/(?:([^f])fe|([lr])f)$/' => '\1\2ves', // half, safe, wife
143 '/sis$/' => 'ses', // basis, diagnosis
144 '/([ti])um$/' => '\1a', // datum, medium
145 '/(p)erson$/' => '\1eople', // person, salesperson
146 '/(m)an$/' => '\1en', // man, woman, spokesman
147 '/(c)hild$/' => '\1hildren', // child
148 '/(buffal|tomat)o$/' => '\1\2oes', // buffalo, tomato
149 '/(bu|campu)s$/' => '\1\2ses', // bus, campus
150 '/(alias|status|virus)$/' => '\1es', // alias
151 '/(octop)us$/' => '\1i', // octopus
152 '/(ax|cris|test)is$/' => '\1es', // axis, crisis
153 '/s$/' => 's', // no change (compatibility)
154 '/$/' => 's',
155 );
Andrey Andreev52a31ba2012-03-10 15:38:49 +0200156
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000157 foreach ($plural_rules as $rule => $replacement)
158 {
159 if (preg_match($rule, $result))
160 {
161 $result = preg_replace($rule, $replacement, $result);
162 break;
163 }
164 }
165
166 return $result;
Derek Allard2067d1a2008-11-13 22:59:24 +0000167 }
168}
169
170// --------------------------------------------------------------------
171
Derek Allard2067d1a2008-11-13 22:59:24 +0000172if ( ! function_exists('camelize'))
Barry Mienydd671972010-10-04 16:33:58 +0200173{
Timothy Warrenb75faa12012-04-27 12:03:32 -0400174 /**
175 * Camelize
176 *
177 * Takes multiple words separated by spaces or underscores and camelizes them
178 *
Andrey Andreev53b8ef52012-11-08 21:38:53 +0200179 * @param string $str Input string
Timothy Warren16642c72012-05-17 08:20:16 -0400180 * @return string
Timothy Warrenb75faa12012-04-27 12:03:32 -0400181 */
Derek Allard2067d1a2008-11-13 22:59:24 +0000182 function camelize($str)
Barry Mienydd671972010-10-04 16:33:58 +0200183 {
Phil Sturgeone40c7632012-03-10 13:05:08 +0000184 return strtolower($str[0]).substr(str_replace(' ', '', ucwords(preg_replace('/[\s_]+/', ' ', $str))), 1);
Derek Allard2067d1a2008-11-13 22:59:24 +0000185 }
186}
187
188// --------------------------------------------------------------------
189
Derek Allard2067d1a2008-11-13 22:59:24 +0000190if ( ! function_exists('underscore'))
191{
Timothy Warrenb75faa12012-04-27 12:03:32 -0400192 /**
193 * Underscore
194 *
195 * Takes multiple words separated by spaces and underscores them
196 *
Andrey Andreev53b8ef52012-11-08 21:38:53 +0200197 * @param string $str Input string
Timothy Warren16642c72012-05-17 08:20:16 -0400198 * @return string
Timothy Warrenb75faa12012-04-27 12:03:32 -0400199 */
Derek Allard2067d1a2008-11-13 22:59:24 +0000200 function underscore($str)
201 {
Andrey Andreev6ce47462014-02-13 03:28:00 +0200202 return preg_replace('/[\s]+/', '_', trim(MB_ENABLED ? mb_strtolower($str) : strtolower($str)));
Derek Allard2067d1a2008-11-13 22:59:24 +0000203 }
204}
205
206// --------------------------------------------------------------------
207
Derek Allard2067d1a2008-11-13 22:59:24 +0000208if ( ! function_exists('humanize'))
Barry Mienydd671972010-10-04 16:33:58 +0200209{
Timothy Warrenb75faa12012-04-27 12:03:32 -0400210 /**
211 * Humanize
212 *
213 * Takes multiple words separated by the separator and changes them to spaces
214 *
Andrey Andreev53b8ef52012-11-08 21:38:53 +0200215 * @param string $str Input string
216 * @param string $separator Input separator
Timothy Warren16642c72012-05-17 08:20:16 -0400217 * @return string
Timothy Warrenb75faa12012-04-27 12:03:32 -0400218 */
Eric Barnescde712c2011-12-09 11:27:51 -0500219 function humanize($str, $separator = '_')
Derek Allard2067d1a2008-11-13 22:59:24 +0000220 {
Andrey Andreev6ce47462014-02-13 03:28:00 +0200221 return ucwords(preg_replace('/['.$separator.']+/', ' ', trim(MB_ENABLED ? mb_strtolower($str) : strtolower($str))));
Derek Allard2067d1a2008-11-13 22:59:24 +0000222 }
223}
Barry Mienydd671972010-10-04 16:33:58 +0200224
Timothy Warrenb75faa12012-04-27 12:03:32 -0400225// --------------------------------------------------------------------
226
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000227if ( ! function_exists('is_countable'))
228{
Timothy Warrenb75faa12012-04-27 12:03:32 -0400229 /**
230 * Checks if the given word has a plural version.
231 *
Andrey Andreev53b8ef52012-11-08 21:38:53 +0200232 * @param string $word Word to check
233 * @return bool
Timothy Warrenb75faa12012-04-27 12:03:32 -0400234 */
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000235 function is_countable($word)
236 {
Andrey Andreev6ce47462014-02-13 03:28:00 +0200237 return ! in_array(
238 strtolower($word),
239 array(
240 'equipment', 'information', 'rice', 'money',
241 'species', 'series', 'fish', 'meta'
242 )
243 );
Phil Sturgeon002b4be2012-02-29 12:12:49 +0000244 }
245}
246
Derek Allard2067d1a2008-11-13 22:59:24 +0000247/* End of file inflector_helper.php */
Andrey Andreeve92df332012-03-26 22:44:20 +0300248/* Location: ./system/helpers/inflector_helper.php */