stringjs-rails 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Jesper Josefsson
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # Stringjs::Rails
2
+
3
+ This is a no-frills asset pipeline wrapper for the [String.js Javascript library][1].
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'stringjs-rails'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install stringjs-rails
18
+
19
+ ## Usage
20
+
21
+ Add this line to your manifest:
22
+
23
+ //= require 'string'
24
+
25
+ Or use the minified version:
26
+
27
+ //= require 'string.min'
28
+
29
+ For usage of the library see the [String.js homepage][1].
30
+
31
+ ## Versioning
32
+ Major, minor and patch numbers will match those of String.js. Should bugs be fixed in the gem itself, a fourth version number will be added.
33
+
34
+ ## Contributing
35
+
36
+ 1. Fork it
37
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
38
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
39
+ 4. Push to the branch (`git push origin my-new-feature`)
40
+ 5. Create new Pull Request
41
+
42
+ [1]: http://stringjs.com
@@ -0,0 +1,6 @@
1
+ module Stringjs
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,911 @@
1
+ /*
2
+ string.js - Copyright (C) 2012-2013, JP Richardson <jprichardson@gmail.com>
3
+ */
4
+
5
+ !(function() {
6
+ "use strict";
7
+
8
+ var VERSION = '1.3.0';
9
+
10
+ var ENTITIES = {};
11
+
12
+ function S(s) {
13
+ if (s !== null && s !== undefined) {
14
+ if (typeof s === 'string')
15
+ this.s = s;
16
+ else
17
+ this.s = s.toString();
18
+ } else {
19
+ this.s = s; //null or undefined
20
+ }
21
+
22
+ this.orig = s; //original object, currently only used by toCSV() and toBoolean()
23
+
24
+ if (s !== null && s !== undefined) {
25
+ if (this.__defineGetter__) {
26
+ this.__defineGetter__('length', function() {
27
+ return this.s.length;
28
+ })
29
+ } else {
30
+ this.length = s.length;
31
+ }
32
+ } else {
33
+ this.length = -1;
34
+ }
35
+ }
36
+
37
+ var __nsp = String.prototype;
38
+ var __sp = S.prototype = {
39
+
40
+ between: function(left, right) {
41
+ var s = this.s;
42
+ var startPos = s.indexOf(left);
43
+ var endPos = s.indexOf(right);
44
+ var start = startPos + left.length;
45
+ return new S(endPos > startPos ? s.slice(start, endPos) : "");
46
+ },
47
+
48
+ //# modified slightly from https://github.com/epeli/underscore.string
49
+ camelize: function() {
50
+ var s = this.trim().s.replace(/(\-|_|\s)+(.)?/g, function(mathc, sep, c) {
51
+ return (c ? c.toUpperCase() : '');
52
+ });
53
+ return new S(s);
54
+ },
55
+
56
+ capitalize: function() {
57
+ return new S(this.s.substr(0, 1).toUpperCase() + this.s.substring(1).toLowerCase());
58
+ },
59
+
60
+ charAt: function(index) {
61
+ return this.s.charAt(index);
62
+ },
63
+
64
+ chompLeft: function(prefix) {
65
+ var s = this.s;
66
+ if (s.indexOf(prefix) === 0) {
67
+ s = s.slice(prefix.length);
68
+ return new S(s);
69
+ } else {
70
+ return this;
71
+ }
72
+ },
73
+
74
+ chompRight: function(suffix) {
75
+ if (this.endsWith(suffix)) {
76
+ var s = this.s;
77
+ s = s.slice(0, s.length - suffix.length);
78
+ return new S(s);
79
+ } else {
80
+ return this;
81
+ }
82
+ },
83
+
84
+ //#thanks Google
85
+ collapseWhitespace: function() {
86
+ var s = this.s.replace(/[\s\xa0]+/g, ' ').replace(/^\s+|\s+$/g, '');
87
+ return new S(s);
88
+ },
89
+
90
+ contains: function(ss) {
91
+ return this.s.indexOf(ss) >= 0;
92
+ },
93
+
94
+ //#modified from https://github.com/epeli/underscore.string
95
+ dasherize: function() {
96
+ var s = this.trim().s.replace(/[_\s]+/g, '-').replace(/([A-Z])/g, '-$1').replace(/-+/g, '-').toLowerCase();
97
+ return new S(s);
98
+ },
99
+
100
+ decodeHtmlEntities: function() { //https://github.com/substack/node-ent/blob/master/index.js
101
+ var s = this.s;
102
+ s = s.replace(/&#(\d+);?/g, function (_, code) {
103
+ return String.fromCharCode(code);
104
+ })
105
+ .replace(/&#[xX]([A-Fa-f0-9]+);?/g, function (_, hex) {
106
+ return String.fromCharCode(parseInt(hex, 16));
107
+ })
108
+ .replace(/&([^;\W]+;?)/g, function (m, e) {
109
+ var ee = e.replace(/;$/, '');
110
+ var target = ENTITIES[e] || (e.match(/;$/) && ENTITIES[ee]);
111
+
112
+ if (typeof target === 'number') {
113
+ return String.fromCharCode(target);
114
+ }
115
+ else if (typeof target === 'string') {
116
+ return target;
117
+ }
118
+ else {
119
+ return m;
120
+ }
121
+ })
122
+
123
+ return new S(s);
124
+ },
125
+
126
+ endsWith: function(suffix) {
127
+ var l = this.s.length - suffix.length;
128
+ return l >= 0 && this.s.indexOf(suffix, l) === l;
129
+ },
130
+
131
+ escapeHTML: function() { //from underscore.string
132
+ return new S(this.s.replace(/[&<>"']/g, function(m){ return '&' + reversedEscapeChars[m] + ';'; }));
133
+ },
134
+
135
+ ensureLeft: function(prefix) {
136
+ var s = this.s;
137
+ if (s.indexOf(prefix) === 0) {
138
+ return this;
139
+ } else {
140
+ return new S(prefix + s);
141
+ }
142
+ },
143
+
144
+ ensureRight: function(suffix) {
145
+ var s = this.s;
146
+ if (this.endsWith(suffix)) {
147
+ return this;
148
+ } else {
149
+ return new S(s + suffix);
150
+ }
151
+ },
152
+
153
+ isAlpha: function() {
154
+ return !/[^a-z\xC0-\xFF]/.test(this.s.toLowerCase());
155
+ },
156
+
157
+ isAlphaNumeric: function() {
158
+ return !/[^0-9a-z\xC0-\xFF]/.test(this.s.toLowerCase());
159
+ },
160
+
161
+ isEmpty: function() {
162
+ return this.s === null || this.s === undefined ? true : /^[\s\xa0]*$/.test(this.s);
163
+ },
164
+
165
+ isLower: function() {
166
+ return this.isAlpha() && this.s.toLowerCase() === this.s;
167
+ },
168
+
169
+ isNumeric: function() {
170
+ return !/[^0-9]/.test(this.s);
171
+ },
172
+
173
+ isUpper: function() {
174
+ return this.isAlpha() && this.s.toUpperCase() === this.s;
175
+ },
176
+
177
+ left: function(N) {
178
+ if (N >= 0) {
179
+ var s = this.s.substr(0, N);
180
+ return new S(s);
181
+ } else {
182
+ return this.right(-N);
183
+ }
184
+ },
185
+
186
+ lines: function() {
187
+ var lines = this.s.split('\n')
188
+ for (var i = 0; i < lines.length; ++i) {
189
+ lines[i] = lines[i].replace(/(^\s*|\s*$)/g, '');
190
+ }
191
+ return lines;
192
+ },
193
+
194
+ pad: function(len, ch) { //https://github.com/component/pad
195
+ ch = ch || ' ';
196
+ if (this.s.length >= len) return new S(this.s);
197
+ len = len - this.s.length;
198
+ var left = Array(Math.ceil(len / 2) + 1).join(ch);
199
+ var right = Array(Math.floor(len / 2) + 1).join(ch);
200
+ return new S(left + this.s + right);
201
+ },
202
+
203
+ padLeft: function(len, ch) { //https://github.com/component/pad
204
+ ch = ch || ' ';
205
+ if (this.s.length >= len) return new S(this.s);
206
+ return new S(Array(len - this.s.length + 1).join(ch) + this.s);
207
+ },
208
+
209
+ padRight: function(len, ch) { //https://github.com/component/pad
210
+ ch = ch || ' ';
211
+ if (this.s.length >= len) return new S(this.s);
212
+ return new S(this.s + Array(len - this.s.length + 1).join(ch));
213
+ },
214
+
215
+ parseCSV: function(delimiter, qualifier, escape) { //try to parse no matter what
216
+ delimiter = delimiter || ',';
217
+ escape = escape || '\\'
218
+ if (typeof qualifier == 'undefined')
219
+ qualifier = '"';
220
+
221
+ var i = 0, fieldBuffer = [], fields = [], len = this.s.length, inField = false, self = this;
222
+ var ca = function(i){return self.s.charAt(i)};
223
+
224
+ if (!qualifier)
225
+ inField = true;
226
+
227
+ while (i < len) {
228
+ var current = ca(i);
229
+ switch (current) {
230
+ case qualifier:
231
+ if (!inField) {
232
+ inField = true;
233
+ } else {
234
+ if (ca(i-1) === escape)
235
+ fieldBuffer.push(current);
236
+ else
237
+ inField = false;
238
+ }
239
+ break;
240
+ case delimiter:
241
+ if (inField && qualifier)
242
+ fieldBuffer.push(current);
243
+ else {
244
+ fields.push(fieldBuffer.join(''))
245
+ fieldBuffer.length = 0;
246
+ }
247
+ break;
248
+ case escape:
249
+ if (qualifier)
250
+ if (ca(i+1) !== qualifier)
251
+ fieldBuffer.push(current);
252
+ break;
253
+ default:
254
+ if (inField)
255
+ fieldBuffer.push(current);
256
+ break;
257
+ }
258
+ i += 1;
259
+ }
260
+
261
+ fields.push(fieldBuffer.join(''))
262
+ return fields;
263
+ },
264
+
265
+ replaceAll: function(ss, r) {
266
+ //var s = this.s.replace(new RegExp(ss, 'g'), r);
267
+ var s = this.s.split(ss).join(r)
268
+ return new S(s);
269
+ },
270
+
271
+ right: function(N) {
272
+ if (N >= 0) {
273
+ var s = this.s.substr(this.s.length - N, N);
274
+ return new S(s);
275
+ } else {
276
+ return this.left(-N);
277
+ }
278
+ },
279
+
280
+ slugify: function() {
281
+ var sl = (new S(this.s.replace(/[^\w\s-]/g, '').toLowerCase())).dasherize().s;
282
+ if (sl.charAt(0) === '-')
283
+ sl = sl.substr(1);
284
+ return new S(sl);
285
+ },
286
+
287
+ startsWith: function(prefix) {
288
+ return this.s.lastIndexOf(prefix, 0) === 0;
289
+ },
290
+
291
+ stripPunctuation: function() {
292
+ //return new S(this.s.replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()]/g,""));
293
+ return new S(this.s.replace(/[^\w\s]|_/g, "").replace(/\s+/g, " "));
294
+ },
295
+
296
+ stripTags: function() { //from sugar.js
297
+ var s = this.s, args = arguments.length > 0 ? arguments : [''];
298
+ multiArgs(args, function(tag) {
299
+ s = s.replace(RegExp('<\/?' + tag + '[^<>]*>', 'gi'), '');
300
+ });
301
+ return new S(s);
302
+ },
303
+
304
+ template: function(values, opening, closing) {
305
+ var s = this.s
306
+ var opening = opening || Export.TMPL_OPEN
307
+ var closing = closing || Export.TMPL_CLOSE
308
+ var r = new RegExp(opening + '(.+?)' + closing, 'g')
309
+ //, r = /\{\{(.+?)\}\}/g
310
+ var matches = s.match(r) || [];
311
+
312
+ matches.forEach(function(match) {
313
+ var key = match.substring(opening.length, match.length - closing.length);//chop {{ and }}
314
+ if (values[key])
315
+ s = s.replace(match, values[key]);
316
+ });
317
+ return new S(s);
318
+ },
319
+
320
+ times: function(n) {
321
+ return new S(new Array(n + 1).join(this.s));
322
+ },
323
+
324
+ toBoolean: function() {
325
+ if (typeof this.orig === 'string') {
326
+ var s = this.s.toLowerCase();
327
+ return s === 'true' || s === 'yes' || s === 'on';
328
+ } else
329
+ return this.orig === true || this.orig === 1;
330
+ },
331
+
332
+ toFloat: function(precision) {
333
+ var num = parseFloat(this.s, 10);
334
+ if (precision)
335
+ return parseFloat(num.toFixed(precision));
336
+ else
337
+ return num;
338
+ },
339
+
340
+ toInt: function() { //thanks Google
341
+ // If the string starts with '0x' or '-0x', parse as hex.
342
+ return /^\s*-?0x/i.test(this.s) ? parseInt(this.s, 16) : parseInt(this.s, 10);
343
+ },
344
+
345
+ trim: function() {
346
+ var s;
347
+ if (typeof String.prototype.trim === 'undefined') {
348
+ s = this.s.replace(/(^\s*|\s*$)/g, '');
349
+ } else {
350
+ s = this.s.trim();
351
+ }
352
+ return new S(s);
353
+ },
354
+
355
+ trimLeft: function() {
356
+ var s;
357
+ if (__nsp.trimLeft)
358
+ s = this.s.trimLeft();
359
+ else
360
+ s = this.s.replace(/(^\s*)/g, '');
361
+ return new S(s);
362
+ },
363
+
364
+ trimRight: function() {
365
+ var s;
366
+ if (__nsp.trimRight)
367
+ s = this.s.trimRight();
368
+ else
369
+ s = this.s.replace(/\s+$/, '');
370
+ return new S(s);
371
+ },
372
+
373
+ truncate: function(length, pruneStr) { //from underscore.string, author: github.com/rwz
374
+ var str = this.s;
375
+
376
+ length = ~~length;
377
+ pruneStr = pruneStr || '...';
378
+
379
+ if (str.length <= length) return new S(str);
380
+
381
+ var tmpl = function(c){ return c.toUpperCase() !== c.toLowerCase() ? 'A' : ' '; },
382
+ template = str.slice(0, length+1).replace(/.(?=\W*\w*$)/g, tmpl); // 'Hello, world' -> 'HellAA AAAAA'
383
+
384
+ if (template.slice(template.length-2).match(/\w\w/))
385
+ template = template.replace(/\s*\S+$/, '');
386
+ else
387
+ template = new S(template.slice(0, template.length-1)).trimRight().s;
388
+
389
+ return (template+pruneStr).length > str.length ? new S(str) : new S(str.slice(0, template.length)+pruneStr);
390
+ },
391
+
392
+ toCSV: function() {
393
+ var delim = ',', qualifier = '"', escapeChar = '\\', encloseNumbers = true, keys = false;
394
+ var dataArray = [];
395
+
396
+ function hasVal(it) {
397
+ return it !== null && it !== '';
398
+ }
399
+
400
+ if (typeof arguments[0] === 'object') {
401
+ delim = arguments[0].delimiter || delim;
402
+ delim = arguments[0].separator || delim;
403
+ qualifier = arguments[0].qualifier || qualifier;
404
+ encloseNumbers = !!arguments[0].encloseNumbers;
405
+ escapeChar = arguments[0].escapeChar || escapeChar;
406
+ keys = !!arguments[0].keys;
407
+ } else if (typeof arguments[0] === 'string') {
408
+ delim = arguments[0];
409
+ }
410
+
411
+ if (typeof arguments[1] === 'string')
412
+ qualifier = arguments[1];
413
+
414
+ if (arguments[1] === null)
415
+ qualifier = null;
416
+
417
+ if (this.orig instanceof Array)
418
+ dataArray = this.orig;
419
+ else { //object
420
+ for (var key in this.orig)
421
+ if (this.orig.hasOwnProperty(key))
422
+ if (keys)
423
+ dataArray.push(key);
424
+ else
425
+ dataArray.push(this.orig[key]);
426
+ }
427
+
428
+ var rep = escapeChar + qualifier;
429
+ var buildString = [];
430
+ for (var i = 0; i < dataArray.length; ++i) {
431
+ var shouldQualify = hasVal(qualifier)
432
+ if (typeof dataArray[i] == 'number')
433
+ shouldQualify &= encloseNumbers;
434
+
435
+ if (shouldQualify)
436
+ buildString.push(qualifier);
437
+
438
+ if (dataArray[i] !== null) {
439
+ var d = new S(dataArray[i]).replaceAll(qualifier, rep).s;
440
+ buildString.push(d);
441
+ } else
442
+ buildString.push('')
443
+
444
+ if (shouldQualify)
445
+ buildString.push(qualifier);
446
+
447
+ if (delim)
448
+ buildString.push(delim);
449
+ }
450
+
451
+ //chop last delim
452
+ //console.log(buildString.length)
453
+ buildString.length = buildString.length - 1;
454
+ return new S(buildString.join(''));
455
+ },
456
+
457
+ toString: function() {
458
+ return this.s;
459
+ },
460
+
461
+ //#modified from https://github.com/epeli/underscore.string
462
+ underscore: function() {
463
+ var s = this.trim().s.replace(/([a-z\d])([A-Z]+)/g, '$1_$2').replace(/[-\s]+/g, '_').toLowerCase();
464
+ if ((new S(this.s.charAt(0))).isUpper()) {
465
+ s = '_' + s;
466
+ }
467
+ return new S(s);
468
+ },
469
+
470
+ unescapeHTML: function() { //from underscore.string
471
+ return new S(this.s.replace(/\&([^;]+);/g, function(entity, entityCode){
472
+ var match;
473
+
474
+ if (entityCode in escapeChars) {
475
+ return escapeChars[entityCode];
476
+ } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
477
+ return String.fromCharCode(parseInt(match[1], 16));
478
+ } else if (match = entityCode.match(/^#(\d+)$/)) {
479
+ return String.fromCharCode(~~match[1]);
480
+ } else {
481
+ return entity;
482
+ }
483
+ }));
484
+ },
485
+
486
+ valueOf: function() {
487
+ return this.s.valueOf();
488
+ }
489
+
490
+ }
491
+
492
+ var methodsAdded = [];
493
+ function extendPrototype() {
494
+ for (var name in __sp) {
495
+ (function(name){
496
+ var func = __sp[name];
497
+ if (!__nsp.hasOwnProperty(name)) {
498
+ methodsAdded.push(name);
499
+ __nsp[name] = function() {
500
+ String.prototype.s = this;
501
+ return func.apply(this, arguments);
502
+ }
503
+ }
504
+ })(name);
505
+ }
506
+ }
507
+
508
+ function restorePrototype() {
509
+ for (var i = 0; i < methodsAdded.length; ++i)
510
+ delete String.prototype[methodsAdded[i]];
511
+ methodsAdded.length = 0;
512
+ }
513
+
514
+
515
+ /*************************************
516
+ /* Attach Native JavaScript String Properties
517
+ /*************************************/
518
+
519
+ var nativeProperties = getNativeStringProperties();
520
+ for (var name in nativeProperties) {
521
+ (function(name) {
522
+ var stringProp = __nsp[name];
523
+ if (typeof stringProp == 'function') {
524
+ //console.log(stringProp)
525
+ if (!__sp[name]) {
526
+ if (nativeProperties[name] === 'string') {
527
+ __sp[name] = function() {
528
+ //console.log(name)
529
+ return new S(stringProp.apply(this, arguments));
530
+ }
531
+ } else {
532
+ __sp[name] = stringProp;
533
+ }
534
+ }
535
+ }
536
+ })(name);
537
+ }
538
+
539
+
540
+ /*************************************
541
+ /* Function Aliases
542
+ /*************************************/
543
+
544
+ __sp.repeat = __sp.times;
545
+ __sp.include = __sp.contains;
546
+ __sp.toInteger = __sp.toInt;
547
+ __sp.toBool = __sp.toBoolean;
548
+ __sp.decodeHTMLEntities = __sp.decodeHtmlEntities //ensure consistent casing scheme of 'HTML'
549
+
550
+
551
+ /*************************************
552
+ /* Private Functions
553
+ /*************************************/
554
+
555
+ function getNativeStringProperties() {
556
+ var names = getNativeStringPropertyNames();
557
+ var retObj = {};
558
+
559
+ for (var i = 0; i < names.length; ++i) {
560
+ var name = names[i];
561
+ var func = __nsp[name];
562
+ try {
563
+ var type = typeof func.apply('teststring', []);
564
+ retObj[name] = type;
565
+ } catch (e) {}
566
+ }
567
+ return retObj;
568
+ }
569
+
570
+ function getNativeStringPropertyNames() {
571
+ var results = [];
572
+ if (Object.getOwnPropertyNames) {
573
+ results = Object.getOwnPropertyNames(__nsp);
574
+ results.splice(results.indexOf('valueOf'), 1);
575
+ results.splice(results.indexOf('toString'), 1);
576
+ return results;
577
+ } else { //meant for legacy cruft, this could probably be made more efficient
578
+ var stringNames = {};
579
+ var objectNames = [];
580
+ for (var name in String.prototype)
581
+ stringNames[name] = name;
582
+
583
+ for (var name in Object.prototype)
584
+ delete stringNames[name];
585
+
586
+ //stringNames['toString'] = 'toString'; //this was deleted with the rest of the object names
587
+ for (var name in stringNames) {
588
+ results.push(name);
589
+ }
590
+ return results;
591
+ }
592
+ }
593
+
594
+ function Export(str) {
595
+ return new S(str);
596
+ };
597
+
598
+ //attach exports to StringJSWrapper
599
+ Export.extendPrototype = extendPrototype;
600
+ Export.restorePrototype = restorePrototype;
601
+ Export.VERSION = VERSION;
602
+ Export.TMPL_OPEN = '{{';
603
+ Export.TMPL_CLOSE = '}}';
604
+ Export.ENTITIES = ENTITIES;
605
+
606
+
607
+
608
+ /*************************************
609
+ /* Exports
610
+ /*************************************/
611
+
612
+ if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
613
+ module.exports = Export;
614
+
615
+ } else {
616
+
617
+ if(typeof define === "function" && define.amd) {
618
+ define([], function() {
619
+ return Export;
620
+ });
621
+ } else {
622
+ window.S = Export;
623
+ }
624
+ }
625
+
626
+
627
+ /*************************************
628
+ /* 3rd Party Private Functions
629
+ /*************************************/
630
+
631
+ //from sugar.js
632
+ function multiArgs(args, fn) {
633
+ var result = [], i;
634
+ for(i = 0; i < args.length; i++) {
635
+ result.push(args[i]);
636
+ if(fn) fn.call(args, args[i], i);
637
+ }
638
+ return result;
639
+ }
640
+
641
+ //from underscore.string
642
+ var escapeChars = {
643
+ lt: '<',
644
+ gt: '>',
645
+ quot: '"',
646
+ apos: "'",
647
+ amp: '&'
648
+ };
649
+
650
+ //from underscore.string
651
+ var reversedEscapeChars = {};
652
+ for(var key in escapeChars){ reversedEscapeChars[escapeChars[key]] = key; }
653
+
654
+ ENTITIES = {
655
+ "amp" : "&",
656
+ "gt" : ">",
657
+ "lt" : "<",
658
+ "quot" : "\"",
659
+ "apos" : "'",
660
+ "AElig" : 198,
661
+ "Aacute" : 193,
662
+ "Acirc" : 194,
663
+ "Agrave" : 192,
664
+ "Aring" : 197,
665
+ "Atilde" : 195,
666
+ "Auml" : 196,
667
+ "Ccedil" : 199,
668
+ "ETH" : 208,
669
+ "Eacute" : 201,
670
+ "Ecirc" : 202,
671
+ "Egrave" : 200,
672
+ "Euml" : 203,
673
+ "Iacute" : 205,
674
+ "Icirc" : 206,
675
+ "Igrave" : 204,
676
+ "Iuml" : 207,
677
+ "Ntilde" : 209,
678
+ "Oacute" : 211,
679
+ "Ocirc" : 212,
680
+ "Ograve" : 210,
681
+ "Oslash" : 216,
682
+ "Otilde" : 213,
683
+ "Ouml" : 214,
684
+ "THORN" : 222,
685
+ "Uacute" : 218,
686
+ "Ucirc" : 219,
687
+ "Ugrave" : 217,
688
+ "Uuml" : 220,
689
+ "Yacute" : 221,
690
+ "aacute" : 225,
691
+ "acirc" : 226,
692
+ "aelig" : 230,
693
+ "agrave" : 224,
694
+ "aring" : 229,
695
+ "atilde" : 227,
696
+ "auml" : 228,
697
+ "ccedil" : 231,
698
+ "eacute" : 233,
699
+ "ecirc" : 234,
700
+ "egrave" : 232,
701
+ "eth" : 240,
702
+ "euml" : 235,
703
+ "iacute" : 237,
704
+ "icirc" : 238,
705
+ "igrave" : 236,
706
+ "iuml" : 239,
707
+ "ntilde" : 241,
708
+ "oacute" : 243,
709
+ "ocirc" : 244,
710
+ "ograve" : 242,
711
+ "oslash" : 248,
712
+ "otilde" : 245,
713
+ "ouml" : 246,
714
+ "szlig" : 223,
715
+ "thorn" : 254,
716
+ "uacute" : 250,
717
+ "ucirc" : 251,
718
+ "ugrave" : 249,
719
+ "uuml" : 252,
720
+ "yacute" : 253,
721
+ "yuml" : 255,
722
+ "copy" : 169,
723
+ "reg" : 174,
724
+ "nbsp" : 160,
725
+ "iexcl" : 161,
726
+ "cent" : 162,
727
+ "pound" : 163,
728
+ "curren" : 164,
729
+ "yen" : 165,
730
+ "brvbar" : 166,
731
+ "sect" : 167,
732
+ "uml" : 168,
733
+ "ordf" : 170,
734
+ "laquo" : 171,
735
+ "not" : 172,
736
+ "shy" : 173,
737
+ "macr" : 175,
738
+ "deg" : 176,
739
+ "plusmn" : 177,
740
+ "sup1" : 185,
741
+ "sup2" : 178,
742
+ "sup3" : 179,
743
+ "acute" : 180,
744
+ "micro" : 181,
745
+ "para" : 182,
746
+ "middot" : 183,
747
+ "cedil" : 184,
748
+ "ordm" : 186,
749
+ "raquo" : 187,
750
+ "frac14" : 188,
751
+ "frac12" : 189,
752
+ "frac34" : 190,
753
+ "iquest" : 191,
754
+ "times" : 215,
755
+ "divide" : 247,
756
+ "OElig;" : 338,
757
+ "oelig;" : 339,
758
+ "Scaron;" : 352,
759
+ "scaron;" : 353,
760
+ "Yuml;" : 376,
761
+ "fnof;" : 402,
762
+ "circ;" : 710,
763
+ "tilde;" : 732,
764
+ "Alpha;" : 913,
765
+ "Beta;" : 914,
766
+ "Gamma;" : 915,
767
+ "Delta;" : 916,
768
+ "Epsilon;" : 917,
769
+ "Zeta;" : 918,
770
+ "Eta;" : 919,
771
+ "Theta;" : 920,
772
+ "Iota;" : 921,
773
+ "Kappa;" : 922,
774
+ "Lambda;" : 923,
775
+ "Mu;" : 924,
776
+ "Nu;" : 925,
777
+ "Xi;" : 926,
778
+ "Omicron;" : 927,
779
+ "Pi;" : 928,
780
+ "Rho;" : 929,
781
+ "Sigma;" : 931,
782
+ "Tau;" : 932,
783
+ "Upsilon;" : 933,
784
+ "Phi;" : 934,
785
+ "Chi;" : 935,
786
+ "Psi;" : 936,
787
+ "Omega;" : 937,
788
+ "alpha;" : 945,
789
+ "beta;" : 946,
790
+ "gamma;" : 947,
791
+ "delta;" : 948,
792
+ "epsilon;" : 949,
793
+ "zeta;" : 950,
794
+ "eta;" : 951,
795
+ "theta;" : 952,
796
+ "iota;" : 953,
797
+ "kappa;" : 954,
798
+ "lambda;" : 955,
799
+ "mu;" : 956,
800
+ "nu;" : 957,
801
+ "xi;" : 958,
802
+ "omicron;" : 959,
803
+ "pi;" : 960,
804
+ "rho;" : 961,
805
+ "sigmaf;" : 962,
806
+ "sigma;" : 963,
807
+ "tau;" : 964,
808
+ "upsilon;" : 965,
809
+ "phi;" : 966,
810
+ "chi;" : 967,
811
+ "psi;" : 968,
812
+ "omega;" : 969,
813
+ "thetasym;" : 977,
814
+ "upsih;" : 978,
815
+ "piv;" : 982,
816
+ "ensp;" : 8194,
817
+ "emsp;" : 8195,
818
+ "thinsp;" : 8201,
819
+ "zwnj;" : 8204,
820
+ "zwj;" : 8205,
821
+ "lrm;" : 8206,
822
+ "rlm;" : 8207,
823
+ "ndash;" : 8211,
824
+ "mdash;" : 8212,
825
+ "lsquo;" : 8216,
826
+ "rsquo;" : 8217,
827
+ "sbquo;" : 8218,
828
+ "ldquo;" : 8220,
829
+ "rdquo;" : 8221,
830
+ "bdquo;" : 8222,
831
+ "dagger;" : 8224,
832
+ "Dagger;" : 8225,
833
+ "bull;" : 8226,
834
+ "hellip;" : 8230,
835
+ "permil;" : 8240,
836
+ "prime;" : 8242,
837
+ "Prime;" : 8243,
838
+ "lsaquo;" : 8249,
839
+ "rsaquo;" : 8250,
840
+ "oline;" : 8254,
841
+ "frasl;" : 8260,
842
+ "euro;" : 8364,
843
+ "image;" : 8465,
844
+ "weierp;" : 8472,
845
+ "real;" : 8476,
846
+ "trade;" : 8482,
847
+ "alefsym;" : 8501,
848
+ "larr;" : 8592,
849
+ "uarr;" : 8593,
850
+ "rarr;" : 8594,
851
+ "darr;" : 8595,
852
+ "harr;" : 8596,
853
+ "crarr;" : 8629,
854
+ "lArr;" : 8656,
855
+ "uArr;" : 8657,
856
+ "rArr;" : 8658,
857
+ "dArr;" : 8659,
858
+ "hArr;" : 8660,
859
+ "forall;" : 8704,
860
+ "part;" : 8706,
861
+ "exist;" : 8707,
862
+ "empty;" : 8709,
863
+ "nabla;" : 8711,
864
+ "isin;" : 8712,
865
+ "notin;" : 8713,
866
+ "ni;" : 8715,
867
+ "prod;" : 8719,
868
+ "sum;" : 8721,
869
+ "minus;" : 8722,
870
+ "lowast;" : 8727,
871
+ "radic;" : 8730,
872
+ "prop;" : 8733,
873
+ "infin;" : 8734,
874
+ "ang;" : 8736,
875
+ "and;" : 8743,
876
+ "or;" : 8744,
877
+ "cap;" : 8745,
878
+ "cup;" : 8746,
879
+ "int;" : 8747,
880
+ "there4;" : 8756,
881
+ "sim;" : 8764,
882
+ "cong;" : 8773,
883
+ "asymp;" : 8776,
884
+ "ne;" : 8800,
885
+ "equiv;" : 8801,
886
+ "le;" : 8804,
887
+ "ge;" : 8805,
888
+ "sub;" : 8834,
889
+ "sup;" : 8835,
890
+ "nsub;" : 8836,
891
+ "sube;" : 8838,
892
+ "supe;" : 8839,
893
+ "oplus;" : 8853,
894
+ "otimes;" : 8855,
895
+ "perp;" : 8869,
896
+ "sdot;" : 8901,
897
+ "lceil;" : 8968,
898
+ "rceil;" : 8969,
899
+ "lfloor;" : 8970,
900
+ "rfloor;" : 8971,
901
+ "lang;" : 9001,
902
+ "rang;" : 9002,
903
+ "loz;" : 9674,
904
+ "spades;" : 9824,
905
+ "clubs;" : 9827,
906
+ "hearts;" : 9829,
907
+ "diams;" : 9830
908
+ }
909
+
910
+
911
+ }).call(this);
@@ -0,0 +1,3 @@
1
+ /*
2
+ string.js - Copyright (C) 2012-2013, JP Richardson <jprichardson@gmail.com>
3
+ */!function(){"use strict";function n(e){e!==null&&e!==undefined?typeof e=="string"?this.s=e:this.s=e.toString():this.s=e,this.orig=e,e!==null&&e!==undefined?this.__defineGetter__?this.__defineGetter__("length",function(){return this.s.length}):this.length=e.length:this.length=-1}function o(){for(var e in i)(function(e){var t=i[e];r.hasOwnProperty(e)||(s.push(e),r[e]=function(){return String.prototype.s=this,t.apply(this,arguments)})})(e)}function u(){for(var e=0;e<s.length;++e)delete String.prototype[s[e]];s.length=0}function l(){var e=c(),t={};for(var n=0;n<e.length;++n){var i=e[n],s=r[i];try{var o=typeof s.apply("teststring",[]);t[i]=o}catch(u){}}return t}function c(){var e=[];if(Object.getOwnPropertyNames)return e=Object.getOwnPropertyNames(r),e.splice(e.indexOf("valueOf"),1),e.splice(e.indexOf("toString"),1),e;var t={},n=[];for(var i in String.prototype)t[i]=i;for(var i in Object.prototype)delete t[i];for(var i in t)e.push(i);return e}function h(e){return new n(e)}function p(e,t){var n=[],r;for(r=0;r<e.length;r++)n.push(e[r]),t&&t.call(e,e[r],r);return n}var e="1.3.0",t={},r=String.prototype,i=n.prototype={between:function(e,t){var r=this.s,i=r.indexOf(e),s=r.indexOf(t),o=i+e.length;return new n(s>i?r.slice(o,s):"")},camelize:function(){var e=this.trim().s.replace(/(\-|_|\s)+(.)?/g,function(e,t,n){return n?n.toUpperCase():""});return new n(e)},capitalize:function(){return new n(this.s.substr(0,1).toUpperCase()+this.s.substring(1).toLowerCase())},charAt:function(e){return this.s.charAt(e)},chompLeft:function(e){var t=this.s;return t.indexOf(e)===0?(t=t.slice(e.length),new n(t)):this},chompRight:function(e){if(this.endsWith(e)){var t=this.s;return t=t.slice(0,t.length-e.length),new n(t)}return this},collapseWhitespace:function(){var e=this.s.replace(/[\s\xa0]+/g," ").replace(/^\s+|\s+$/g,"");return new n(e)},contains:function(e){return this.s.indexOf(e)>=0},dasherize:function(){var e=this.trim().s.replace(/[_\s]+/g,"-").replace(/([A-Z])/g,"-$1").replace(/-+/g,"-").toLowerCase();return new n(e)},decodeHtmlEntities:function(){var e=this.s;return e=e.replace(/&#(\d+);?/g,function(e,t){return String.fromCharCode(t)}).replace(/&#[xX]([A-Fa-f0-9]+);?/g,function(e,t){return String.fromCharCode(parseInt(t,16))}).replace(/&([^;\W]+;?)/g,function(e,n){var r=n.replace(/;$/,""),i=t[n]||n.match(/;$/)&&t[r];return typeof i=="number"?String.fromCharCode(i):typeof i=="string"?i:e}),new n(e)},endsWith:function(e){var t=this.s.length-e.length;return t>=0&&this.s.indexOf(e,t)===t},escapeHTML:function(){return new n(this.s.replace(/[&<>"']/g,function(e){return"&"+v[e]+";"}))},ensureLeft:function(e){var t=this.s;return t.indexOf(e)===0?this:new n(e+t)},ensureRight:function(e){var t=this.s;return this.endsWith(e)?this:new n(t+e)},isAlpha:function(){return!/[^a-z\xC0-\xFF]/.test(this.s.toLowerCase())},isAlphaNumeric:function(){return!/[^0-9a-z\xC0-\xFF]/.test(this.s.toLowerCase())},isEmpty:function(){return this.s===null||this.s===undefined?!0:/^[\s\xa0]*$/.test(this.s)},isLower:function(){return this.isAlpha()&&this.s.toLowerCase()===this.s},isNumeric:function(){return!/[^0-9]/.test(this.s)},isUpper:function(){return this.isAlpha()&&this.s.toUpperCase()===this.s},left:function(e){if(e>=0){var t=this.s.substr(0,e);return new n(t)}return this.right(-e)},lines:function(){var e=this.s.split("\n");for(var t=0;t<e.length;++t)e[t]=e[t].replace(/(^\s*|\s*$)/g,"");return e},pad:function(e,t){t=t||" ";if(this.s.length>=e)return new n(this.s);e-=this.s.length;var r=Array(Math.ceil(e/2)+1).join(t),i=Array(Math.floor(e/2)+1).join(t);return new n(r+this.s+i)},padLeft:function(e,t){return t=t||" ",this.s.length>=e?new n(this.s):new n(Array(e-this.s.length+1).join(t)+this.s)},padRight:function(e,t){return t=t||" ",this.s.length>=e?new n(this.s):new n(this.s+Array(e-this.s.length+1).join(t))},parseCSV:function(e,t,n){e=e||",",n=n||"\\",typeof t=="undefined"&&(t='"');var r=0,i=[],s=[],o=this.s.length,u=!1,a=this,f=function(e){return a.s.charAt(e)};t||(u=!0);while(r<o){var l=f(r);switch(l){case t:u?f(r-1)===n?i.push(l):u=!1:u=!0;break;case e:u&&t?i.push(l):(s.push(i.join("")),i.length=0);break;case n:t&&f(r+1)!==t&&i.push(l);break;default:u&&i.push(l)}r+=1}return s.push(i.join("")),s},replaceAll:function(e,t){var r=this.s.split(e).join(t);return new n(r)},right:function(e){if(e>=0){var t=this.s.substr(this.s.length-e,e);return new n(t)}return this.left(-e)},slugify:function(){var e=(new n(this.s.replace(/[^\w\s-]/g,"").toLowerCase())).dasherize().s;return e.charAt(0)==="-"&&(e=e.substr(1)),new n(e)},startsWith:function(e){return this.s.lastIndexOf(e,0)===0},stripPunctuation:function(){return new n(this.s.replace(/[^\w\s]|_/g,"").replace(/\s+/g," "))},stripTags:function(){var e=this.s,t=arguments.length>0?arguments:[""];return p(t,function(t){e=e.replace(RegExp("</?"+t+"[^<>]*>","gi"),"")}),new n(e)},template:function(e,t,r){var i=this.s,t=t||h.TMPL_OPEN,r=r||h.TMPL_CLOSE,s=new RegExp(t+"(.+?)"+r,"g"),o=i.match(s)||[];return o.forEach(function(n){var s=n.substring(t.length,n.length-r.length);e[s]&&(i=i.replace(n,e[s]))}),new n(i)},times:function(e){return new n((new Array(e+1)).join(this.s))},toBoolean:function(){if(typeof this.orig=="string"){var e=this.s.toLowerCase();return e==="true"||e==="yes"||e==="on"}return this.orig===!0||this.orig===1},toFloat:function(e){var t=parseFloat(this.s,10);return e?parseFloat(t.toFixed(e)):t},toInt:function(){return/^\s*-?0x/i.test(this.s)?parseInt(this.s,16):parseInt(this.s,10)},trim:function(){var e;return typeof String.prototype.trim=="undefined"?e=this.s.replace(/(^\s*|\s*$)/g,""):e=this.s.trim(),new n(e)},trimLeft:function(){var e;return r.trimLeft?e=this.s.trimLeft():e=this.s.replace(/(^\s*)/g,""),new n(e)},trimRight:function(){var e;return r.trimRight?e=this.s.trimRight():e=this.s.replace(/\s+$/,""),new n(e)},truncate:function(e,t){var r=this.s;e=~~e,t=t||"...";if(r.length<=e)return new n(r);var i=function(e){return e.toUpperCase()!==e.toLowerCase()?"A":" "},s=r.slice(0,e+1).replace(/.(?=\W*\w*$)/g,i);return s.slice(s.length-2).match(/\w\w/)?s=s.replace(/\s*\S+$/,""):s=(new n(s.slice(0,s.length-1))).trimRight().s,(s+t).length>r.length?new n(r):new n(r.slice(0,s.length)+t)},toCSV:function(){function u(e){return e!==null&&e!==""}var e=",",t='"',r="\\",i=!0,s=!1,o=[];typeof arguments[0]=="object"?(e=arguments[0].delimiter||e,e=arguments[0].separator||e,t=arguments[0].qualifier||t,i=!!arguments[0].encloseNumbers,r=arguments[0].escapeChar||r,s=!!arguments[0].keys):typeof arguments[0]=="string"&&(e=arguments[0]),typeof arguments[1]=="string"&&(t=arguments[1]),arguments[1]===null&&(t=null);if(this.orig instanceof Array)o=this.orig;else for(var a in this.orig)this.orig.hasOwnProperty(a)&&(s?o.push(a):o.push(this.orig[a]));var f=r+t,l=[];for(var c=0;c<o.length;++c){var h=u(t);typeof o[c]=="number"&&(h&=i),h&&l.push(t);if(o[c]!==null){var p=(new n(o[c])).replaceAll(t,f).s;l.push(p)}else l.push("");h&&l.push(t),e&&l.push(e)}return l.length=l.length-1,new n(l.join(""))},toString:function(){return this.s},underscore:function(){var e=this.trim().s.replace(/([a-z\d])([A-Z]+)/g,"$1_$2").replace(/[-\s]+/g,"_").toLowerCase();return(new n(this.s.charAt(0))).isUpper()&&(e="_"+e),new n(e)},unescapeHTML:function(){return new n(this.s.replace(/\&([^;]+);/g,function(e,t){var n;return t in d?d[t]:(n=t.match(/^#x([\da-fA-F]+)$/))?String.fromCharCode(parseInt(n[1],16)):(n=t.match(/^#(\d+)$/))?String.fromCharCode(~~n[1]):e}))},valueOf:function(){return this.s.valueOf()}},s=[],a=l();for(var f in a)(function(e){var t=r[e];typeof t=="function"&&(i[e]||(a[e]==="string"?i[e]=function(){return new n(t.apply(this,arguments))}:i[e]=t))})(f);i.repeat=i.times,i.include=i.contains,i.toInteger=i.toInt,i.toBool=i.toBoolean,i.decodeHTMLEntities=i.decodeHtmlEntities,h.extendPrototype=o,h.restorePrototype=u,h.VERSION=e,h.TMPL_OPEN="{{",h.TMPL_CLOSE="}}",h.ENTITIES=t,typeof module!="undefined"&&typeof module.exports!="undefined"?module.exports=h:typeof define=="function"&&define.amd?define([],function(){return h}):window.S=h;var d={lt:"<",gt:">",quot:'"',apos:"'",amp:"&"},v={};for(var m in d)v[d[m]]=m;t={amp:"&",gt:">",lt:"<",quot:'"',apos:"'",AElig:198,Aacute:193,Acirc:194,Agrave:192,Aring:197,Atilde:195,Auml:196,Ccedil:199,ETH:208,Eacute:201,Ecirc:202,Egrave:200,Euml:203,Iacute:205,Icirc:206,Igrave:204,Iuml:207,Ntilde:209,Oacute:211,Ocirc:212,Ograve:210,Oslash:216,Otilde:213,Ouml:214,THORN:222,Uacute:218,Ucirc:219,Ugrave:217,Uuml:220,Yacute:221,aacute:225,acirc:226,aelig:230,agrave:224,aring:229,atilde:227,auml:228,ccedil:231,eacute:233,ecirc:234,egrave:232,eth:240,euml:235,iacute:237,icirc:238,igrave:236,iuml:239,ntilde:241,oacute:243,ocirc:244,ograve:242,oslash:248,otilde:245,ouml:246,szlig:223,thorn:254,uacute:250,ucirc:251,ugrave:249,uuml:252,yacute:253,yuml:255,copy:169,reg:174,nbsp:160,iexcl:161,cent:162,pound:163,curren:164,yen:165,brvbar:166,sect:167,uml:168,ordf:170,laquo:171,not:172,shy:173,macr:175,deg:176,plusmn:177,sup1:185,sup2:178,sup3:179,acute:180,micro:181,para:182,middot:183,cedil:184,ordm:186,raquo:187,frac14:188,frac12:189,frac34:190,iquest:191,times:215,divide:247,"OElig;":338,"oelig;":339,"Scaron;":352,"scaron;":353,"Yuml;":376,"fnof;":402,"circ;":710,"tilde;":732,"Alpha;":913,"Beta;":914,"Gamma;":915,"Delta;":916,"Epsilon;":917,"Zeta;":918,"Eta;":919,"Theta;":920,"Iota;":921,"Kappa;":922,"Lambda;":923,"Mu;":924,"Nu;":925,"Xi;":926,"Omicron;":927,"Pi;":928,"Rho;":929,"Sigma;":931,"Tau;":932,"Upsilon;":933,"Phi;":934,"Chi;":935,"Psi;":936,"Omega;":937,"alpha;":945,"beta;":946,"gamma;":947,"delta;":948,"epsilon;":949,"zeta;":950,"eta;":951,"theta;":952,"iota;":953,"kappa;":954,"lambda;":955,"mu;":956,"nu;":957,"xi;":958,"omicron;":959,"pi;":960,"rho;":961,"sigmaf;":962,"sigma;":963,"tau;":964,"upsilon;":965,"phi;":966,"chi;":967,"psi;":968,"omega;":969,"thetasym;":977,"upsih;":978,"piv;":982,"ensp;":8194,"emsp;":8195,"thinsp;":8201,"zwnj;":8204,"zwj;":8205,"lrm;":8206,"rlm;":8207,"ndash;":8211,"mdash;":8212,"lsquo;":8216,"rsquo;":8217,"sbquo;":8218,"ldquo;":8220,"rdquo;":8221,"bdquo;":8222,"dagger;":8224,"Dagger;":8225,"bull;":8226,"hellip;":8230,"permil;":8240,"prime;":8242,"Prime;":8243,"lsaquo;":8249,"rsaquo;":8250,"oline;":8254,"frasl;":8260,"euro;":8364,"image;":8465,"weierp;":8472,"real;":8476,"trade;":8482,"alefsym;":8501,"larr;":8592,"uarr;":8593,"rarr;":8594,"darr;":8595,"harr;":8596,"crarr;":8629,"lArr;":8656,"uArr;":8657,"rArr;":8658,"dArr;":8659,"hArr;":8660,"forall;":8704,"part;":8706,"exist;":8707,"empty;":8709,"nabla;":8711,"isin;":8712,"notin;":8713,"ni;":8715,"prod;":8719,"sum;":8721,"minus;":8722,"lowast;":8727,"radic;":8730,"prop;":8733,"infin;":8734,"ang;":8736,"and;":8743,"or;":8744,"cap;":8745,"cup;":8746,"int;":8747,"there4;":8756,"sim;":8764,"cong;":8773,"asymp;":8776,"ne;":8800,"equiv;":8801,"le;":8804,"ge;":8805,"sub;":8834,"sup;":8835,"nsub;":8836,"sube;":8838,"supe;":8839,"oplus;":8853,"otimes;":8855,"perp;":8869,"sdot;":8901,"lceil;":8968,"rceil;":8969,"lfloor;":8970,"rfloor;":8971,"lang;":9001,"rang;":9002,"loz;":9674,"spades;":9824,"clubs;":9827,"hearts;":9829,"diams;":9830}}.call(this);
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stringjs-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jesper Josefsson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: railties
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '3.1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '3.1'
30
+ - !ruby/object:Gem::Dependency
31
+ name: bundler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.3'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Wraps String.js and makes it available using the Rails asset pipeline
63
+ email:
64
+ - jesper.josefsson@gmail.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - lib/stringjs-rails.rb
70
+ - vendor/assets/javascripts/string.js
71
+ - vendor/assets/javascripts/string.min.js
72
+ - LICENSE.txt
73
+ - README.md
74
+ homepage: https://github.com/jesjos/stringjs-rails
75
+ licenses:
76
+ - MIT
77
+ post_install_message:
78
+ rdoc_options: []
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ segments:
88
+ - 0
89
+ hash: -1532851845134161308
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ segments:
97
+ - 0
98
+ hash: -1532851845134161308
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 1.8.25
102
+ signing_key:
103
+ specification_version: 3
104
+ summary: The String.js Javascript library ready for the Rails asset pipeline
105
+ test_files: []