root / snf-cyclades-app / synnefo / ui / static / snf / js / lib / underscore.string.js @ bf926504
History | View | Annotate | Download (13.4 kB)
1 | 8d08f18a | Kostas Papadimitriou | // Underscore.string
|
---|---|---|---|
2 | 8d08f18a | Kostas Papadimitriou | // (c) 2010 Esa-Matti Suuronen <esa-matti aet suuronen dot org>
|
3 | 8d08f18a | Kostas Papadimitriou | // Underscore.strings is freely distributable under the terms of the MIT license.
|
4 | 8d08f18a | Kostas Papadimitriou | // Documentation: https://github.com/edtsech/underscore.string
|
5 | 8d08f18a | Kostas Papadimitriou | // Some code is borrowed from MooTools and Alexandru Marasteanu.
|
6 | 8d08f18a | Kostas Papadimitriou | |
7 | 8d08f18a | Kostas Papadimitriou | // Version 1.1.6
|
8 | 8d08f18a | Kostas Papadimitriou | |
9 | 8d08f18a | Kostas Papadimitriou | |
10 | 8d08f18a | Kostas Papadimitriou | (function(root){
|
11 | 8d08f18a | Kostas Papadimitriou | 'use strict';
|
12 | 8d08f18a | Kostas Papadimitriou | |
13 | 8d08f18a | Kostas Papadimitriou | if (typeof _ != 'undefined') { |
14 | 8d08f18a | Kostas Papadimitriou | var _reverse = _().reverse,
|
15 | 8d08f18a | Kostas Papadimitriou | _include = _.include; |
16 | 8d08f18a | Kostas Papadimitriou | } |
17 | 8d08f18a | Kostas Papadimitriou | |
18 | 8d08f18a | Kostas Papadimitriou | // Defining helper functions.
|
19 | 8d08f18a | Kostas Papadimitriou | |
20 | 8d08f18a | Kostas Papadimitriou | var nativeTrim = String.prototype.trim;
|
21 | 8d08f18a | Kostas Papadimitriou | |
22 | 8d08f18a | Kostas Papadimitriou | var parseNumber = function(source) { return source * 1 || 0; }; |
23 | 8d08f18a | Kostas Papadimitriou | |
24 | 8d08f18a | Kostas Papadimitriou | var strRepeat = function(i, m) { |
25 | 8d08f18a | Kostas Papadimitriou | for (var o = []; m > 0; o[--m] = i); |
26 | 8d08f18a | Kostas Papadimitriou | return o.join(''); |
27 | 8d08f18a | Kostas Papadimitriou | }; |
28 | 8d08f18a | Kostas Papadimitriou | |
29 | 8d08f18a | Kostas Papadimitriou | var slice = function(a){ |
30 | 8d08f18a | Kostas Papadimitriou | return Array.prototype.slice.call(a);
|
31 | 8d08f18a | Kostas Papadimitriou | }; |
32 | 8d08f18a | Kostas Papadimitriou | |
33 | 8d08f18a | Kostas Papadimitriou | var defaultToWhiteSpace = function(characters){ |
34 | 8d08f18a | Kostas Papadimitriou | if (characters) {
|
35 | 8d08f18a | Kostas Papadimitriou | return _s.escapeRegExp(characters);
|
36 | 8d08f18a | Kostas Papadimitriou | } |
37 | 8d08f18a | Kostas Papadimitriou | return '\\s'; |
38 | 8d08f18a | Kostas Papadimitriou | }; |
39 | 8d08f18a | Kostas Papadimitriou | |
40 | 8d08f18a | Kostas Papadimitriou | var sArgs = function(method){ |
41 | 8d08f18a | Kostas Papadimitriou | return function(){ |
42 | 8d08f18a | Kostas Papadimitriou | var args = slice(arguments); |
43 | 8d08f18a | Kostas Papadimitriou | for(var i=0; i<args.length; i++) |
44 | 8d08f18a | Kostas Papadimitriou | args[i] = args[i] == null ? '' : '' + args[i]; |
45 | 8d08f18a | Kostas Papadimitriou | return method.apply(null, args); |
46 | 8d08f18a | Kostas Papadimitriou | }; |
47 | 8d08f18a | Kostas Papadimitriou | }; |
48 | 8d08f18a | Kostas Papadimitriou | |
49 | 8d08f18a | Kostas Papadimitriou | // sprintf() for JavaScript 0.7-beta1
|
50 | 8d08f18a | Kostas Papadimitriou | // http://www.diveintojavascript.com/projects/javascript-sprintf
|
51 | 8d08f18a | Kostas Papadimitriou | //
|
52 | 8d08f18a | Kostas Papadimitriou | // Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>
|
53 | 8d08f18a | Kostas Papadimitriou | // All rights reserved.
|
54 | 8d08f18a | Kostas Papadimitriou | |
55 | 8d08f18a | Kostas Papadimitriou | var sprintf = (function() { |
56 | 8d08f18a | Kostas Papadimitriou | function get_type(variable) { |
57 | 8d08f18a | Kostas Papadimitriou | return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase(); |
58 | 8d08f18a | Kostas Papadimitriou | } |
59 | 8d08f18a | Kostas Papadimitriou | |
60 | 8d08f18a | Kostas Papadimitriou | var str_repeat = strRepeat;
|
61 | 8d08f18a | Kostas Papadimitriou | |
62 | 8d08f18a | Kostas Papadimitriou | var str_format = function() { |
63 | 8d08f18a | Kostas Papadimitriou | if (!str_format.cache.hasOwnProperty(arguments[0])) { |
64 | 8d08f18a | Kostas Papadimitriou | str_format.cache[arguments[0]] = str_format.parse(arguments[0]); |
65 | 8d08f18a | Kostas Papadimitriou | } |
66 | 8d08f18a | Kostas Papadimitriou | return str_format.format.call(null, str_format.cache[arguments[0]], arguments); |
67 | 8d08f18a | Kostas Papadimitriou | }; |
68 | 8d08f18a | Kostas Papadimitriou | |
69 | 8d08f18a | Kostas Papadimitriou | str_format.format = function(parse_tree, argv) { |
70 | 8d08f18a | Kostas Papadimitriou | var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length; |
71 | 8d08f18a | Kostas Papadimitriou | for (i = 0; i < tree_length; i++) { |
72 | 8d08f18a | Kostas Papadimitriou | node_type = get_type(parse_tree[i]); |
73 | 8d08f18a | Kostas Papadimitriou | if (node_type === 'string') { |
74 | 8d08f18a | Kostas Papadimitriou | output.push(parse_tree[i]); |
75 | 8d08f18a | Kostas Papadimitriou | } |
76 | 8d08f18a | Kostas Papadimitriou | else if (node_type === 'array') { |
77 | 8d08f18a | Kostas Papadimitriou | match = parse_tree[i]; // convenience purposes only
|
78 | 8d08f18a | Kostas Papadimitriou | if (match[2]) { // keyword argument |
79 | 8d08f18a | Kostas Papadimitriou | arg = argv[cursor]; |
80 | 8d08f18a | Kostas Papadimitriou | for (k = 0; k < match[2].length; k++) { |
81 | 8d08f18a | Kostas Papadimitriou | if (!arg.hasOwnProperty(match[2][k])) { |
82 | 8d08f18a | Kostas Papadimitriou | throw(sprintf('[_.sprintf] property "%s" does not exist', match[2][k])); |
83 | 8d08f18a | Kostas Papadimitriou | } |
84 | 8d08f18a | Kostas Papadimitriou | arg = arg[match[2][k]];
|
85 | 8d08f18a | Kostas Papadimitriou | } |
86 | 8d08f18a | Kostas Papadimitriou | } else if (match[1]) { // positional argument (explicit) |
87 | 8d08f18a | Kostas Papadimitriou | arg = argv[match[1]];
|
88 | 8d08f18a | Kostas Papadimitriou | } |
89 | 8d08f18a | Kostas Papadimitriou | else { // positional argument (implicit) |
90 | 8d08f18a | Kostas Papadimitriou | arg = argv[cursor++]; |
91 | 8d08f18a | Kostas Papadimitriou | } |
92 | 8d08f18a | Kostas Papadimitriou | |
93 | 8d08f18a | Kostas Papadimitriou | if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) { |
94 | 8d08f18a | Kostas Papadimitriou | throw(sprintf('[_.sprintf] expecting number but found %s', get_type(arg))); |
95 | 8d08f18a | Kostas Papadimitriou | } |
96 | 8d08f18a | Kostas Papadimitriou | switch (match[8]) { |
97 | 8d08f18a | Kostas Papadimitriou | case 'b': arg = arg.toString(2); break; |
98 | 8d08f18a | Kostas Papadimitriou | case 'c': arg = String.fromCharCode(arg); break; |
99 | 8d08f18a | Kostas Papadimitriou | case 'd': arg = parseInt(arg, 10); break; |
100 | 8d08f18a | Kostas Papadimitriou | case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break; |
101 | 8d08f18a | Kostas Papadimitriou | case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break; |
102 | 8d08f18a | Kostas Papadimitriou | case 'o': arg = arg.toString(8); break; |
103 | 8d08f18a | Kostas Papadimitriou | case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break; |
104 | 8d08f18a | Kostas Papadimitriou | case 'u': arg = Math.abs(arg); break; |
105 | 8d08f18a | Kostas Papadimitriou | case 'x': arg = arg.toString(16); break; |
106 | 8d08f18a | Kostas Papadimitriou | case 'X': arg = arg.toString(16).toUpperCase(); break; |
107 | 8d08f18a | Kostas Papadimitriou | } |
108 | 8d08f18a | Kostas Papadimitriou | arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg); |
109 | 8d08f18a | Kostas Papadimitriou | pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '; |
110 | 8d08f18a | Kostas Papadimitriou | pad_length = match[6] - String(arg).length;
|
111 | 8d08f18a | Kostas Papadimitriou | pad = match[6] ? str_repeat(pad_character, pad_length) : ''; |
112 | 8d08f18a | Kostas Papadimitriou | output.push(match[5] ? arg + pad : pad + arg);
|
113 | 8d08f18a | Kostas Papadimitriou | } |
114 | 8d08f18a | Kostas Papadimitriou | } |
115 | 8d08f18a | Kostas Papadimitriou | return output.join(''); |
116 | 8d08f18a | Kostas Papadimitriou | }; |
117 | 8d08f18a | Kostas Papadimitriou | |
118 | 8d08f18a | Kostas Papadimitriou | str_format.cache = {}; |
119 | 8d08f18a | Kostas Papadimitriou | |
120 | 8d08f18a | Kostas Papadimitriou | str_format.parse = function(fmt) { |
121 | 8d08f18a | Kostas Papadimitriou | var _fmt = fmt, match = [], parse_tree = [], arg_names = 0; |
122 | 8d08f18a | Kostas Papadimitriou | while (_fmt) {
|
123 | 8d08f18a | Kostas Papadimitriou | if ((match = /^[^\x25]+/.exec(_fmt)) !== null) { |
124 | 8d08f18a | Kostas Papadimitriou | parse_tree.push(match[0]);
|
125 | 8d08f18a | Kostas Papadimitriou | } |
126 | 8d08f18a | Kostas Papadimitriou | else if ((match = /^\x25{2}/.exec(_fmt)) !== null) { |
127 | 8d08f18a | Kostas Papadimitriou | parse_tree.push('%');
|
128 | 8d08f18a | Kostas Papadimitriou | } |
129 | 8d08f18a | Kostas Papadimitriou | else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) { |
130 | 8d08f18a | Kostas Papadimitriou | if (match[2]) { |
131 | 8d08f18a | Kostas Papadimitriou | arg_names |= 1;
|
132 | 8d08f18a | Kostas Papadimitriou | var field_list = [], replacement_field = match[2], field_match = []; |
133 | 8d08f18a | Kostas Papadimitriou | if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { |
134 | 8d08f18a | Kostas Papadimitriou | field_list.push(field_match[1]);
|
135 | 8d08f18a | Kostas Papadimitriou | while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { |
136 | 8d08f18a | Kostas Papadimitriou | if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { |
137 | 8d08f18a | Kostas Papadimitriou | field_list.push(field_match[1]);
|
138 | 8d08f18a | Kostas Papadimitriou | } |
139 | 8d08f18a | Kostas Papadimitriou | else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) { |
140 | 8d08f18a | Kostas Papadimitriou | field_list.push(field_match[1]);
|
141 | 8d08f18a | Kostas Papadimitriou | } |
142 | 8d08f18a | Kostas Papadimitriou | else {
|
143 | 8d08f18a | Kostas Papadimitriou | throw('[_.sprintf] huh?'); |
144 | 8d08f18a | Kostas Papadimitriou | } |
145 | 8d08f18a | Kostas Papadimitriou | } |
146 | 8d08f18a | Kostas Papadimitriou | } |
147 | 8d08f18a | Kostas Papadimitriou | else {
|
148 | 8d08f18a | Kostas Papadimitriou | throw('[_.sprintf] huh?'); |
149 | 8d08f18a | Kostas Papadimitriou | } |
150 | 8d08f18a | Kostas Papadimitriou | match[2] = field_list;
|
151 | 8d08f18a | Kostas Papadimitriou | } |
152 | 8d08f18a | Kostas Papadimitriou | else {
|
153 | 8d08f18a | Kostas Papadimitriou | arg_names |= 2;
|
154 | 8d08f18a | Kostas Papadimitriou | } |
155 | 8d08f18a | Kostas Papadimitriou | if (arg_names === 3) { |
156 | 8d08f18a | Kostas Papadimitriou | throw('[_.sprintf] mixing positional and named placeholders is not (yet) supported'); |
157 | 8d08f18a | Kostas Papadimitriou | } |
158 | 8d08f18a | Kostas Papadimitriou | parse_tree.push(match); |
159 | 8d08f18a | Kostas Papadimitriou | } |
160 | 8d08f18a | Kostas Papadimitriou | else {
|
161 | 8d08f18a | Kostas Papadimitriou | throw('[_.sprintf] huh?'); |
162 | 8d08f18a | Kostas Papadimitriou | } |
163 | 8d08f18a | Kostas Papadimitriou | _fmt = _fmt.substring(match[0].length);
|
164 | 8d08f18a | Kostas Papadimitriou | } |
165 | 8d08f18a | Kostas Papadimitriou | return parse_tree;
|
166 | 8d08f18a | Kostas Papadimitriou | }; |
167 | 8d08f18a | Kostas Papadimitriou | |
168 | 8d08f18a | Kostas Papadimitriou | return str_format;
|
169 | 8d08f18a | Kostas Papadimitriou | })(); |
170 | 8d08f18a | Kostas Papadimitriou | |
171 | 8d08f18a | Kostas Papadimitriou | |
172 | 8d08f18a | Kostas Papadimitriou | |
173 | 8d08f18a | Kostas Papadimitriou | // Defining underscore.string
|
174 | 8d08f18a | Kostas Papadimitriou | |
175 | 8d08f18a | Kostas Papadimitriou | var _s = {
|
176 | 8d08f18a | Kostas Papadimitriou | |
177 | 8d08f18a | Kostas Papadimitriou | isBlank: sArgs(function(str){ |
178 | 8d08f18a | Kostas Papadimitriou | return (/^\s*$/).test(str); |
179 | 8d08f18a | Kostas Papadimitriou | }), |
180 | 8d08f18a | Kostas Papadimitriou | |
181 | 8d08f18a | Kostas Papadimitriou | stripTags: sArgs(function(str){ |
182 | 8d08f18a | Kostas Papadimitriou | return str.replace(/<\/?[^>]+>/ig, ''); |
183 | 8d08f18a | Kostas Papadimitriou | }), |
184 | 8d08f18a | Kostas Papadimitriou | |
185 | 8d08f18a | Kostas Papadimitriou | capitalize : sArgs(function(str) { |
186 | 8d08f18a | Kostas Papadimitriou | return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase(); |
187 | 8d08f18a | Kostas Papadimitriou | }), |
188 | 8d08f18a | Kostas Papadimitriou | |
189 | 8d08f18a | Kostas Papadimitriou | chop: sArgs(function(str, step){ |
190 | 8d08f18a | Kostas Papadimitriou | step = parseNumber(step) || str.length; |
191 | 8d08f18a | Kostas Papadimitriou | var arr = [];
|
192 | 8d08f18a | Kostas Papadimitriou | for (var i = 0; i < str.length;) { |
193 | 8d08f18a | Kostas Papadimitriou | arr.push(str.slice(i,i + step)); |
194 | 8d08f18a | Kostas Papadimitriou | i = i + step; |
195 | 8d08f18a | Kostas Papadimitriou | } |
196 | 8d08f18a | Kostas Papadimitriou | return arr;
|
197 | 8d08f18a | Kostas Papadimitriou | }), |
198 | 8d08f18a | Kostas Papadimitriou | |
199 | 8d08f18a | Kostas Papadimitriou | clean: sArgs(function(str){ |
200 | 8d08f18a | Kostas Papadimitriou | return _s.strip(str.replace(/\s+/g, ' ')); |
201 | 8d08f18a | Kostas Papadimitriou | }), |
202 | 8d08f18a | Kostas Papadimitriou | |
203 | 8d08f18a | Kostas Papadimitriou | count: sArgs(function(str, substr){ |
204 | 8d08f18a | Kostas Papadimitriou | var count = 0, index; |
205 | 8d08f18a | Kostas Papadimitriou | for (var i=0; i < str.length;) { |
206 | 8d08f18a | Kostas Papadimitriou | index = str.indexOf(substr, i); |
207 | 8d08f18a | Kostas Papadimitriou | index >= 0 && count++;
|
208 | 8d08f18a | Kostas Papadimitriou | i = i + (index >= 0 ? index : 0) + substr.length; |
209 | 8d08f18a | Kostas Papadimitriou | } |
210 | 8d08f18a | Kostas Papadimitriou | return count;
|
211 | 8d08f18a | Kostas Papadimitriou | }), |
212 | 8d08f18a | Kostas Papadimitriou | |
213 | 8d08f18a | Kostas Papadimitriou | chars: sArgs(function(str) { |
214 | 8d08f18a | Kostas Papadimitriou | return str.split(''); |
215 | 8d08f18a | Kostas Papadimitriou | }), |
216 | 8d08f18a | Kostas Papadimitriou | |
217 | 8d08f18a | Kostas Papadimitriou | escapeHTML: sArgs(function(str) { |
218 | 8d08f18a | Kostas Papadimitriou | return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') |
219 | 8d08f18a | Kostas Papadimitriou | .replace(/"/g, '"').replace(/'/g, "'"); |
220 | 8d08f18a | Kostas Papadimitriou | }), |
221 | 8d08f18a | Kostas Papadimitriou | |
222 | 8d08f18a | Kostas Papadimitriou | unescapeHTML: sArgs(function(str) { |
223 | 8d08f18a | Kostas Papadimitriou | return str.replace(/</g, '<').replace(/>/g, '>') |
224 | 8d08f18a | Kostas Papadimitriou | .replace(/"/g, '"').replace(/'/g, "'").replace(/&/g, '&'); |
225 | 8d08f18a | Kostas Papadimitriou | }), |
226 | 8d08f18a | Kostas Papadimitriou | |
227 | 8d08f18a | Kostas Papadimitriou | escapeRegExp: sArgs(function(str){ |
228 | 8d08f18a | Kostas Papadimitriou | // From MooTools core 1.2.4
|
229 | 8d08f18a | Kostas Papadimitriou | return str.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); |
230 | 8d08f18a | Kostas Papadimitriou | }), |
231 | 8d08f18a | Kostas Papadimitriou | |
232 | 8d08f18a | Kostas Papadimitriou | insert: sArgs(function(str, i, substr){ |
233 | 8d08f18a | Kostas Papadimitriou | var arr = str.split(''); |
234 | 8d08f18a | Kostas Papadimitriou | arr.splice(parseNumber(i), 0, substr);
|
235 | 8d08f18a | Kostas Papadimitriou | return arr.join(''); |
236 | 8d08f18a | Kostas Papadimitriou | }), |
237 | 8d08f18a | Kostas Papadimitriou | |
238 | 8d08f18a | Kostas Papadimitriou | includes: sArgs(function(str, needle){ |
239 | 8d08f18a | Kostas Papadimitriou | return str.indexOf(needle) !== -1; |
240 | 8d08f18a | Kostas Papadimitriou | }), |
241 | 8d08f18a | Kostas Papadimitriou | |
242 | 8d08f18a | Kostas Papadimitriou | include: function(obj, needle) { |
243 | 8d08f18a | Kostas Papadimitriou | if (!_include || (/string|number/).test(typeof obj)) { |
244 | 8d08f18a | Kostas Papadimitriou | return this.includes(obj, needle); |
245 | 8d08f18a | Kostas Papadimitriou | } else {
|
246 | 8d08f18a | Kostas Papadimitriou | return _include(obj, needle);
|
247 | 8d08f18a | Kostas Papadimitriou | } |
248 | 8d08f18a | Kostas Papadimitriou | }, |
249 | 8d08f18a | Kostas Papadimitriou | |
250 | 8d08f18a | Kostas Papadimitriou | join: sArgs(function(sep) { |
251 | 8d08f18a | Kostas Papadimitriou | var args = slice(arguments); |
252 | 8d08f18a | Kostas Papadimitriou | return args.join(args.shift());
|
253 | 8d08f18a | Kostas Papadimitriou | }), |
254 | 8d08f18a | Kostas Papadimitriou | |
255 | 8d08f18a | Kostas Papadimitriou | lines: sArgs(function(str) { |
256 | 8d08f18a | Kostas Papadimitriou | return str.split("\n"); |
257 | 8d08f18a | Kostas Papadimitriou | }), |
258 | 8d08f18a | Kostas Papadimitriou | |
259 | 8d08f18a | Kostas Papadimitriou | reverse: function(obj){ |
260 | 8d08f18a | Kostas Papadimitriou | if (!_reverse || (/string|number/).test(typeof obj)) { |
261 | 8d08f18a | Kostas Papadimitriou | return Array.prototype.reverse.apply(String(obj).split('')).join(''); |
262 | 8d08f18a | Kostas Papadimitriou | } else {
|
263 | 8d08f18a | Kostas Papadimitriou | return _reverse.call(_(obj));
|
264 | 8d08f18a | Kostas Papadimitriou | } |
265 | 8d08f18a | Kostas Papadimitriou | }, |
266 | 8d08f18a | Kostas Papadimitriou | |
267 | 8d08f18a | Kostas Papadimitriou | splice: sArgs(function(str, i, howmany, substr){ |
268 | 8d08f18a | Kostas Papadimitriou | var arr = str.split(''); |
269 | 8d08f18a | Kostas Papadimitriou | arr.splice(parseNumber(i), parseNumber(howmany), substr); |
270 | 8d08f18a | Kostas Papadimitriou | return arr.join(''); |
271 | 8d08f18a | Kostas Papadimitriou | }), |
272 | 8d08f18a | Kostas Papadimitriou | |
273 | 8d08f18a | Kostas Papadimitriou | startsWith: sArgs(function(str, starts){ |
274 | 8d08f18a | Kostas Papadimitriou | return str.length >= starts.length && str.substring(0, starts.length) === starts; |
275 | 8d08f18a | Kostas Papadimitriou | }), |
276 | 8d08f18a | Kostas Papadimitriou | |
277 | 8d08f18a | Kostas Papadimitriou | endsWith: sArgs(function(str, ends){ |
278 | 8d08f18a | Kostas Papadimitriou | return str.length >= ends.length && str.substring(str.length - ends.length) === ends;
|
279 | 8d08f18a | Kostas Papadimitriou | }), |
280 | 8d08f18a | Kostas Papadimitriou | |
281 | 8d08f18a | Kostas Papadimitriou | succ: sArgs(function(str){ |
282 | 8d08f18a | Kostas Papadimitriou | var arr = str.split(''); |
283 | 8d08f18a | Kostas Papadimitriou | arr.splice(str.length-1, 1, String.fromCharCode(str.charCodeAt(str.length-1) + 1)); |
284 | 8d08f18a | Kostas Papadimitriou | return arr.join(''); |
285 | 8d08f18a | Kostas Papadimitriou | }), |
286 | 8d08f18a | Kostas Papadimitriou | |
287 | 8d08f18a | Kostas Papadimitriou | titleize: sArgs(function(str){ |
288 | 8d08f18a | Kostas Papadimitriou | var arr = str.split(' '), |
289 | 8d08f18a | Kostas Papadimitriou | word; |
290 | 8d08f18a | Kostas Papadimitriou | for (var i=0; i < arr.length; i++) { |
291 | 8d08f18a | Kostas Papadimitriou | word = arr[i].split('');
|
292 | 8d08f18a | Kostas Papadimitriou | if(typeof word[0] !== 'undefined') word[0] = word[0].toUpperCase(); |
293 | 8d08f18a | Kostas Papadimitriou | i+1 === arr.length ? arr[i] = word.join('') : arr[i] = word.join('') + ' '; |
294 | 8d08f18a | Kostas Papadimitriou | } |
295 | 8d08f18a | Kostas Papadimitriou | return arr.join(''); |
296 | 8d08f18a | Kostas Papadimitriou | }), |
297 | 8d08f18a | Kostas Papadimitriou | |
298 | 8d08f18a | Kostas Papadimitriou | camelize: sArgs(function(str){ |
299 | 8d08f18a | Kostas Papadimitriou | return _s.trim(str).replace(/(\-|_|\s)+(.)?/g, function(match, separator, chr) { |
300 | 8d08f18a | Kostas Papadimitriou | return chr ? chr.toUpperCase() : ''; |
301 | 8d08f18a | Kostas Papadimitriou | }); |
302 | 8d08f18a | Kostas Papadimitriou | }), |
303 | 8d08f18a | Kostas Papadimitriou | |
304 | 8d08f18a | Kostas Papadimitriou | underscored: function(str){ |
305 | 8d08f18a | Kostas Papadimitriou | return _s.trim(str).replace(/([a-z\d])([A-Z]+)/g, '$1_$2').replace(/\-|\s+/g, '_').toLowerCase(); |
306 | 8d08f18a | Kostas Papadimitriou | }, |
307 | 8d08f18a | Kostas Papadimitriou | |
308 | 8d08f18a | Kostas Papadimitriou | dasherize: function(str){ |
309 | 8d08f18a | Kostas Papadimitriou | return _s.trim(str).replace(/([a-z\d])([A-Z]+)/g, '$1-$2').replace(/^([A-Z]+)/, '-$1').replace(/\_|\s+/g, '-').toLowerCase(); |
310 | 8d08f18a | Kostas Papadimitriou | }, |
311 | 8d08f18a | Kostas Papadimitriou | |
312 | 8d08f18a | Kostas Papadimitriou | trim: sArgs(function(str, characters){ |
313 | 8d08f18a | Kostas Papadimitriou | if (!characters && nativeTrim) {
|
314 | 8d08f18a | Kostas Papadimitriou | return nativeTrim.call(str);
|
315 | 8d08f18a | Kostas Papadimitriou | } |
316 | 8d08f18a | Kostas Papadimitriou | characters = defaultToWhiteSpace(characters); |
317 | 8d08f18a | Kostas Papadimitriou | return str.replace(new RegExp('\^[' + characters + ']+|[' + characters + ']+$', 'g'), ''); |
318 | 8d08f18a | Kostas Papadimitriou | }), |
319 | 8d08f18a | Kostas Papadimitriou | |
320 | 8d08f18a | Kostas Papadimitriou | ltrim: sArgs(function(str, characters){ |
321 | 8d08f18a | Kostas Papadimitriou | characters = defaultToWhiteSpace(characters); |
322 | 8d08f18a | Kostas Papadimitriou | return str.replace(new RegExp('\^[' + characters + ']+', 'g'), ''); |
323 | 8d08f18a | Kostas Papadimitriou | }), |
324 | 8d08f18a | Kostas Papadimitriou | |
325 | 8d08f18a | Kostas Papadimitriou | rtrim: sArgs(function(str, characters){ |
326 | 8d08f18a | Kostas Papadimitriou | characters = defaultToWhiteSpace(characters); |
327 | 8d08f18a | Kostas Papadimitriou | return str.replace(new RegExp('[' + characters + ']+$', 'g'), ''); |
328 | 8d08f18a | Kostas Papadimitriou | }), |
329 | 8d08f18a | Kostas Papadimitriou | |
330 | 8d08f18a | Kostas Papadimitriou | truncate: sArgs(function(str, length, truncateStr){ |
331 | 8d08f18a | Kostas Papadimitriou | truncateStr = truncateStr || '...';
|
332 | 8d08f18a | Kostas Papadimitriou | length = parseNumber(length); |
333 | 8d08f18a | Kostas Papadimitriou | return str.length > length ? str.slice(0,length) + truncateStr : str; |
334 | 8d08f18a | Kostas Papadimitriou | }), |
335 | 8d08f18a | Kostas Papadimitriou | |
336 | 8d08f18a | Kostas Papadimitriou | words: function(str, delimiter) { |
337 | 8d08f18a | Kostas Papadimitriou | return String(str).split(delimiter || " "); |
338 | 8d08f18a | Kostas Papadimitriou | }, |
339 | 8d08f18a | Kostas Papadimitriou | |
340 | 8d08f18a | Kostas Papadimitriou | pad: sArgs(function(str, length, padStr, type) { |
341 | 8d08f18a | Kostas Papadimitriou | var padding = '', |
342 | 8d08f18a | Kostas Papadimitriou | padlen = 0;
|
343 | 8d08f18a | Kostas Papadimitriou | |
344 | 8d08f18a | Kostas Papadimitriou | length = parseNumber(length); |
345 | 8d08f18a | Kostas Papadimitriou | |
346 | 8d08f18a | Kostas Papadimitriou | if (!padStr) { padStr = ' '; } |
347 | 8d08f18a | Kostas Papadimitriou | else if (padStr.length > 1) { padStr = padStr.charAt(0); } |
348 | 8d08f18a | Kostas Papadimitriou | switch(type) {
|
349 | 8d08f18a | Kostas Papadimitriou | case 'right': |
350 | 8d08f18a | Kostas Papadimitriou | padlen = (length - str.length); |
351 | 8d08f18a | Kostas Papadimitriou | padding = strRepeat(padStr, padlen); |
352 | 8d08f18a | Kostas Papadimitriou | str = str+padding; |
353 | 8d08f18a | Kostas Papadimitriou | break;
|
354 | 8d08f18a | Kostas Papadimitriou | case 'both': |
355 | 8d08f18a | Kostas Papadimitriou | padlen = (length - str.length); |
356 | 8d08f18a | Kostas Papadimitriou | padding = { |
357 | 8d08f18a | Kostas Papadimitriou | 'left' : strRepeat(padStr, Math.ceil(padlen/2)), |
358 | 8d08f18a | Kostas Papadimitriou | 'right': strRepeat(padStr, Math.floor(padlen/2)) |
359 | 8d08f18a | Kostas Papadimitriou | }; |
360 | 8d08f18a | Kostas Papadimitriou | str = padding.left+str+padding.right; |
361 | 8d08f18a | Kostas Papadimitriou | break;
|
362 | 8d08f18a | Kostas Papadimitriou | default: // 'left' |
363 | 8d08f18a | Kostas Papadimitriou | padlen = (length - str.length); |
364 | 8d08f18a | Kostas Papadimitriou | padding = strRepeat(padStr, padlen);; |
365 | 8d08f18a | Kostas Papadimitriou | str = padding+str; |
366 | 8d08f18a | Kostas Papadimitriou | } |
367 | 8d08f18a | Kostas Papadimitriou | return str;
|
368 | 8d08f18a | Kostas Papadimitriou | }), |
369 | 8d08f18a | Kostas Papadimitriou | |
370 | 8d08f18a | Kostas Papadimitriou | lpad: function(str, length, padStr) { |
371 | 8d08f18a | Kostas Papadimitriou | return _s.pad(str, length, padStr);
|
372 | 8d08f18a | Kostas Papadimitriou | }, |
373 | 8d08f18a | Kostas Papadimitriou | |
374 | 8d08f18a | Kostas Papadimitriou | rpad: function(str, length, padStr) { |
375 | 8d08f18a | Kostas Papadimitriou | return _s.pad(str, length, padStr, 'right'); |
376 | 8d08f18a | Kostas Papadimitriou | }, |
377 | 8d08f18a | Kostas Papadimitriou | |
378 | 8d08f18a | Kostas Papadimitriou | lrpad: function(str, length, padStr) { |
379 | 8d08f18a | Kostas Papadimitriou | return _s.pad(str, length, padStr, 'both'); |
380 | 8d08f18a | Kostas Papadimitriou | }, |
381 | 8d08f18a | Kostas Papadimitriou | |
382 | 8d08f18a | Kostas Papadimitriou | sprintf: sprintf,
|
383 | 8d08f18a | Kostas Papadimitriou | |
384 | 8d08f18a | Kostas Papadimitriou | vsprintf: function(fmt, argv){ |
385 | 8d08f18a | Kostas Papadimitriou | argv.unshift(fmt); |
386 | 8d08f18a | Kostas Papadimitriou | return sprintf.apply(null, argv); |
387 | 8d08f18a | Kostas Papadimitriou | }, |
388 | 8d08f18a | Kostas Papadimitriou | |
389 | 8d08f18a | Kostas Papadimitriou | toNumber: function(str, decimals) { |
390 | 8d08f18a | Kostas Papadimitriou | var num = parseNumber(parseNumber(str).toFixed(parseNumber(decimals)));
|
391 | 8d08f18a | Kostas Papadimitriou | return (!(num === 0 && (str !== "0" && str !== 0))) ? num : Number.NaN; |
392 | 8d08f18a | Kostas Papadimitriou | }, |
393 | 8d08f18a | Kostas Papadimitriou | |
394 | 8d08f18a | Kostas Papadimitriou | strRight: sArgs(function(sourceStr, sep){ |
395 | 8d08f18a | Kostas Papadimitriou | var pos = (!sep) ? -1 : sourceStr.indexOf(sep); |
396 | 8d08f18a | Kostas Papadimitriou | return (pos != -1) ? sourceStr.slice(pos+sep.length, sourceStr.length) : sourceStr; |
397 | 8d08f18a | Kostas Papadimitriou | }), |
398 | 8d08f18a | Kostas Papadimitriou | |
399 | 8d08f18a | Kostas Papadimitriou | strRightBack: sArgs(function(sourceStr, sep){ |
400 | 8d08f18a | Kostas Papadimitriou | var pos = (!sep) ? -1 : sourceStr.lastIndexOf(sep); |
401 | 8d08f18a | Kostas Papadimitriou | return (pos != -1) ? sourceStr.slice(pos+sep.length, sourceStr.length) : sourceStr; |
402 | 8d08f18a | Kostas Papadimitriou | }), |
403 | 8d08f18a | Kostas Papadimitriou | |
404 | 8d08f18a | Kostas Papadimitriou | strLeft: sArgs(function(sourceStr, sep){ |
405 | 8d08f18a | Kostas Papadimitriou | var pos = (!sep) ? -1 : sourceStr.indexOf(sep); |
406 | 8d08f18a | Kostas Papadimitriou | return (pos != -1) ? sourceStr.slice(0, pos) : sourceStr; |
407 | 8d08f18a | Kostas Papadimitriou | }), |
408 | 8d08f18a | Kostas Papadimitriou | |
409 | 8d08f18a | Kostas Papadimitriou | strLeftBack: sArgs(function(sourceStr, sep){ |
410 | 8d08f18a | Kostas Papadimitriou | var pos = sourceStr.lastIndexOf(sep);
|
411 | 8d08f18a | Kostas Papadimitriou | return (pos != -1) ? sourceStr.slice(0, pos) : sourceStr; |
412 | 8d08f18a | Kostas Papadimitriou | }) |
413 | 8d08f18a | Kostas Papadimitriou | |
414 | 8d08f18a | Kostas Papadimitriou | }; |
415 | 8d08f18a | Kostas Papadimitriou | |
416 | 8d08f18a | Kostas Papadimitriou | // Aliases
|
417 | 8d08f18a | Kostas Papadimitriou | |
418 | 8d08f18a | Kostas Papadimitriou | _s.strip = _s.trim; |
419 | 8d08f18a | Kostas Papadimitriou | _s.lstrip = _s.ltrim; |
420 | 8d08f18a | Kostas Papadimitriou | _s.rstrip = _s.rtrim; |
421 | 8d08f18a | Kostas Papadimitriou | _s.center = _s.lrpad; |
422 | 8d08f18a | Kostas Papadimitriou | _s.ljust = _s.lpad; |
423 | 8d08f18a | Kostas Papadimitriou | _s.rjust = _s.rpad; |
424 | 8d08f18a | Kostas Papadimitriou | |
425 | 8d08f18a | Kostas Papadimitriou | // CommonJS module is defined
|
426 | 8d08f18a | Kostas Papadimitriou | if (typeof module !== 'undefined' && module.exports) { |
427 | 8d08f18a | Kostas Papadimitriou | // Export module
|
428 | 8d08f18a | Kostas Papadimitriou | module.exports = _s; |
429 | 8d08f18a | Kostas Papadimitriou | |
430 | 8d08f18a | Kostas Papadimitriou | // Integrate with Underscore.js
|
431 | 8d08f18a | Kostas Papadimitriou | } else if (typeof root._ !== 'undefined') { |
432 | 8d08f18a | Kostas Papadimitriou | root._.mixin(_s); |
433 | 8d08f18a | Kostas Papadimitriou | |
434 | 8d08f18a | Kostas Papadimitriou | // Or define it
|
435 | 8d08f18a | Kostas Papadimitriou | } else {
|
436 | 8d08f18a | Kostas Papadimitriou | root._ = _s; |
437 | 8d08f18a | Kostas Papadimitriou | } |
438 | 8d08f18a | Kostas Papadimitriou | |
439 | 8d08f18a | Kostas Papadimitriou | }(this || window)); |