walrus-rb 0.10.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/Guardfile +15 -0
- data/MIT-LICENSE +20 -0
- data/README.md +45 -0
- data/Rakefile +17 -0
- data/lib/walrus.rb +7 -0
- data/lib/walrus/config.rb +29 -0
- data/lib/walrus/context.rb +42 -0
- data/lib/walrus/version.rb +3 -0
- data/spec/blocks_spec.rb +13 -0
- data/spec/collections_spec.rb +15 -0
- data/spec/context_spec.rb +13 -0
- data/spec/currencies_spec.rb +13 -0
- data/spec/dates_spec.rb +13 -0
- data/spec/domain_spec.rb +20 -0
- data/spec/filters_spec.rb +13 -0
- data/spec/inflections_spec.rb +13 -0
- data/spec/math_spec.rb +14 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/strings_spec.rb +11 -0
- data/spec/support/javascripts/walrus_domain_objects.js +22 -0
- data/vendor/walrus.collections.js +234 -0
- data/vendor/walrus.currencies.js +57 -0
- data/vendor/walrus.dates.js +296 -0
- data/vendor/walrus.inflections.js +120 -0
- data/vendor/walrus.js +1304 -0
- data/vendor/walrus.math.js +144 -0
- data/vendor/walrus.strings.js +127 -0
- data/walrus.gemspec +30 -0
- metadata +187 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
(function() {
|
2
|
+
var Walrus, locale, separate;
|
3
|
+
|
4
|
+
Walrus = (typeof exports !== "undefined" && exports !== null ? require('./walrus') : this).Walrus;
|
5
|
+
|
6
|
+
separate = function(value, thousands, decimal) {
|
7
|
+
var fraction, whole, _ref;
|
8
|
+
_ref = value.split(decimal), whole = _ref[0], fraction = _ref[1];
|
9
|
+
whole = whole.replace(/(\d)(?=(\d{3})+$)/g, "$1" + thousands);
|
10
|
+
if (fraction) {
|
11
|
+
return [whole, fraction].join(decimal);
|
12
|
+
} else {
|
13
|
+
return whole;
|
14
|
+
}
|
15
|
+
};
|
16
|
+
|
17
|
+
/**
|
18
|
+
* *:currency*
|
19
|
+
* Returns a string formatted in the current locale's format.
|
20
|
+
* Delegates to [accounting.js](http://josscrowcroft.github.com/accounting.js/) if present.
|
21
|
+
*
|
22
|
+
* Parameters:
|
23
|
+
* precision - the decimal place level to show cents, if applicable
|
24
|
+
*
|
25
|
+
* Usage:
|
26
|
+
*
|
27
|
+
* {{ 36000 | :currency( '$', 2 ) }} // => $36,000.00
|
28
|
+
* {{ 36000 | :currency }} // => $36,000
|
29
|
+
*/
|
30
|
+
|
31
|
+
locale = Walrus.i18n.t('currencies');
|
32
|
+
|
33
|
+
if (typeof accounting !== "undefined" && accounting !== null) {
|
34
|
+
accounting.settings.currency.symbol = locale.symbol;
|
35
|
+
accounting.settings.currency.decimal = locale.decimal;
|
36
|
+
accounting.settings.currency.precision = locale.precision;
|
37
|
+
accounting.settings.currency.thousand = locale.thousand;
|
38
|
+
Walrus.addFilter('currency', function() {
|
39
|
+
return accounting.formatMoney.apply(accounting, arguments);
|
40
|
+
});
|
41
|
+
Walrus.addFilter('formatMoney', function() {
|
42
|
+
return accounting.formatMoney.apply(accounting, arguments);
|
43
|
+
});
|
44
|
+
} else {
|
45
|
+
Walrus.addFilter('currency', function(value, symbol, precision, decimal, thousand) {
|
46
|
+
var amount, moneys;
|
47
|
+
if (symbol == null) symbol = locale.symbol;
|
48
|
+
if (precision == null) precision = locale.precision;
|
49
|
+
if (decimal == null) decimal = locale.decimal;
|
50
|
+
if (thousand == null) thousand = locale.thousand;
|
51
|
+
moneys = value.toFixed(precision);
|
52
|
+
amount = separate(moneys, thousand, decimal);
|
53
|
+
return "" + symbol + amount;
|
54
|
+
});
|
55
|
+
}
|
56
|
+
|
57
|
+
}).call(this);
|
@@ -0,0 +1,296 @@
|
|
1
|
+
(function() {
|
2
|
+
var Walrus;
|
3
|
+
|
4
|
+
Walrus = (typeof exports !== "undefined" && exports !== null ? require('./walrus') : this).Walrus;
|
5
|
+
|
6
|
+
/**
|
7
|
+
* *:strftime*
|
8
|
+
* Formats a date into the string given by `format`. Accepts any value
|
9
|
+
* that can be passed to `new Date( )`.
|
10
|
+
*
|
11
|
+
* Parameters:
|
12
|
+
* format - The format string, according to these tokens, taken directly
|
13
|
+
* from `man 3 strftime` (with some omissions):
|
14
|
+
*
|
15
|
+
* %A is replaced by national representation of the full weekday name.
|
16
|
+
*
|
17
|
+
* %a is replaced by national representation of the abbreviated weekday name.
|
18
|
+
*
|
19
|
+
* %B is replaced by national representation of the full month name.
|
20
|
+
*
|
21
|
+
* %b is replaced by national representation of the abbreviated month name.
|
22
|
+
*
|
23
|
+
* %D is equivalent to ``%m/%d/%y''.
|
24
|
+
*
|
25
|
+
* %d is replaced by the day of the month as a decimal number (01-31).
|
26
|
+
*
|
27
|
+
* %e is replaced by the day of month as a decimal number (1-31); single digits are
|
28
|
+
* preceded by a blank.
|
29
|
+
*
|
30
|
+
* %F is equivalent to ``%Y-%m-%d''.
|
31
|
+
*
|
32
|
+
* %H is replaced by the hour (24-hour clock) as a decimal number (00-23).
|
33
|
+
*
|
34
|
+
* %I is replaced by the hour (12-hour clock) as a decimal number (01-12).
|
35
|
+
*
|
36
|
+
* %k is replaced by the hour (24-hour clock) as a decimal number (0-23); single dig-
|
37
|
+
* its are preceded by a blank.
|
38
|
+
*
|
39
|
+
* %l is replaced by the hour (12-hour clock) as a decimal number (1-12); single dig-
|
40
|
+
* its are preceded by a blank.
|
41
|
+
*
|
42
|
+
* %M is replaced by the minute as a decimal number (00-59).
|
43
|
+
*
|
44
|
+
* %m is replaced by the month as a decimal number (01-12).
|
45
|
+
*
|
46
|
+
* %n is replaced by a newline.
|
47
|
+
*
|
48
|
+
* %p is replaced by national representation of either "ante meridiem" or "post meri-
|
49
|
+
* diem" as appropriate.
|
50
|
+
*
|
51
|
+
* %R is equivalent to ``%H:%M''.
|
52
|
+
*
|
53
|
+
* %r is equivalent to ``%I:%M:%S %p''.
|
54
|
+
*
|
55
|
+
* %S is replaced by the second as a decimal number (00-60).
|
56
|
+
*
|
57
|
+
* %T is equivalent to ``%H:%M:%S''.
|
58
|
+
*
|
59
|
+
* %t is replaced by a tab.
|
60
|
+
*
|
61
|
+
* %U is replaced by the week number of the year (Sunday as the first day of the
|
62
|
+
* week) as a decimal number (00-53).
|
63
|
+
*
|
64
|
+
* %u is replaced by the weekday (Monday as the first day of the week) as a decimal
|
65
|
+
* number (1-7).
|
66
|
+
*
|
67
|
+
* %v is equivalent to ``%e-%b-%Y''.
|
68
|
+
*
|
69
|
+
* %w is replaced by the weekday (Sunday as the first day of the week) as a decimal
|
70
|
+
*
|
71
|
+
* %X is replaced by national representation of the time.
|
72
|
+
*
|
73
|
+
* %x is replaced by national representation of the date.
|
74
|
+
*
|
75
|
+
* %Y is replaced by the year with century as a decimal number.
|
76
|
+
*
|
77
|
+
* %y is replaced by the year without century as a decimal number (00-99).
|
78
|
+
*
|
79
|
+
* %Z is replaced by the time zone name.
|
80
|
+
*/
|
81
|
+
|
82
|
+
Walrus.addFilter('strftime', function(dateish, format) {
|
83
|
+
var date, pad,
|
84
|
+
_this = this;
|
85
|
+
date = new Date(dateish);
|
86
|
+
pad = function(value, to, padding) {
|
87
|
+
if (to == null) to = 2;
|
88
|
+
if (padding == null) padding = '0';
|
89
|
+
if (("" + value).length < to) {
|
90
|
+
return pad("" + padding + value, to, padding);
|
91
|
+
} else {
|
92
|
+
return value;
|
93
|
+
}
|
94
|
+
};
|
95
|
+
return format.replace(/%(.)/g, function(input) {
|
96
|
+
switch (input) {
|
97
|
+
case '%a':
|
98
|
+
return Walrus.i18n.t('dates.abbr_daynames')[date.getDay()];
|
99
|
+
case '%A':
|
100
|
+
return Walrus.i18n.t('dates.full_daynames')[date.getDay()];
|
101
|
+
case '%b':
|
102
|
+
return Walrus.i18n.t('dates.abbr_monthnames')[date.getMonth()];
|
103
|
+
case '%B':
|
104
|
+
return Walrus.i18n.t('dates.full_monthnames')[date.getMonth()];
|
105
|
+
case '%D':
|
106
|
+
return _this.strftime(date, '%m/%d/%y');
|
107
|
+
case '%d':
|
108
|
+
return pad(date.getDate());
|
109
|
+
case '%e':
|
110
|
+
return date.getDate();
|
111
|
+
case '%F':
|
112
|
+
return _this.strftime(date, '%Y-%m-%d');
|
113
|
+
case '%H':
|
114
|
+
return pad(date.getHours());
|
115
|
+
case '%I':
|
116
|
+
if (date.getHours() > 12) {
|
117
|
+
return pad(date.getHours() - 12);
|
118
|
+
} else {
|
119
|
+
return pad(date.getHours());
|
120
|
+
}
|
121
|
+
break;
|
122
|
+
case '%k':
|
123
|
+
return date.getHours();
|
124
|
+
case '%l':
|
125
|
+
if (date.getHours() > 12) {
|
126
|
+
return date.getHours() - 12;
|
127
|
+
} else {
|
128
|
+
return date.getHours();
|
129
|
+
}
|
130
|
+
break;
|
131
|
+
case '%M':
|
132
|
+
return pad(date.getMinutes());
|
133
|
+
case '%m':
|
134
|
+
return pad(date.getMonth() + 1);
|
135
|
+
case '%n':
|
136
|
+
return "\n";
|
137
|
+
case '%p':
|
138
|
+
if (date.getHours() > 12) {
|
139
|
+
return Walrus.i18n.t('dates.pm');
|
140
|
+
} else {
|
141
|
+
return Walrus.i18n.t('dates.am');
|
142
|
+
}
|
143
|
+
break;
|
144
|
+
case '%R':
|
145
|
+
return _this.strftime(date, '%H:%M');
|
146
|
+
case '%r':
|
147
|
+
return _this.strftime(date, '%I:%M:%S %p');
|
148
|
+
case '%S':
|
149
|
+
return pad(date.getSeconds());
|
150
|
+
case '%T':
|
151
|
+
return _this.strftime(date, '%H:%M:%S');
|
152
|
+
case '%t':
|
153
|
+
return "\t";
|
154
|
+
case '%u':
|
155
|
+
return date.getDay() || 7;
|
156
|
+
case '%v':
|
157
|
+
return _this.strftime(date, '%e-%b-%Y');
|
158
|
+
case '%w':
|
159
|
+
return date.getDay();
|
160
|
+
case '%X':
|
161
|
+
return date.toTimeString();
|
162
|
+
case '%x':
|
163
|
+
return date.toDateString();
|
164
|
+
case '%Y':
|
165
|
+
return date.getFullYear();
|
166
|
+
case '%y':
|
167
|
+
return date.getFullYear().toString().slice(-2);
|
168
|
+
case '%Z':
|
169
|
+
return date.toString().match(/\((\w+)\)/)[1] || '';
|
170
|
+
}
|
171
|
+
});
|
172
|
+
});
|
173
|
+
|
174
|
+
/**
|
175
|
+
* returns whether or not the given year is a leap year
|
176
|
+
*/
|
177
|
+
|
178
|
+
Walrus.Utils.isLeapYear = function(year) {
|
179
|
+
return new Date(year, 1, 29).getDate() === 29;
|
180
|
+
};
|
181
|
+
|
182
|
+
/**
|
183
|
+
* returns the number of leap years between the two given years
|
184
|
+
*/
|
185
|
+
|
186
|
+
Walrus.Utils.leapYearsBetween = function(from, to) {
|
187
|
+
var count, year;
|
188
|
+
if (from > to) return 0;
|
189
|
+
count = 0;
|
190
|
+
for (year = from; from <= to ? year <= to : year >= to; from <= to ? year++ : year--) {
|
191
|
+
if (this.isLeapYear(year)) count++;
|
192
|
+
}
|
193
|
+
return count;
|
194
|
+
};
|
195
|
+
|
196
|
+
/**
|
197
|
+
* returns the distance between two times in words
|
198
|
+
*/
|
199
|
+
|
200
|
+
Walrus.Utils.distanceOfTimeInWords = function(ftime, ttime, includeSeconds) {
|
201
|
+
var d, diff, distanceInMinutes, distanceInSeconds, distanceInYears, fdate, fyear, leapYears, minuteOffsetForLeapYear, minutesWithOffset, remainder, t, tdate, tyear;
|
202
|
+
if (ttime == null) ttime = 0;
|
203
|
+
if (includeSeconds == null) includeSeconds = false;
|
204
|
+
t = function(keypath, count) {
|
205
|
+
var amount;
|
206
|
+
if (count == null) count = 1;
|
207
|
+
amount = count === 1 ? 'one' : 'other';
|
208
|
+
return Walrus.i18n.t("dates.distance_in_words." + keypath + "." + amount, {
|
209
|
+
count: count
|
210
|
+
});
|
211
|
+
};
|
212
|
+
fdate = new Date(ftime);
|
213
|
+
tdate = new Date(ttime);
|
214
|
+
diff = (tdate - fdate) / 1000;
|
215
|
+
distanceInMinutes = Math.round(Math.abs(diff) / 60);
|
216
|
+
distanceInSeconds = Math.round(Math.abs(diff));
|
217
|
+
d = function(divisor) {
|
218
|
+
if (divisor == null) divisor = 1;
|
219
|
+
return Math.round(distanceInMinutes / divisor);
|
220
|
+
};
|
221
|
+
switch (false) {
|
222
|
+
case !((0 <= distanceInMinutes && distanceInMinutes <= 1)):
|
223
|
+
if (!includeSeconds) {
|
224
|
+
if (distanceInMinutes === 0) {
|
225
|
+
return t('less_than_x_minutes');
|
226
|
+
} else {
|
227
|
+
return t('x_minutes');
|
228
|
+
}
|
229
|
+
} else {
|
230
|
+
switch (false) {
|
231
|
+
case !((0 <= distanceInSeconds && distanceInSeconds <= 4)):
|
232
|
+
return t('less_than_x_seconds', 5);
|
233
|
+
case !((5 <= distanceInSeconds && distanceInSeconds <= 9)):
|
234
|
+
return t('less_than_x_seconds', 10);
|
235
|
+
case !((10 <= distanceInSeconds && distanceInSeconds <= 19)):
|
236
|
+
return t('less_than_x_seconds', 20);
|
237
|
+
case !((20 <= distanceInSeconds && distanceInSeconds <= 39)):
|
238
|
+
return t('half_a_minute');
|
239
|
+
case !((40 <= distanceInSeconds && distanceInSeconds <= 59)):
|
240
|
+
return t('less_than_x_minutes');
|
241
|
+
default:
|
242
|
+
return "1 minute";
|
243
|
+
}
|
244
|
+
}
|
245
|
+
break;
|
246
|
+
case !((2 <= distanceInMinutes && distanceInMinutes <= 44)):
|
247
|
+
return t('x_minutes', d());
|
248
|
+
case !((45 <= distanceInMinutes && distanceInMinutes <= 89)):
|
249
|
+
return t('about_x_hours');
|
250
|
+
case !((90 <= distanceInMinutes && distanceInMinutes <= 1439)):
|
251
|
+
return t('about_x_hours', d(60));
|
252
|
+
case !((1440 <= distanceInMinutes && distanceInMinutes <= 2519)):
|
253
|
+
return t('x_days');
|
254
|
+
case !((2520 <= distanceInMinutes && distanceInMinutes <= 43199)):
|
255
|
+
return t('x_days', d(1440));
|
256
|
+
case !((43200 <= distanceInMinutes && distanceInMinutes <= 86399)):
|
257
|
+
return t('about_x_months');
|
258
|
+
case !((86400 <= distanceInMinutes && distanceInMinutes <= 525599)):
|
259
|
+
return t('x_months', d(43200));
|
260
|
+
default:
|
261
|
+
fyear = fdate.getFullYear();
|
262
|
+
if (fdate.getMonth() >= 2) fyear += 1;
|
263
|
+
tyear = tdate.getFullYear();
|
264
|
+
if (tdate.getMonth() < 2) tyear -= 1;
|
265
|
+
leapYears = Walrus.Utils.leapYearsBetween(fyear, tyear);
|
266
|
+
minuteOffsetForLeapYear = leapYears * 1440;
|
267
|
+
minutesWithOffset = distanceInMinutes - minuteOffsetForLeapYear;
|
268
|
+
remainder = minutesWithOffset % 525600;
|
269
|
+
distanceInYears = Math.floor(minutesWithOffset / 525600);
|
270
|
+
if (remainder < 131400) {
|
271
|
+
return t('about_x_years', distanceInYears);
|
272
|
+
} else if (remainder < 394200) {
|
273
|
+
return t('over_x_years', distanceInYears);
|
274
|
+
} else {
|
275
|
+
return t('almost_x_years', distanceInYears + 1);
|
276
|
+
}
|
277
|
+
}
|
278
|
+
};
|
279
|
+
|
280
|
+
/**
|
281
|
+
* *:time_ago_in_words*
|
282
|
+
* Returns a human-readable relative time phrase from the given date.
|
283
|
+
*
|
284
|
+
* Parameters:
|
285
|
+
* includeSeconds - (Optional) whether or not to include results for less than one minute
|
286
|
+
*
|
287
|
+
* Usage:
|
288
|
+
*
|
289
|
+
* {{ created_at | :time_ago_in_words( true ) }} // => "less than a minute"
|
290
|
+
*/
|
291
|
+
|
292
|
+
Walrus.addFilter('time_ago_in_words', function(dateish, includeSeconds) {
|
293
|
+
return Walrus.Utils.distanceOfTimeInWords(dateish, new Date(), includeSeconds);
|
294
|
+
});
|
295
|
+
|
296
|
+
}).call(this);
|
@@ -0,0 +1,120 @@
|
|
1
|
+
(function() {
|
2
|
+
var Walrus, gsub, inflect, pluralize, plurals, singularize, singulars, uncountables,
|
3
|
+
__indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
4
|
+
|
5
|
+
Walrus = (typeof exports !== "undefined" && exports !== null ? require('./walrus') : this).Walrus;
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Plenty of the methods in `walrus.inflections` are borrowed from or inspired by ActiveSupport:
|
9
|
+
* https://github.com/rails/rails/tree/master/activesupport
|
10
|
+
* JavaScript inflector implementation ported from underscore.inflection:
|
11
|
+
* https://github.com/jeremyruppel/underscore.inflection
|
12
|
+
* (Which was also inspired by and borrows from ActiveSupport)
|
13
|
+
*/
|
14
|
+
|
15
|
+
plurals = [[/$/, 's'], [/s$/, 's'], [/(ax|test)is$/, '$1es'], [/(octop|vir)us$/, '$1i'], [/(octop|vir)i$/, '$1i'], [/(alias|status)$/, '$1es'], [/(bu)s$/, '$1ses'], [/(buffal|tomat)o$/, '$1oes'], [/([ti])um$/, '$1a'], [/([ti])a$/, '$1a'], [/sis$/, 'ses'], [/(?:([^f])fe|([lr])f)$/, '$1$2ves'], [/(hive)$/, '$1s'], [/([^aeiouy]|qu)y$/, '$1ies'], [/(x|ch|ss|sh)$/, '$1es'], [/(matr|vert|ind)(?:ix|ex)$/, '$1ices'], [/([m|l])ouse$/, '$1ice'], [/([m|l])ice$/, '$1ice'], [/^(ox)$/, '$1en'], [/^(oxen)$/, '$1'], [/(quiz)$/, '$1zes'], ['person', 'people'], ['man', 'men'], ['child', 'children'], ['sex', 'sexes'], ['move', 'moves'], ['cow', 'kine']].reverse();
|
16
|
+
|
17
|
+
singulars = [[/s$/, ''], [/(n)ews$/, '$1ews'], [/([ti])a$/, '$1um'], [/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/, '$1$2sis'], [/(^analy)ses$/, '$1sis'], [/([^f])ves$/, '$1fe'], [/(hive)s$/, '$1'], [/(tive)s$/, '$1'], [/([lr])ves$/, '$1f'], [/([^aeiouy]|qu)ies$/, '$1y'], [/(s)eries$/, '$1eries'], [/(m)ovies$/, '$1ovie'], [/(x|ch|ss|sh)es$/, '$1'], [/([m|l])ice$/, '$1ouse'], [/(bus)es$/, '$1'], [/(o)es$/, '$1'], [/(shoe)s$/, '$1'], [/(cris|ax|test)es$/, '$1is'], [/(octop|vir)i$/, '$1us'], [/(alias|status)es$/, '$1'], [/^(ox)en/, '$1'], [/(vert|ind)ices$/, '$1ex'], [/(matr)ices$/, '$1ix'], [/(quiz)zes$/, '$1'], [/(database)s$/, '$1'], ['cow', 'kine'], ['move', 'moves'], ['sex', 'sexes'], ['child', 'children'], ['man', 'men'], ['person', 'people']].reverse();
|
18
|
+
|
19
|
+
uncountables = ['equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep', 'jeans'];
|
20
|
+
|
21
|
+
gsub = function(word, rule, replacement) {
|
22
|
+
var pattern;
|
23
|
+
pattern = new RegExp(rule.source || rule, 'gi');
|
24
|
+
if (pattern.test(word)) return word.replace(pattern, replacement);
|
25
|
+
};
|
26
|
+
|
27
|
+
inflect = function(word, rules) {
|
28
|
+
var result, rule, sub, _i, _len;
|
29
|
+
result = word;
|
30
|
+
for (_i = 0, _len = rules.length; _i < _len; _i++) {
|
31
|
+
rule = rules[_i];
|
32
|
+
sub = gsub(word, rule[0], rule[1]);
|
33
|
+
if (sub) result = sub;
|
34
|
+
if (sub) break;
|
35
|
+
}
|
36
|
+
return result;
|
37
|
+
};
|
38
|
+
|
39
|
+
singularize = function(word) {
|
40
|
+
if (__indexOf.call(uncountables, word) >= 0) return word;
|
41
|
+
return inflect(word, singulars);
|
42
|
+
};
|
43
|
+
|
44
|
+
pluralize = function(word, count, includeCount) {
|
45
|
+
var result;
|
46
|
+
if (includeCount == null) includeCount = false;
|
47
|
+
if (count != null) {
|
48
|
+
result = count === 1 ? singularize(word) : pluralize(word);
|
49
|
+
return result = includeCount ? "" + count + " " + result : result;
|
50
|
+
} else {
|
51
|
+
if (__indexOf.call(uncountables, word) >= 0) return word;
|
52
|
+
return inflect(word, plurals);
|
53
|
+
}
|
54
|
+
};
|
55
|
+
|
56
|
+
/**
|
57
|
+
* *:pluralize*
|
58
|
+
* Pluralizes the given word, optionally based on a _count_, and also optionally
|
59
|
+
* including the count in the result.
|
60
|
+
*
|
61
|
+
* Parameters:
|
62
|
+
* word - the word to be pluralized
|
63
|
+
* count - Optional: count to base pluralization on
|
64
|
+
* includeCount - Optional: whether or not to include the count in the result
|
65
|
+
*
|
66
|
+
* Usage:
|
67
|
+
*
|
68
|
+
* {{ "book" | :pluralize }} // => "books"
|
69
|
+
*
|
70
|
+
* {{ "book" | :pluralize( 1 ) }} // => "book"
|
71
|
+
*
|
72
|
+
* {{ "book" | :pluralize( 5, true ) }} // => "5 books"
|
73
|
+
*/
|
74
|
+
|
75
|
+
Walrus.addFilter('pluralize', pluralize);
|
76
|
+
|
77
|
+
/**
|
78
|
+
* *:singularize*
|
79
|
+
* Singularizes the given word. You're probably looking for `pluralize`.
|
80
|
+
*
|
81
|
+
* Parameters: none
|
82
|
+
*
|
83
|
+
* Usage:
|
84
|
+
*
|
85
|
+
* {{ "books" | :singularize }} // => "book"
|
86
|
+
*/
|
87
|
+
|
88
|
+
Walrus.addFilter('singularize', singularize);
|
89
|
+
|
90
|
+
/**
|
91
|
+
* *:ordinalize*
|
92
|
+
* Turns a number into an ordinal string, like 1st, 2nd, 3rd, etc...
|
93
|
+
*
|
94
|
+
* Parameters: none
|
95
|
+
*
|
96
|
+
* Usage:
|
97
|
+
*
|
98
|
+
* {{ 5 | :ordinalize }} // => "5th"
|
99
|
+
*/
|
100
|
+
|
101
|
+
Walrus.addFilter('ordinalize', function(value) {
|
102
|
+
var normal, _ref;
|
103
|
+
normal = Math.abs(Math.round(value));
|
104
|
+
if (_ref = normal % 100, __indexOf.call([11, 12, 13], _ref) >= 0) {
|
105
|
+
return "" + value + "th";
|
106
|
+
} else {
|
107
|
+
switch (normal % 10) {
|
108
|
+
case 1:
|
109
|
+
return "" + value + "st";
|
110
|
+
case 2:
|
111
|
+
return "" + value + "nd";
|
112
|
+
case 3:
|
113
|
+
return "" + value + "rd";
|
114
|
+
default:
|
115
|
+
return "" + value + "th";
|
116
|
+
}
|
117
|
+
}
|
118
|
+
});
|
119
|
+
|
120
|
+
}).call(this);
|