momentjs-rails 1.3.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.
@@ -0,0 +1,20 @@
1
+ Copyright 2011 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,30 @@
1
+ # momentjs-rails
2
+
3
+ momentjs-rails wraps the [Moment.js](http://momentjs.com/) library in a rails engine for simple
4
+ use with the asset pipeline provided by rails 3.1. The gem includes the development (non-minified)
5
+ source for ease of exploration. The asset pipeline will minify in production.
6
+
7
+ Moment.js is "a lightweight javascript date library for parsing, manipulating, and formatting dates."
8
+ Moment.js does not modify the native Date object. Rather, it creates a warpper for it. Please see the
9
+ [documentation](http://momentjs.com/docs/) for details.
10
+
11
+ ## Usage
12
+
13
+ Add the following to your gemfile:
14
+
15
+ gem 'momentjs-rails'
16
+
17
+ Add the following directive to your Javascript manifest file (application.js):
18
+
19
+ //= require moment
20
+
21
+ ## Versioning
22
+
23
+ momentjs-rails 1.3.0 == Moment.js 1.3.0
24
+
25
+ Every attempt is made to mirror the currently shipping Momentum.js version number wherever possible.
26
+ The major and minor version numbers will always represent the Momentum.js version, but the patch level
27
+ may differ should a fix to gem need to be pushed before Moment.js ships an update to the library.
28
+
29
+ When the versions differ, it will be noted in the readme.
30
+
@@ -0,0 +1,8 @@
1
+ module Momentjs
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ # Get rails to add app, lib, vendor to load path
5
+ end
6
+ end
7
+ end
8
+
@@ -0,0 +1,624 @@
1
+ // Moment.js
2
+ //
3
+ // (c) 2011 Tim Wood
4
+ // Moment.js is freely distributable under the terms of the MIT license.
5
+ //
6
+ // Version 1.3.0
7
+
8
+ (function (Date, undefined) {
9
+
10
+ var moment,
11
+ round = Math.round,
12
+ languages = {},
13
+ hasModule = (typeof module !== 'undefined'),
14
+ paramsToParse = 'months|monthsShort|monthsParse|weekdays|weekdaysShort|longDateFormat|calendar|relativeTime|ordinal|meridiem'.split('|'),
15
+ i,
16
+ charactersToReplace = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|dddd?|do?|w[o|w]?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|zz?|ZZ?|LT|LL?L?L?)/g,
17
+ nonuppercaseLetters = /[^A-Z]/g,
18
+ timezoneRegex = /\([A-Za-z ]+\)|:[0-9]{2} [A-Z]{3} /g,
19
+ tokenCharacters = /(\\)?(MM?M?M?|dd?d?d|DD?D?D?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|ZZ?|T)/g,
20
+ inputCharacters = /(\\)?([0-9]+|([a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+|([\+\-]\d\d:?\d\d))/gi,
21
+ timezoneParseRegex = /([\+\-]|\d\d)/gi,
22
+ VERSION = "1.3.0",
23
+ shortcuts = 'Month|Date|Hours|Minutes|Seconds|Milliseconds'.split('|');
24
+
25
+ // Moment prototype object
26
+ function Moment(date) {
27
+ this._d = date;
28
+ }
29
+
30
+ // left zero fill a number
31
+ // see http://jsperf.com/left-zero-filling for performance comparison
32
+ function leftZeroFill(number, targetLength) {
33
+ var output = number + '';
34
+ while (output.length < targetLength) {
35
+ output = '0' + output;
36
+ }
37
+ return output;
38
+ }
39
+
40
+ // helper function for _.addTime and _.subtractTime
41
+ function dateAddRemove(date, _input, adding, val) {
42
+ var isString = (typeof _input === 'string'),
43
+ input = isString ? {} : _input,
44
+ ms, d, M, currentDate;
45
+ if (isString && val) {
46
+ input[_input] = val;
47
+ }
48
+ ms = (input.ms || input.milliseconds || 0) +
49
+ (input.s || input.seconds || 0) * 1e3 + // 1000
50
+ (input.m || input.minutes || 0) * 6e4 + // 1000 * 60
51
+ (input.h || input.hours || 0) * 36e5; // 1000 * 60 * 60
52
+ d = (input.d || input.days || 0) +
53
+ (input.w || input.weeks || 0) * 7;
54
+ M = (input.M || input.months || 0) +
55
+ (input.y || input.years || 0) * 12;
56
+ if (ms) {
57
+ date.setTime(+date + ms * adding);
58
+ }
59
+ if (d) {
60
+ date.setDate(date.getDate() + d * adding);
61
+ }
62
+ if (M) {
63
+ currentDate = date.getDate();
64
+ date.setDate(1);
65
+ date.setMonth(date.getMonth() + M * adding);
66
+ date.setDate(Math.min(new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate(), currentDate));
67
+ }
68
+ return date;
69
+ }
70
+
71
+ // check if is an array
72
+ function isArray(input) {
73
+ return Object.prototype.toString.call(input) === '[object Array]';
74
+ }
75
+
76
+ // convert an array to a date.
77
+ // the array should mirror the parameters below
78
+ // note: all values past the year are optional and will default to the lowest possible value.
79
+ // [year, month, day , hour, minute, second, millisecond]
80
+ function dateFromArray(input) {
81
+ return new Date(input[0], input[1] || 0, input[2] || 1, input[3] || 0, input[4] || 0, input[5] || 0, input[6] || 0);
82
+ }
83
+
84
+ // format date using native date object
85
+ function formatDate(date, inputString) {
86
+ var m = new Moment(date),
87
+ currentMonth = m.month(),
88
+ currentDate = m.date(),
89
+ currentYear = m.year(),
90
+ currentDay = m.day(),
91
+ currentHours = m.hours(),
92
+ currentMinutes = m.minutes(),
93
+ currentSeconds = m.seconds(),
94
+ currentZone = m.zone(),
95
+ ordinal = moment.ordinal,
96
+ meridiem = moment.meridiem;
97
+ // check if the character is a format
98
+ // return formatted string or non string.
99
+ //
100
+ // uses switch/case instead of an object of named functions (like http://phpjs.org/functions/date:380)
101
+ // for minification and performance
102
+ // see http://jsperf.com/object-of-functions-vs-switch for performance comparison
103
+ function replaceFunction(input) {
104
+ // create a couple variables to be used later inside one of the cases.
105
+ var a, b;
106
+ switch (input) {
107
+ // MONTH
108
+ case 'M' :
109
+ return currentMonth + 1;
110
+ case 'Mo' :
111
+ return (currentMonth + 1) + ordinal(currentMonth + 1);
112
+ case 'MM' :
113
+ return leftZeroFill(currentMonth + 1, 2);
114
+ case 'MMM' :
115
+ return moment.monthsShort[currentMonth];
116
+ case 'MMMM' :
117
+ return moment.months[currentMonth];
118
+ // DAY OF MONTH
119
+ case 'D' :
120
+ return currentDate;
121
+ case 'Do' :
122
+ return currentDate + ordinal(currentDate);
123
+ case 'DD' :
124
+ return leftZeroFill(currentDate, 2);
125
+ // DAY OF YEAR
126
+ case 'DDD' :
127
+ a = new Date(currentYear, currentMonth, currentDate);
128
+ b = new Date(currentYear, 0, 1);
129
+ return ~~ (((a - b) / 864e5) + 1.5);
130
+ case 'DDDo' :
131
+ a = replaceFunction('DDD');
132
+ return a + ordinal(a);
133
+ case 'DDDD' :
134
+ return leftZeroFill(replaceFunction('DDD'), 3);
135
+ // WEEKDAY
136
+ case 'd' :
137
+ return currentDay;
138
+ case 'do' :
139
+ return currentDay + ordinal(currentDay);
140
+ case 'ddd' :
141
+ return moment.weekdaysShort[currentDay];
142
+ case 'dddd' :
143
+ return moment.weekdays[currentDay];
144
+ // WEEK OF YEAR
145
+ case 'w' :
146
+ a = new Date(currentYear, currentMonth, currentDate - currentDay + 5);
147
+ b = new Date(a.getFullYear(), 0, 4);
148
+ return ~~ ((a - b) / 864e5 / 7 + 1.5);
149
+ case 'wo' :
150
+ a = replaceFunction('w');
151
+ return a + ordinal(a);
152
+ case 'ww' :
153
+ return leftZeroFill(replaceFunction('w'), 2);
154
+ // YEAR
155
+ case 'YY' :
156
+ return leftZeroFill(currentYear % 100, 2);
157
+ case 'YYYY' :
158
+ return currentYear;
159
+ // AM / PM
160
+ case 'a' :
161
+ return currentHours > 11 ? meridiem.pm : meridiem.am;
162
+ case 'A' :
163
+ return currentHours > 11 ? meridiem.PM : meridiem.AM;
164
+ // 24 HOUR
165
+ case 'H' :
166
+ return currentHours;
167
+ case 'HH' :
168
+ return leftZeroFill(currentHours, 2);
169
+ // 12 HOUR
170
+ case 'h' :
171
+ return currentHours % 12 || 12;
172
+ case 'hh' :
173
+ return leftZeroFill(currentHours % 12 || 12, 2);
174
+ // MINUTE
175
+ case 'm' :
176
+ return currentMinutes;
177
+ case 'mm' :
178
+ return leftZeroFill(currentMinutes, 2);
179
+ // SECOND
180
+ case 's' :
181
+ return currentSeconds;
182
+ case 'ss' :
183
+ return leftZeroFill(currentSeconds, 2);
184
+ // TIMEZONE
185
+ case 'zz' :
186
+ // depreciating 'zz' fall through to 'z'
187
+ case 'z' :
188
+ return (date.toString().match(timezoneRegex) || [''])[0].replace(nonuppercaseLetters, '');
189
+ case 'Z' :
190
+ return (currentZone > 0 ? '+' : '-') + leftZeroFill(~~(Math.abs(currentZone) / 60), 2) + ':' + leftZeroFill(~~(Math.abs(currentZone) % 60), 2);
191
+ case 'ZZ' :
192
+ return (currentZone > 0 ? '+' : '-') + leftZeroFill(~~(10 * Math.abs(currentZone) / 6), 4);
193
+ // LONG DATES
194
+ case 'L' :
195
+ case 'LL' :
196
+ case 'LLL' :
197
+ case 'LLLL' :
198
+ case 'LT' :
199
+ return formatDate(date, moment.longDateFormat[input]);
200
+ // DEFAULT
201
+ default :
202
+ return input.replace(/(^\[)|(\\)|\]$/g, "");
203
+ }
204
+ }
205
+ return inputString.replace(charactersToReplace, replaceFunction);
206
+ }
207
+
208
+ // date from string and format string
209
+ function makeDateFromStringAndFormat(string, format) {
210
+ var inArray = [0, 0, 1, 0, 0, 0, 0],
211
+ timezoneHours = 0,
212
+ timezoneMinutes = 0,
213
+ isUsingUTC = false,
214
+ inputParts = string.match(inputCharacters),
215
+ formatParts = format.match(tokenCharacters),
216
+ i,
217
+ isPm;
218
+
219
+ // function to convert string input to date
220
+ function addTime(format, input) {
221
+ var a;
222
+ switch (format) {
223
+ // MONTH
224
+ case 'M' :
225
+ // fall through to MM
226
+ case 'MM' :
227
+ inArray[1] = ~~input - 1;
228
+ break;
229
+ case 'MMM' :
230
+ // fall through to MMMM
231
+ case 'MMMM' :
232
+ for (a = 0; a < 12; a++) {
233
+ if (moment.monthsParse[a].test(input)) {
234
+ inArray[1] = a;
235
+ break;
236
+ }
237
+ }
238
+ break;
239
+ // DAY OF MONTH
240
+ case 'D' :
241
+ // fall through to DDDD
242
+ case 'DD' :
243
+ // fall through to DDDD
244
+ case 'DDD' :
245
+ // fall through to DDDD
246
+ case 'DDDD' :
247
+ inArray[2] = ~~input;
248
+ break;
249
+ // YEAR
250
+ case 'YY' :
251
+ input = ~~input;
252
+ inArray[0] = input + (input > 70 ? 1900 : 2000);
253
+ break;
254
+ case 'YYYY' :
255
+ inArray[0] = ~~Math.abs(input);
256
+ break;
257
+ // AM / PM
258
+ case 'a' :
259
+ // fall through to A
260
+ case 'A' :
261
+ isPm = (input.toLowerCase() === 'pm');
262
+ break;
263
+ // 24 HOUR
264
+ case 'H' :
265
+ // fall through to hh
266
+ case 'HH' :
267
+ // fall through to hh
268
+ case 'h' :
269
+ // fall through to hh
270
+ case 'hh' :
271
+ inArray[3] = ~~input;
272
+ break;
273
+ // MINUTE
274
+ case 'm' :
275
+ // fall through to mm
276
+ case 'mm' :
277
+ inArray[4] = ~~input;
278
+ break;
279
+ // SECOND
280
+ case 's' :
281
+ // fall through to ss
282
+ case 'ss' :
283
+ inArray[5] = ~~input;
284
+ break;
285
+ // TIMEZONE
286
+ case 'Z' :
287
+ // fall through to ZZ
288
+ case 'ZZ' :
289
+ isUsingUTC = true;
290
+ a = input.match(timezoneParseRegex);
291
+ if (a[1]) {
292
+ timezoneHours = ~~a[1];
293
+ }
294
+ if (a[2]) {
295
+ timezoneMinutes = ~~a[2];
296
+ }
297
+ // reverse offsets
298
+ if (a[0] === '-') {
299
+ timezoneHours = -timezoneHours;
300
+ timezoneMinutes = -timezoneMinutes;
301
+ }
302
+ break;
303
+ }
304
+ }
305
+ for (i = 0; i < formatParts.length; i++) {
306
+ addTime(formatParts[i], inputParts[i]);
307
+ }
308
+ // handle am pm
309
+ if (isPm && inArray[3] < 12) {
310
+ inArray[3] += 12;
311
+ }
312
+ // if is 12 am, change hours to 0
313
+ if (isPm === false && inArray[3] === 12) {
314
+ inArray[3] = 0;
315
+ }
316
+ // handle timezone
317
+ inArray[3] += timezoneHours;
318
+ inArray[4] += timezoneMinutes;
319
+ // return
320
+ return isUsingUTC ? new Date(Date.UTC.apply({}, inArray)) : dateFromArray(inArray);
321
+ }
322
+
323
+ // compare two arrays, return the number of differences
324
+ function compareArrays(array1, array2) {
325
+ var len = Math.min(array1.length, array2.length),
326
+ lengthDiff = Math.abs(array1.length - array2.length),
327
+ diffs = 0,
328
+ i;
329
+ for (i = 0; i < len; i++) {
330
+ if (~~array1[i] !== ~~array2[i]) {
331
+ diffs++;
332
+ }
333
+ }
334
+ return diffs + lengthDiff;
335
+ }
336
+
337
+ // date from string and array of format strings
338
+ function makeDateFromStringAndArray(string, formats) {
339
+ var output,
340
+ inputParts = string.match(inputCharacters),
341
+ scores = [],
342
+ scoreToBeat = 99,
343
+ i,
344
+ curDate,
345
+ curScore;
346
+ for (i = 0; i < formats.length; i++) {
347
+ curDate = makeDateFromStringAndFormat(string, formats[i]);
348
+ curScore = compareArrays(inputParts, formatDate(curDate, formats[i]).match(inputCharacters));
349
+ if (curScore < scoreToBeat) {
350
+ scoreToBeat = curScore;
351
+ output = curDate;
352
+ }
353
+ }
354
+ return output;
355
+ }
356
+
357
+ moment = function (input, format) {
358
+ if (input === null) {
359
+ return null;
360
+ }
361
+ var date;
362
+ // parse UnderscoreDate object
363
+ if (input && input._d instanceof Date) {
364
+ date = new Date(+input._d);
365
+ // parse string and format
366
+ } else if (format) {
367
+ if (isArray(format)) {
368
+ date = makeDateFromStringAndArray(input, format);
369
+ } else {
370
+ date = makeDateFromStringAndFormat(input, format);
371
+ }
372
+ // parse everything else
373
+ } else {
374
+ date = input === undefined ? new Date() :
375
+ input instanceof Date ? input :
376
+ isArray(input) ? dateFromArray(input) :
377
+ new Date(input);
378
+ }
379
+ return new Moment(date);
380
+ };
381
+
382
+ // version number
383
+ moment.version = VERSION;
384
+
385
+ // language switching and caching
386
+ moment.lang = function (key, values) {
387
+ var i,
388
+ param,
389
+ req,
390
+ parse = [];
391
+ if (values) {
392
+ for (i = 0; i < 12; i++) {
393
+ parse[i] = new RegExp('^' + values.months[i] + '|^' + values.monthsShort[i].replace('.', ''), 'i');
394
+ }
395
+ values.monthsParse = values.monthsParse || parse;
396
+ languages[key] = values;
397
+ }
398
+ if (languages[key]) {
399
+ for (i = 0; i < paramsToParse.length; i++) {
400
+ param = paramsToParse[i];
401
+ moment[param] = languages[key][param] || moment[param];
402
+ }
403
+ } else {
404
+ if (hasModule) {
405
+ req = require('./lang/' + key);
406
+ moment.lang(key, req);
407
+ }
408
+ }
409
+ };
410
+
411
+ // set default language
412
+ moment.lang('en', {
413
+ months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
414
+ monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
415
+ weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
416
+ weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
417
+ longDateFormat : {
418
+ LT : "h:mm A",
419
+ L : "MM/DD/YYYY",
420
+ LL : "MMMM D YYYY",
421
+ LLL : "MMMM D YYYY LT",
422
+ LLLL : "dddd, MMMM D YYYY LT"
423
+ },
424
+ meridiem : {
425
+ AM : 'AM',
426
+ am : 'am',
427
+ PM : 'PM',
428
+ pm : 'pm'
429
+ },
430
+ calendar : {
431
+ sameDay : '[Today at] LT',
432
+ nextDay : '[Tomorrow at] LT',
433
+ nextWeek : 'dddd [at] LT',
434
+ lastDay : '[Yesterday at] LT',
435
+ lastWeek : '[last] dddd [at] LT',
436
+ sameElse : 'L'
437
+ },
438
+ relativeTime : {
439
+ future : "in %s",
440
+ past : "%s ago",
441
+ s : "a few seconds",
442
+ m : "a minute",
443
+ mm : "%d minutes",
444
+ h : "an hour",
445
+ hh : "%d hours",
446
+ d : "a day",
447
+ dd : "%d days",
448
+ M : "a month",
449
+ MM : "%d months",
450
+ y : "a year",
451
+ yy : "%d years"
452
+ },
453
+ ordinal : function (number) {
454
+ var b = number % 10;
455
+ return (~~ (number % 100 / 10) === 1) ? 'th' :
456
+ (b === 1) ? 'st' :
457
+ (b === 2) ? 'nd' :
458
+ (b === 3) ? 'rd' : 'th';
459
+ }
460
+ });
461
+
462
+ // helper function for _date.from() and _date.fromNow()
463
+ function substituteTimeAgo(string, number, withoutSuffix) {
464
+ var rt = moment.relativeTime[string];
465
+ return (typeof rt === 'function') ?
466
+ rt(number || 1, !!withoutSuffix, string) :
467
+ rt.replace(/%d/i, number || 1);
468
+ }
469
+
470
+ function relativeTime(milliseconds, withoutSuffix) {
471
+ var seconds = round(Math.abs(milliseconds) / 1000),
472
+ minutes = round(seconds / 60),
473
+ hours = round(minutes / 60),
474
+ days = round(hours / 24),
475
+ years = round(days / 365),
476
+ args = seconds < 45 && ['s', seconds] ||
477
+ minutes === 1 && ['m'] ||
478
+ minutes < 45 && ['mm', minutes] ||
479
+ hours === 1 && ['h'] ||
480
+ hours < 22 && ['hh', hours] ||
481
+ days === 1 && ['d'] ||
482
+ days <= 25 && ['dd', days] ||
483
+ days <= 45 && ['M'] ||
484
+ days < 345 && ['MM', round(days / 30)] ||
485
+ years === 1 && ['y'] || ['yy', years];
486
+ args[2] = withoutSuffix;
487
+ return substituteTimeAgo.apply({}, args);
488
+ }
489
+
490
+ // shortcut for prototype
491
+ moment.fn = Moment.prototype = {
492
+
493
+ clone : function () {
494
+ return moment(this);
495
+ },
496
+
497
+ valueOf : function () {
498
+ return +this._d;
499
+ },
500
+
501
+ 'native' : function () {
502
+ return this._d;
503
+ },
504
+
505
+ toString : function () {
506
+ return this._d.toString();
507
+ },
508
+
509
+ toDate : function () {
510
+ return this._d;
511
+ },
512
+
513
+ format : function (inputString) {
514
+ return formatDate(this._d, inputString);
515
+ },
516
+
517
+ add : function (input, val) {
518
+ this._d = dateAddRemove(this._d, input, 1, val);
519
+ return this;
520
+ },
521
+
522
+ subtract : function (input, val) {
523
+ this._d = dateAddRemove(this._d, input, -1, val);
524
+ return this;
525
+ },
526
+
527
+ diff : function (input, val, asFloat) {
528
+ var inputMoment = moment(input),
529
+ diff = this._d - inputMoment._d,
530
+ year = this.year() - inputMoment.year(),
531
+ month = this.month() - inputMoment.month(),
532
+ day = this.day() - inputMoment.day(),
533
+ output;
534
+ if (val === 'months') {
535
+ output = year * 12 + month + day / 30;
536
+ } else if (val === 'years') {
537
+ output = year + month / 12;
538
+ } else {
539
+ output = val === 'seconds' ? diff / 1e3 : // 1000
540
+ val === 'minutes' ? diff / 6e4 : // 1000 * 60
541
+ val === 'hours' ? diff / 36e5 : // 1000 * 60 * 60
542
+ val === 'days' ? diff / 864e5 : // 1000 * 60 * 60 * 24
543
+ val === 'weeks' ? diff / 6048e5 : // 1000 * 60 * 60 * 24 * 7
544
+ val === 'days' ? diff / 3600 : diff;
545
+ }
546
+ return asFloat ? output : round(output);
547
+ },
548
+
549
+ from : function (time, withoutSuffix) {
550
+ var difference = this.diff(time),
551
+ rel = moment.relativeTime,
552
+ output = relativeTime(difference, withoutSuffix);
553
+ return withoutSuffix ? output : (difference <= 0 ? rel.past : rel.future).replace(/%s/i, output);
554
+ },
555
+
556
+ fromNow : function (withoutSuffix) {
557
+ return this.from(moment(), withoutSuffix);
558
+ },
559
+
560
+ calendar : function () {
561
+ var today = moment(),
562
+ todayAtZeroHour = moment([today.year(), today.month(), today.date()]),
563
+ diff = this.diff(todayAtZeroHour, 'days', true),
564
+ calendar = moment.calendar,
565
+ allElse = calendar.sameElse,
566
+ format = diff < -6 ? allElse :
567
+ diff < -1 ? calendar.lastWeek :
568
+ diff < 0 ? calendar.lastDay :
569
+ diff < 1 ? calendar.sameDay :
570
+ diff < 2 ? calendar.nextDay :
571
+ diff < 7 ? calendar.nextWeek : allElse;
572
+ return this.format(typeof format === 'function' ? format.apply(this) : format);
573
+ },
574
+
575
+ isLeapYear : function () {
576
+ var year = this.year();
577
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
578
+ },
579
+
580
+ isDST : function () {
581
+ return this.zone() !== moment([this.year()]).zone();
582
+ },
583
+
584
+ day : function (input) {
585
+ var day = this._d.getDay();
586
+ return input == null ? day :
587
+ this.add({ d : input - day });
588
+ }
589
+ };
590
+
591
+ // helper for adding shortcuts
592
+ function makeShortcut(name, key) {
593
+ moment.fn[name] = function (input) {
594
+ if (input != null) {
595
+ this._d['set' + key](input);
596
+ return this;
597
+ } else {
598
+ return this._d['get' + key]();
599
+ }
600
+ };
601
+ }
602
+
603
+ // loop through and add shortcuts (Month, Date, Hours, Minutes, Seconds, Milliseconds)
604
+ for (i = 0; i < shortcuts.length; i ++) {
605
+ makeShortcut(shortcuts[i].toLowerCase(), shortcuts[i]);
606
+ }
607
+
608
+ // add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear')
609
+ makeShortcut('year', 'FullYear');
610
+
611
+ // add shortcut for timezone offset (no setter)
612
+ moment.fn.zone = function () {
613
+ return this._d.getTimezoneOffset();
614
+ };
615
+
616
+ // CommonJS module is defined
617
+ if (hasModule) {
618
+ module.exports = moment;
619
+ }
620
+ if (typeof window !== 'undefined') {
621
+ window.moment = moment;
622
+ }
623
+
624
+ })(Date);
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: momentjs-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Derek Prior
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: railties
16
+ requirement: &2168558080 !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: *2168558080
25
+ description: ! " Moment.js is a lightweight javascript date library for parsing,
26
+ manipulating, and formatting dates.\n This gem allows for its easy inclusion
27
+ into the rails asset pipeline.\n"
28
+ email:
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/momentjs-rails.rb
34
+ - vendor/assets/javascripts/moment.js
35
+ - MIT-LICENSE
36
+ - README.md
37
+ homepage: https://github.com/derekprior/momentjs-rails
38
+ licenses: []
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ requirements: []
56
+ rubyforge_project:
57
+ rubygems_version: 1.8.11
58
+ signing_key:
59
+ specification_version: 3
60
+ summary: The Moment.js JavaScript library ready to play with Rails.
61
+ test_files: []