UNPKG

5.18 kBtext/coffeescriptView Raw
1Dates = {}
2
3Dates.padNumber = (num, count, padCharacter) ->
4 padCharacter = '0' if typeof padCharacter is 'undefined'
5 lenDiff = count - String(num).length
6 padding = ''
7 padding += padCharacter while lenDiff-- if lenDiff > 0
8 padding + num
9
10Dates.dayOfYear = (date) ->
11 oneJan = new Date(date.getFullYear(), 0, 1)
12 Math.ceil (date - oneJan) / 86400000
13
14Dates.weekOfYear = (date) ->
15 oneJan = new Date(date.getFullYear(), 0, 1)
16 Math.ceil (((date - oneJan) / 86400000) + oneJan.getDay() + 1) / 7
17
18Dates.isoWeekOfYear = (date) ->
19 target = new Date(date.valueOf())
20 dayNr = (date.getDay() + 6) % 7
21 target.setDate target.getDate() - dayNr + 3
22 jan4 = new Date(target.getFullYear(), 0, 4)
23 dayDiff = (target - jan4) / 86400000
24 1 + Math.ceil(dayDiff / 7)
25
26Dates.tweleveHour = (date) ->
27 if date.getHours() > 12 then date.getHours() - 12 else date.getHours()
28
29Dates.timeZoneOffset = (date) ->
30 hoursDiff = (-date.getTimezoneOffset() / 60)
31 result = Dates.padNumber Math.abs(hoursDiff), 4
32 (if hoursDiff > 0 then '+' else '-') + result
33
34Dates.format = (date, format) ->
35 format.replace Dates.formats, (m, p) ->
36 switch p
37 when 'a' then Dates.abbreviatedWeekdays[date.getDay()]
38 when 'A' then Dates.fullWeekdays[date.getDay()]
39 when 'b' then Dates.abbreviatedMonths[date.getMonth()]
40 when 'B' then Dates.fullMonths[date.getMonth()]
41 when 'c' then date.toLocaleString()
42 when 'C' then Math.round date.getFullYear() / 100
43 when 'd' then Dates.padNumber date.getDate(), 2
44 when 'D' then Dates.format date, '%m/%d/%y'
45 when 'e' then Dates.padNumber date.getDate(), 2, ' '
46 when 'F' then Dates.format date, '%Y-%m-%d'
47 when 'h' then Dates.format date, '%b'
48 when 'H' then Dates.padNumber date.getHours(), 2
49 when 'I' then Dates.padNumber Dates.tweleveHour(date), 2
50 when 'j' then Dates.padNumber Dates.dayOfYear(date), 3
51 when 'k' then Dates.padNumber date.getHours(), 2, ' '
52 when 'l' then Dates.padNumber Dates.tweleveHour(date), 2, ' '
53 when 'L' then Dates.padNumber date.getMilliseconds(), 3
54 when 'm' then Dates.padNumber date.getMonth() + 1, 2
55 when 'M' then Dates.padNumber date.getMinutes(), 2
56 when 'n' then '\n'
57 when 'p' then (if date.getHours() > 11 then 'PM' else 'AM')
58 when 'P' then Dates.format(date, '%p').toLowerCase()
59 when 'r' then Dates.format date, '%I:%M:%S %p'
60 when 'R' then Dates.format date, '%H:%M'
61 when 's' then date.getTime() / 1000
62 when 'S' then Dates.padNumber date.getSeconds(), 2
63 when 't' then '\t'
64 when 'T' then Dates.format date, '%H:%M:%S'
65 when 'u' then (if date.getDay() is 0 then 7 else date.getDay())
66 when 'U' then Dates.padNumber Dates.weekOfYear(date), 2
67 when 'v' then Dates.format date, '%e-%b-%Y'
68 when 'V' then Dates.padNumber Dates.isoWeekOfYear(date), 2
69 when 'W' then Dates.padNumber Dates.weekOfYear(date), 2
70 when 'w' then Dates.padNumber date.getDay(), 2
71 when 'x' then date.toLocaleDateString()
72 when 'X' then date.toLocaleTimeString()
73 when 'y' then String(date.getFullYear()).substring 2
74 when 'Y' then date.getFullYear()
75 when 'z' then Dates.timeZoneOffset date
76 else match
77
78Dates.formats = /%(a|A|b|B|c|C|d|D|e|F|h|H|I|j|k|l|L|m|M|n|p|P|r|R|s|S|t|T|u|U|v|V|W|w|x|X|y|Y|z)/g
79Dates.abbreviatedWeekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat']
80Dates.fullWeekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
81Dates.abbreviatedMonths = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
82Dates.fullMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
83
84# Port of formatDate-js library - https://github.com/michaelbaldry/formatDate-js
85Handlebars.registerHelper 'formatDate', (date, format) ->
86 date = new Date date
87 Dates.format date, format
88
89Handlebars.registerHelper 'now', (format) ->
90 date = new Date()
91 if Utils.isUndefined(format) then date else Dates.format(date, format)
92
93# Modified version of - http://stackoverflow.com/a/3177838
94Handlebars.registerHelper 'timeago', (date) ->
95 date = new Date date
96 seconds = Math.floor((new Date() - date) / 1000)
97
98 interval = Math.floor(seconds / 31536000)
99 return "#{interval} years ago" if interval > 1
100
101 interval = Math.floor(seconds / 2592000)
102 return if interval > 1 then "#{interval} months ago"
103
104 interval = Math.floor(seconds / 86400)
105 return if interval > 1 then "#{interval} days ago"
106
107 interval = Math.floor(seconds / 3600)
108 return if interval > 1 then "#{interval} hours ago"
109
110 interval = Math.floor(seconds / 60)
111 return if interval > 1 then "#{interval} minutes ago"
112
113 if Math.floor(seconds) is 0 then 'Just now' else Math.floor(seconds) + ' seconds ago'