5e566332576b089985c5aa77e3c5f2d529c3c453
[platform/framework/web/crosswalk-tizen.git] /
1 var pad = require('../number/pad');
2 var lpad = require('../string/lpad');
3 var i18n = require('./i18n_');
4 var dayOfTheYear = require('./dayOfTheYear');
5 var timezoneOffset = require('./timezoneOffset');
6 var timezoneAbbr = require('./timezoneAbbr');
7 var weekOfTheYear = require('./weekOfTheYear');
8
9     var _combinations = {
10         'D': '%m/%d/%y',
11         'F': '%Y-%m-%d',
12         'r': '%I:%M:%S %p',
13         'R': '%H:%M',
14         'T': '%H:%M:%S',
15         'x': 'locale',
16         'X': 'locale',
17         'c': 'locale'
18     };
19
20
21     /**
22      * format date based on strftime format
23      */
24     function strftime(date, format, localeData){
25         localeData = localeData  || i18n;
26         var reToken = /%([a-z%])/gi;
27
28         function makeIterator(fn) {
29             return function(match, token){
30                 return fn(date, token, localeData);
31             };
32         }
33
34         return format
35             .replace(reToken, makeIterator(expandCombinations))
36             .replace(reToken, makeIterator(convertToken));
37     }
38
39
40     function expandCombinations(date, token, l10n){
41         if (token in _combinations) {
42             var expanded = _combinations[token];
43             return expanded === 'locale'? l10n[token] : expanded;
44         } else {
45             return '%'+ token;
46         }
47     }
48
49
50     function convertToken(date, token, l10n){
51         switch (token){
52             case 'a':
53                 return l10n.days_abbr[date.getDay()];
54             case 'A':
55                 return l10n.days[date.getDay()];
56             case 'h':
57             case 'b':
58                 return l10n.months_abbr[date.getMonth()];
59             case 'B':
60                 return l10n.months[date.getMonth()];
61             case 'C':
62                 return pad(Math.floor(date.getFullYear() / 100), 2);
63             case 'd':
64                 return pad(date.getDate(), 2);
65             case 'e':
66                 return pad(date.getDate(), 2, ' ');
67             case 'H':
68                 return pad(date.getHours(), 2);
69             case 'I':
70                 return pad(date.getHours() % 12, 2);
71             case 'j':
72                 return pad(dayOfTheYear(date), 3);
73             case 'l':
74                 return lpad(date.getHours() % 12, 2);
75             case 'L':
76                 return pad(date.getMilliseconds(), 3);
77             case 'm':
78                 return pad(date.getMonth() + 1, 2);
79             case 'M':
80                 return pad(date.getMinutes(), 2);
81             case 'n':
82                 return '\n';
83             case 'p':
84                 return date.getHours() >= 12? l10n.pm : l10n.am;
85             case 'P':
86                 return convertToken(date, 'p', l10n).toLowerCase();
87             case 's':
88                 return date.getTime() / 1000;
89             case 'S':
90                 return pad(date.getSeconds(), 2);
91             case 't':
92                 return '\t';
93             case 'u':
94                 var day = date.getDay();
95                 return day === 0? 7 : day;
96             case 'U':
97                 return pad(weekOfTheYear(date), 2);
98             case 'w':
99                 return date.getDay();
100             case 'W':
101                 return pad(weekOfTheYear(date, 1), 2);
102             case 'y':
103                 return pad(date.getFullYear() % 100, 2);
104             case 'Y':
105                 return pad(date.getFullYear(), 4);
106             case 'z':
107                 return timezoneOffset(date);
108             case 'Z':
109                 return timezoneAbbr(date);
110             case '%':
111                 return '%';
112             default:
113                 // keep unrecognized tokens
114                 return '%'+ token;
115         }
116     }
117
118
119     module.exports = strftime;
120
121