source: node_modules/d3-time-format/src/locale.js@ e4c61dd

Last change on this file since e4c61dd was e4c61dd, checked in by istevanoska <ilinastevanoska@…>, 6 months ago

Prototype 1.1

  • Property mode set to 100644
File size: 18.1 KB
Line 
1import {
2 timeDay,
3 timeSunday,
4 timeMonday,
5 timeThursday,
6 timeYear,
7 utcDay,
8 utcSunday,
9 utcMonday,
10 utcThursday,
11 utcYear
12} from "d3-time";
13
14function localDate(d) {
15 if (0 <= d.y && d.y < 100) {
16 var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
17 date.setFullYear(d.y);
18 return date;
19 }
20 return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
21}
22
23function utcDate(d) {
24 if (0 <= d.y && d.y < 100) {
25 var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
26 date.setUTCFullYear(d.y);
27 return date;
28 }
29 return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
30}
31
32function newDate(y, m, d) {
33 return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};
34}
35
36export default function formatLocale(locale) {
37 var locale_dateTime = locale.dateTime,
38 locale_date = locale.date,
39 locale_time = locale.time,
40 locale_periods = locale.periods,
41 locale_weekdays = locale.days,
42 locale_shortWeekdays = locale.shortDays,
43 locale_months = locale.months,
44 locale_shortMonths = locale.shortMonths;
45
46 var periodRe = formatRe(locale_periods),
47 periodLookup = formatLookup(locale_periods),
48 weekdayRe = formatRe(locale_weekdays),
49 weekdayLookup = formatLookup(locale_weekdays),
50 shortWeekdayRe = formatRe(locale_shortWeekdays),
51 shortWeekdayLookup = formatLookup(locale_shortWeekdays),
52 monthRe = formatRe(locale_months),
53 monthLookup = formatLookup(locale_months),
54 shortMonthRe = formatRe(locale_shortMonths),
55 shortMonthLookup = formatLookup(locale_shortMonths);
56
57 var formats = {
58 "a": formatShortWeekday,
59 "A": formatWeekday,
60 "b": formatShortMonth,
61 "B": formatMonth,
62 "c": null,
63 "d": formatDayOfMonth,
64 "e": formatDayOfMonth,
65 "f": formatMicroseconds,
66 "g": formatYearISO,
67 "G": formatFullYearISO,
68 "H": formatHour24,
69 "I": formatHour12,
70 "j": formatDayOfYear,
71 "L": formatMilliseconds,
72 "m": formatMonthNumber,
73 "M": formatMinutes,
74 "p": formatPeriod,
75 "q": formatQuarter,
76 "Q": formatUnixTimestamp,
77 "s": formatUnixTimestampSeconds,
78 "S": formatSeconds,
79 "u": formatWeekdayNumberMonday,
80 "U": formatWeekNumberSunday,
81 "V": formatWeekNumberISO,
82 "w": formatWeekdayNumberSunday,
83 "W": formatWeekNumberMonday,
84 "x": null,
85 "X": null,
86 "y": formatYear,
87 "Y": formatFullYear,
88 "Z": formatZone,
89 "%": formatLiteralPercent
90 };
91
92 var utcFormats = {
93 "a": formatUTCShortWeekday,
94 "A": formatUTCWeekday,
95 "b": formatUTCShortMonth,
96 "B": formatUTCMonth,
97 "c": null,
98 "d": formatUTCDayOfMonth,
99 "e": formatUTCDayOfMonth,
100 "f": formatUTCMicroseconds,
101 "g": formatUTCYearISO,
102 "G": formatUTCFullYearISO,
103 "H": formatUTCHour24,
104 "I": formatUTCHour12,
105 "j": formatUTCDayOfYear,
106 "L": formatUTCMilliseconds,
107 "m": formatUTCMonthNumber,
108 "M": formatUTCMinutes,
109 "p": formatUTCPeriod,
110 "q": formatUTCQuarter,
111 "Q": formatUnixTimestamp,
112 "s": formatUnixTimestampSeconds,
113 "S": formatUTCSeconds,
114 "u": formatUTCWeekdayNumberMonday,
115 "U": formatUTCWeekNumberSunday,
116 "V": formatUTCWeekNumberISO,
117 "w": formatUTCWeekdayNumberSunday,
118 "W": formatUTCWeekNumberMonday,
119 "x": null,
120 "X": null,
121 "y": formatUTCYear,
122 "Y": formatUTCFullYear,
123 "Z": formatUTCZone,
124 "%": formatLiteralPercent
125 };
126
127 var parses = {
128 "a": parseShortWeekday,
129 "A": parseWeekday,
130 "b": parseShortMonth,
131 "B": parseMonth,
132 "c": parseLocaleDateTime,
133 "d": parseDayOfMonth,
134 "e": parseDayOfMonth,
135 "f": parseMicroseconds,
136 "g": parseYear,
137 "G": parseFullYear,
138 "H": parseHour24,
139 "I": parseHour24,
140 "j": parseDayOfYear,
141 "L": parseMilliseconds,
142 "m": parseMonthNumber,
143 "M": parseMinutes,
144 "p": parsePeriod,
145 "q": parseQuarter,
146 "Q": parseUnixTimestamp,
147 "s": parseUnixTimestampSeconds,
148 "S": parseSeconds,
149 "u": parseWeekdayNumberMonday,
150 "U": parseWeekNumberSunday,
151 "V": parseWeekNumberISO,
152 "w": parseWeekdayNumberSunday,
153 "W": parseWeekNumberMonday,
154 "x": parseLocaleDate,
155 "X": parseLocaleTime,
156 "y": parseYear,
157 "Y": parseFullYear,
158 "Z": parseZone,
159 "%": parseLiteralPercent
160 };
161
162 // These recursive directive definitions must be deferred.
163 formats.x = newFormat(locale_date, formats);
164 formats.X = newFormat(locale_time, formats);
165 formats.c = newFormat(locale_dateTime, formats);
166 utcFormats.x = newFormat(locale_date, utcFormats);
167 utcFormats.X = newFormat(locale_time, utcFormats);
168 utcFormats.c = newFormat(locale_dateTime, utcFormats);
169
170 function newFormat(specifier, formats) {
171 return function(date) {
172 var string = [],
173 i = -1,
174 j = 0,
175 n = specifier.length,
176 c,
177 pad,
178 format;
179
180 if (!(date instanceof Date)) date = new Date(+date);
181
182 while (++i < n) {
183 if (specifier.charCodeAt(i) === 37) {
184 string.push(specifier.slice(j, i));
185 if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
186 else pad = c === "e" ? " " : "0";
187 if (format = formats[c]) c = format(date, pad);
188 string.push(c);
189 j = i + 1;
190 }
191 }
192
193 string.push(specifier.slice(j, i));
194 return string.join("");
195 };
196 }
197
198 function newParse(specifier, Z) {
199 return function(string) {
200 var d = newDate(1900, undefined, 1),
201 i = parseSpecifier(d, specifier, string += "", 0),
202 week, day;
203 if (i != string.length) return null;
204
205 // If a UNIX timestamp is specified, return it.
206 if ("Q" in d) return new Date(d.Q);
207 if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0));
208
209 // If this is utcParse, never use the local timezone.
210 if (Z && !("Z" in d)) d.Z = 0;
211
212 // The am-pm flag is 0 for AM, and 1 for PM.
213 if ("p" in d) d.H = d.H % 12 + d.p * 12;
214
215 // If the month was not specified, inherit from the quarter.
216 if (d.m === undefined) d.m = "q" in d ? d.q : 0;
217
218 // Convert day-of-week and week-of-year to day-of-year.
219 if ("V" in d) {
220 if (d.V < 1 || d.V > 53) return null;
221 if (!("w" in d)) d.w = 1;
222 if ("Z" in d) {
223 week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();
224 week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);
225 week = utcDay.offset(week, (d.V - 1) * 7);
226 d.y = week.getUTCFullYear();
227 d.m = week.getUTCMonth();
228 d.d = week.getUTCDate() + (d.w + 6) % 7;
229 } else {
230 week = localDate(newDate(d.y, 0, 1)), day = week.getDay();
231 week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);
232 week = timeDay.offset(week, (d.V - 1) * 7);
233 d.y = week.getFullYear();
234 d.m = week.getMonth();
235 d.d = week.getDate() + (d.w + 6) % 7;
236 }
237 } else if ("W" in d || "U" in d) {
238 if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
239 day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();
240 d.m = 0;
241 d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;
242 }
243
244 // If a time zone is specified, all fields are interpreted as UTC and then
245 // offset according to the specified time zone.
246 if ("Z" in d) {
247 d.H += d.Z / 100 | 0;
248 d.M += d.Z % 100;
249 return utcDate(d);
250 }
251
252 // Otherwise, all fields are in local time.
253 return localDate(d);
254 };
255 }
256
257 function parseSpecifier(d, specifier, string, j) {
258 var i = 0,
259 n = specifier.length,
260 m = string.length,
261 c,
262 parse;
263
264 while (i < n) {
265 if (j >= m) return -1;
266 c = specifier.charCodeAt(i++);
267 if (c === 37) {
268 c = specifier.charAt(i++);
269 parse = parses[c in pads ? specifier.charAt(i++) : c];
270 if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
271 } else if (c != string.charCodeAt(j++)) {
272 return -1;
273 }
274 }
275
276 return j;
277 }
278
279 function parsePeriod(d, string, i) {
280 var n = periodRe.exec(string.slice(i));
281 return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
282 }
283
284 function parseShortWeekday(d, string, i) {
285 var n = shortWeekdayRe.exec(string.slice(i));
286 return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
287 }
288
289 function parseWeekday(d, string, i) {
290 var n = weekdayRe.exec(string.slice(i));
291 return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
292 }
293
294 function parseShortMonth(d, string, i) {
295 var n = shortMonthRe.exec(string.slice(i));
296 return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
297 }
298
299 function parseMonth(d, string, i) {
300 var n = monthRe.exec(string.slice(i));
301 return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
302 }
303
304 function parseLocaleDateTime(d, string, i) {
305 return parseSpecifier(d, locale_dateTime, string, i);
306 }
307
308 function parseLocaleDate(d, string, i) {
309 return parseSpecifier(d, locale_date, string, i);
310 }
311
312 function parseLocaleTime(d, string, i) {
313 return parseSpecifier(d, locale_time, string, i);
314 }
315
316 function formatShortWeekday(d) {
317 return locale_shortWeekdays[d.getDay()];
318 }
319
320 function formatWeekday(d) {
321 return locale_weekdays[d.getDay()];
322 }
323
324 function formatShortMonth(d) {
325 return locale_shortMonths[d.getMonth()];
326 }
327
328 function formatMonth(d) {
329 return locale_months[d.getMonth()];
330 }
331
332 function formatPeriod(d) {
333 return locale_periods[+(d.getHours() >= 12)];
334 }
335
336 function formatQuarter(d) {
337 return 1 + ~~(d.getMonth() / 3);
338 }
339
340 function formatUTCShortWeekday(d) {
341 return locale_shortWeekdays[d.getUTCDay()];
342 }
343
344 function formatUTCWeekday(d) {
345 return locale_weekdays[d.getUTCDay()];
346 }
347
348 function formatUTCShortMonth(d) {
349 return locale_shortMonths[d.getUTCMonth()];
350 }
351
352 function formatUTCMonth(d) {
353 return locale_months[d.getUTCMonth()];
354 }
355
356 function formatUTCPeriod(d) {
357 return locale_periods[+(d.getUTCHours() >= 12)];
358 }
359
360 function formatUTCQuarter(d) {
361 return 1 + ~~(d.getUTCMonth() / 3);
362 }
363
364 return {
365 format: function(specifier) {
366 var f = newFormat(specifier += "", formats);
367 f.toString = function() { return specifier; };
368 return f;
369 },
370 parse: function(specifier) {
371 var p = newParse(specifier += "", false);
372 p.toString = function() { return specifier; };
373 return p;
374 },
375 utcFormat: function(specifier) {
376 var f = newFormat(specifier += "", utcFormats);
377 f.toString = function() { return specifier; };
378 return f;
379 },
380 utcParse: function(specifier) {
381 var p = newParse(specifier += "", true);
382 p.toString = function() { return specifier; };
383 return p;
384 }
385 };
386}
387
388var pads = {"-": "", "_": " ", "0": "0"},
389 numberRe = /^\s*\d+/, // note: ignores next directive
390 percentRe = /^%/,
391 requoteRe = /[\\^$*+?|[\]().{}]/g;
392
393function pad(value, fill, width) {
394 var sign = value < 0 ? "-" : "",
395 string = (sign ? -value : value) + "",
396 length = string.length;
397 return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
398}
399
400function requote(s) {
401 return s.replace(requoteRe, "\\$&");
402}
403
404function formatRe(names) {
405 return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
406}
407
408function formatLookup(names) {
409 return new Map(names.map((name, i) => [name.toLowerCase(), i]));
410}
411
412function parseWeekdayNumberSunday(d, string, i) {
413 var n = numberRe.exec(string.slice(i, i + 1));
414 return n ? (d.w = +n[0], i + n[0].length) : -1;
415}
416
417function parseWeekdayNumberMonday(d, string, i) {
418 var n = numberRe.exec(string.slice(i, i + 1));
419 return n ? (d.u = +n[0], i + n[0].length) : -1;
420}
421
422function parseWeekNumberSunday(d, string, i) {
423 var n = numberRe.exec(string.slice(i, i + 2));
424 return n ? (d.U = +n[0], i + n[0].length) : -1;
425}
426
427function parseWeekNumberISO(d, string, i) {
428 var n = numberRe.exec(string.slice(i, i + 2));
429 return n ? (d.V = +n[0], i + n[0].length) : -1;
430}
431
432function parseWeekNumberMonday(d, string, i) {
433 var n = numberRe.exec(string.slice(i, i + 2));
434 return n ? (d.W = +n[0], i + n[0].length) : -1;
435}
436
437function parseFullYear(d, string, i) {
438 var n = numberRe.exec(string.slice(i, i + 4));
439 return n ? (d.y = +n[0], i + n[0].length) : -1;
440}
441
442function parseYear(d, string, i) {
443 var n = numberRe.exec(string.slice(i, i + 2));
444 return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
445}
446
447function parseZone(d, string, i) {
448 var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
449 return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
450}
451
452function parseQuarter(d, string, i) {
453 var n = numberRe.exec(string.slice(i, i + 1));
454 return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;
455}
456
457function parseMonthNumber(d, string, i) {
458 var n = numberRe.exec(string.slice(i, i + 2));
459 return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
460}
461
462function parseDayOfMonth(d, string, i) {
463 var n = numberRe.exec(string.slice(i, i + 2));
464 return n ? (d.d = +n[0], i + n[0].length) : -1;
465}
466
467function parseDayOfYear(d, string, i) {
468 var n = numberRe.exec(string.slice(i, i + 3));
469 return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
470}
471
472function parseHour24(d, string, i) {
473 var n = numberRe.exec(string.slice(i, i + 2));
474 return n ? (d.H = +n[0], i + n[0].length) : -1;
475}
476
477function parseMinutes(d, string, i) {
478 var n = numberRe.exec(string.slice(i, i + 2));
479 return n ? (d.M = +n[0], i + n[0].length) : -1;
480}
481
482function parseSeconds(d, string, i) {
483 var n = numberRe.exec(string.slice(i, i + 2));
484 return n ? (d.S = +n[0], i + n[0].length) : -1;
485}
486
487function parseMilliseconds(d, string, i) {
488 var n = numberRe.exec(string.slice(i, i + 3));
489 return n ? (d.L = +n[0], i + n[0].length) : -1;
490}
491
492function parseMicroseconds(d, string, i) {
493 var n = numberRe.exec(string.slice(i, i + 6));
494 return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
495}
496
497function parseLiteralPercent(d, string, i) {
498 var n = percentRe.exec(string.slice(i, i + 1));
499 return n ? i + n[0].length : -1;
500}
501
502function parseUnixTimestamp(d, string, i) {
503 var n = numberRe.exec(string.slice(i));
504 return n ? (d.Q = +n[0], i + n[0].length) : -1;
505}
506
507function parseUnixTimestampSeconds(d, string, i) {
508 var n = numberRe.exec(string.slice(i));
509 return n ? (d.s = +n[0], i + n[0].length) : -1;
510}
511
512function formatDayOfMonth(d, p) {
513 return pad(d.getDate(), p, 2);
514}
515
516function formatHour24(d, p) {
517 return pad(d.getHours(), p, 2);
518}
519
520function formatHour12(d, p) {
521 return pad(d.getHours() % 12 || 12, p, 2);
522}
523
524function formatDayOfYear(d, p) {
525 return pad(1 + timeDay.count(timeYear(d), d), p, 3);
526}
527
528function formatMilliseconds(d, p) {
529 return pad(d.getMilliseconds(), p, 3);
530}
531
532function formatMicroseconds(d, p) {
533 return formatMilliseconds(d, p) + "000";
534}
535
536function formatMonthNumber(d, p) {
537 return pad(d.getMonth() + 1, p, 2);
538}
539
540function formatMinutes(d, p) {
541 return pad(d.getMinutes(), p, 2);
542}
543
544function formatSeconds(d, p) {
545 return pad(d.getSeconds(), p, 2);
546}
547
548function formatWeekdayNumberMonday(d) {
549 var day = d.getDay();
550 return day === 0 ? 7 : day;
551}
552
553function formatWeekNumberSunday(d, p) {
554 return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);
555}
556
557function dISO(d) {
558 var day = d.getDay();
559 return (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);
560}
561
562function formatWeekNumberISO(d, p) {
563 d = dISO(d);
564 return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);
565}
566
567function formatWeekdayNumberSunday(d) {
568 return d.getDay();
569}
570
571function formatWeekNumberMonday(d, p) {
572 return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);
573}
574
575function formatYear(d, p) {
576 return pad(d.getFullYear() % 100, p, 2);
577}
578
579function formatYearISO(d, p) {
580 d = dISO(d);
581 return pad(d.getFullYear() % 100, p, 2);
582}
583
584function formatFullYear(d, p) {
585 return pad(d.getFullYear() % 10000, p, 4);
586}
587
588function formatFullYearISO(d, p) {
589 var day = d.getDay();
590 d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);
591 return pad(d.getFullYear() % 10000, p, 4);
592}
593
594function formatZone(d) {
595 var z = d.getTimezoneOffset();
596 return (z > 0 ? "-" : (z *= -1, "+"))
597 + pad(z / 60 | 0, "0", 2)
598 + pad(z % 60, "0", 2);
599}
600
601function formatUTCDayOfMonth(d, p) {
602 return pad(d.getUTCDate(), p, 2);
603}
604
605function formatUTCHour24(d, p) {
606 return pad(d.getUTCHours(), p, 2);
607}
608
609function formatUTCHour12(d, p) {
610 return pad(d.getUTCHours() % 12 || 12, p, 2);
611}
612
613function formatUTCDayOfYear(d, p) {
614 return pad(1 + utcDay.count(utcYear(d), d), p, 3);
615}
616
617function formatUTCMilliseconds(d, p) {
618 return pad(d.getUTCMilliseconds(), p, 3);
619}
620
621function formatUTCMicroseconds(d, p) {
622 return formatUTCMilliseconds(d, p) + "000";
623}
624
625function formatUTCMonthNumber(d, p) {
626 return pad(d.getUTCMonth() + 1, p, 2);
627}
628
629function formatUTCMinutes(d, p) {
630 return pad(d.getUTCMinutes(), p, 2);
631}
632
633function formatUTCSeconds(d, p) {
634 return pad(d.getUTCSeconds(), p, 2);
635}
636
637function formatUTCWeekdayNumberMonday(d) {
638 var dow = d.getUTCDay();
639 return dow === 0 ? 7 : dow;
640}
641
642function formatUTCWeekNumberSunday(d, p) {
643 return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);
644}
645
646function UTCdISO(d) {
647 var day = d.getUTCDay();
648 return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);
649}
650
651function formatUTCWeekNumberISO(d, p) {
652 d = UTCdISO(d);
653 return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
654}
655
656function formatUTCWeekdayNumberSunday(d) {
657 return d.getUTCDay();
658}
659
660function formatUTCWeekNumberMonday(d, p) {
661 return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);
662}
663
664function formatUTCYear(d, p) {
665 return pad(d.getUTCFullYear() % 100, p, 2);
666}
667
668function formatUTCYearISO(d, p) {
669 d = UTCdISO(d);
670 return pad(d.getUTCFullYear() % 100, p, 2);
671}
672
673function formatUTCFullYear(d, p) {
674 return pad(d.getUTCFullYear() % 10000, p, 4);
675}
676
677function formatUTCFullYearISO(d, p) {
678 var day = d.getUTCDay();
679 d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);
680 return pad(d.getUTCFullYear() % 10000, p, 4);
681}
682
683function formatUTCZone() {
684 return "+0000";
685}
686
687function formatLiteralPercent() {
688 return "%";
689}
690
691function formatUnixTimestamp(d) {
692 return +d;
693}
694
695function formatUnixTimestampSeconds(d) {
696 return Math.floor(+d / 1000);
697}
Note: See TracBrowser for help on using the repository browser.