Quick and ugly hack to allow multiple locales.
Fixes #750. This isn’t the final implementation, but more of a proof of concept demonstrating how to scope any code that requires localization within a closure that has access to locale-specific variables. In the next pass, I can go through this implementation and more cleanly separate locale-dependent from locale- independent code, and only put locale-dependent code within the closure. Also, we may want to use an options object rather than passing a zillion arguments to d3.locale, because a many-argument method is hard to use and may make it harder to extend the API in the future. This commit also breaks the ability to change the default locale during the build process, but this should be easy to restore.
This commit is contained in:
Родитель
3234f47ad3
Коммит
8349aa171c
10
Makefile
10
Makefile
|
@ -1,10 +1,6 @@
|
|||
LOCALE ?= en_US
|
||||
|
||||
GENERATED_FILES = \
|
||||
d3.js \
|
||||
d3.min.js \
|
||||
src/format/format-localized.js \
|
||||
src/time/format-localized.js \
|
||||
bower.json \
|
||||
component.json
|
||||
|
||||
|
@ -15,12 +11,6 @@ all: $(GENERATED_FILES)
|
|||
test:
|
||||
@npm test
|
||||
|
||||
src/format/format-localized.js: bin/locale src/format/format-locale.js
|
||||
LC_NUMERIC=$(LOCALE) LC_MONETARY=$(LOCALE) locale -ck LC_NUMERIC LC_MONETARY | bin/locale src/format/format-locale.js > $@
|
||||
|
||||
src/time/format-localized.js: bin/locale src/time/format-locale.js
|
||||
LC_TIME=$(LOCALE) locale -ck LC_TIME | bin/locale src/time/format-locale.js > $@
|
||||
|
||||
src/start.js: package.json bin/start
|
||||
bin/start > $@
|
||||
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -1,4 +0,0 @@
|
|||
var d3_format_decimalPoint = {decimal_point},
|
||||
d3_format_thousandsSeparator = {thousands_sep},
|
||||
d3_format_grouping = {grouping},
|
||||
d3_format_currencySymbol = {currency_symbol};
|
|
@ -1,5 +0,0 @@
|
|||
var d3_format_decimalPoint = ".",
|
||||
d3_format_thousandsSeparator = ",",
|
||||
d3_format_grouping = [3, 3],
|
||||
d3_format_currencySymbol = "$";
|
||||
|
|
@ -1,144 +1,3 @@
|
|||
import "../arrays/map";
|
||||
import "../core/identity";
|
||||
import "format-localized";
|
||||
import "formatPrefix";
|
||||
import "round";
|
||||
import "../locale/en-US";
|
||||
|
||||
d3.format = function(specifier) {
|
||||
var match = d3_format_re.exec(specifier),
|
||||
fill = match[1] || " ",
|
||||
align = match[2] || ">",
|
||||
sign = match[3] || "",
|
||||
symbol = match[4] || "",
|
||||
zfill = match[5],
|
||||
width = +match[6],
|
||||
comma = match[7],
|
||||
precision = match[8],
|
||||
type = match[9],
|
||||
scale = 1,
|
||||
suffix = "",
|
||||
integer = false;
|
||||
|
||||
if (precision) precision = +precision.substring(1);
|
||||
|
||||
if (zfill || fill === "0" && align === "=") {
|
||||
zfill = fill = "0";
|
||||
align = "=";
|
||||
if (comma) width -= Math.floor((width - 1) / 4);
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case "n": comma = true; type = "g"; break;
|
||||
case "%": scale = 100; suffix = "%"; type = "f"; break;
|
||||
case "p": scale = 100; suffix = "%"; type = "r"; break;
|
||||
case "b":
|
||||
case "o":
|
||||
case "x":
|
||||
case "X": if (symbol === "#") symbol = "0" + type.toLowerCase();
|
||||
case "c":
|
||||
case "d": integer = true; precision = 0; break;
|
||||
case "s": scale = -1; type = "r"; break;
|
||||
}
|
||||
|
||||
if (symbol === "#") symbol = "";
|
||||
else if (symbol === "$") symbol = d3_format_currencySymbol;
|
||||
|
||||
// If no precision is specified for r, fallback to general notation.
|
||||
if (type == "r" && !precision) type = "g";
|
||||
|
||||
// Ensure that the requested precision is in the supported range.
|
||||
if (precision != null) {
|
||||
if (type == "g") precision = Math.max(1, Math.min(21, precision));
|
||||
else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision));
|
||||
}
|
||||
|
||||
type = d3_format_types.get(type) || d3_format_typeDefault;
|
||||
|
||||
var zcomma = zfill && comma;
|
||||
|
||||
return function(value) {
|
||||
|
||||
// Return the empty string for floats formatted as ints.
|
||||
if (integer && (value % 1)) return "";
|
||||
|
||||
// Convert negative to positive, and record the sign prefix.
|
||||
var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign;
|
||||
|
||||
// Apply the scale, computing it from the value's exponent for si format.
|
||||
if (scale < 0) {
|
||||
var prefix = d3.formatPrefix(value, precision);
|
||||
value = prefix.scale(value);
|
||||
suffix = prefix.symbol;
|
||||
} else {
|
||||
value *= scale;
|
||||
}
|
||||
|
||||
// Convert to the desired precision.
|
||||
value = type(value, precision);
|
||||
|
||||
// Break the value into the integer part (before) and decimal part (after).
|
||||
var i = value.lastIndexOf("."),
|
||||
before = i < 0 ? value : value.substring(0, i),
|
||||
after = i < 0 ? "" : d3_format_decimalPoint + value.substring(i + 1);
|
||||
|
||||
// If the fill character is not "0", grouping is applied before padding.
|
||||
if (!zfill && comma) before = d3_format_group(before);
|
||||
|
||||
var length = symbol.length + before.length + after.length + (zcomma ? 0 : negative.length),
|
||||
padding = length < width ? new Array(length = width - length + 1).join(fill) : "";
|
||||
|
||||
// If the fill character is "0", grouping is applied after padding.
|
||||
if (zcomma) before = d3_format_group(padding + before);
|
||||
|
||||
// Apply symbol as prefix. TODO allow suffix symbols
|
||||
negative += symbol;
|
||||
|
||||
// Rejoin integer and decimal parts.
|
||||
value = before + after;
|
||||
|
||||
return (align === "<" ? negative + value + padding
|
||||
: align === ">" ? padding + negative + value
|
||||
: align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length)
|
||||
: negative + (zcomma ? value : padding + value)) + suffix;
|
||||
};
|
||||
};
|
||||
|
||||
// [[fill]align][sign][symbol][0][width][,][.precision][type]
|
||||
var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i;
|
||||
|
||||
var d3_format_types = d3.map({
|
||||
b: function(x) { return x.toString(2); },
|
||||
c: function(x) { return String.fromCharCode(x); },
|
||||
o: function(x) { return x.toString(8); },
|
||||
x: function(x) { return x.toString(16); },
|
||||
X: function(x) { return x.toString(16).toUpperCase(); },
|
||||
g: function(x, p) { return x.toPrecision(p); },
|
||||
e: function(x, p) { return x.toExponential(p); },
|
||||
f: function(x, p) { return x.toFixed(p); },
|
||||
r: function(x, p) { return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p)))); }
|
||||
});
|
||||
|
||||
function d3_format_precision(x, p) {
|
||||
return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);
|
||||
}
|
||||
|
||||
function d3_format_typeDefault(x) {
|
||||
return x + "";
|
||||
}
|
||||
|
||||
// Apply comma grouping for thousands.
|
||||
var d3_format_group = d3_identity;
|
||||
if (d3_format_grouping) {
|
||||
var d3_format_groupingLength = d3_format_grouping.length;
|
||||
d3_format_group = function(value) {
|
||||
var i = value.length,
|
||||
t = [],
|
||||
j = 0,
|
||||
g = d3_format_grouping[0];
|
||||
while (i > 0 && g > 0) {
|
||||
t.push(value.substring(i -= g, i + g));
|
||||
g = d3_format_grouping[j = (j + 1) % d3_format_groupingLength];
|
||||
}
|
||||
return t.reverse().join(d3_format_thousandsSeparator);
|
||||
};
|
||||
}
|
||||
var d3_format = d3.format = d3_locale_enUS.numberFormat;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import "format";
|
||||
import "precision";
|
||||
import "round";
|
||||
import "../math/abs";
|
||||
|
||||
var d3_formatPrefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"].map(d3_formatPrefix);
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
function d3_format_precision(x, p) {
|
||||
return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
// XXX below
|
||||
|
||||
import "../arrays/map";
|
||||
import "precision";
|
||||
|
||||
// [[fill]align][sign][symbol][0][width][,][.precision][type]
|
||||
var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i;
|
||||
|
||||
var d3_format_types = d3.map({
|
||||
b: function(x) { return x.toString(2); },
|
||||
c: function(x) { return String.fromCharCode(x); },
|
||||
o: function(x) { return x.toString(8); },
|
||||
x: function(x) { return x.toString(16); },
|
||||
X: function(x) { return x.toString(16).toUpperCase(); },
|
||||
g: function(x, p) { return x.toPrecision(p); },
|
||||
e: function(x, p) { return x.toExponential(p); },
|
||||
f: function(x, p) { return x.toFixed(p); },
|
||||
r: function(x, p) { return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p)))); }
|
||||
});
|
||||
|
||||
function d3_format_typeDefault(x) {
|
||||
return x + "";
|
||||
}
|
|
@ -1,5 +1,3 @@
|
|||
import "../core/identity";
|
||||
import "../core/noop";
|
||||
import "../math/abs";
|
||||
import "geo";
|
||||
import "stream";
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import "../arrays/map";
|
||||
import "../arrays/permute";
|
||||
import "../arrays/range";
|
||||
import "../core/identity";
|
||||
import "layout";
|
||||
|
||||
// data is two-dimensional array of x,y; we populate y0
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
import "locale";
|
||||
|
||||
var d3_locale_enUS = d3.locale(
|
||||
".", // decimalPoint
|
||||
",", // thousandsSeparator
|
||||
[3, 3], // grouping
|
||||
"$", // currencySymbol
|
||||
"%a %b %e %X %Y", // formatDateTime
|
||||
"%m/%d/%Y", // formatDate
|
||||
"%H:%M:%S", // formatTime
|
||||
["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // days
|
||||
["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // dayAbbreviations
|
||||
["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], // months
|
||||
["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] // monthAbbreviations
|
||||
);
|
|
@ -0,0 +1,26 @@
|
|||
// XXX avoid globals within localized closure
|
||||
import "../core/identity";
|
||||
import "../format/re";
|
||||
import "../time/interval";
|
||||
|
||||
d3.locale = function(
|
||||
d3_format_decimalPoint,
|
||||
d3_format_thousandsSeparator,
|
||||
d3_format_grouping,
|
||||
d3_format_currencySymbol,
|
||||
d3_time_formatDateTime,
|
||||
d3_time_formatDate,
|
||||
d3_time_formatTime,
|
||||
d3_time_days,
|
||||
d3_time_dayAbbreviations,
|
||||
d3_time_months,
|
||||
d3_time_monthAbbreviations) {
|
||||
|
||||
import "number-format";
|
||||
import "time-format";
|
||||
|
||||
return {
|
||||
numberFormat: d3_format,
|
||||
timeFormat: d3_time_format
|
||||
};
|
||||
};
|
|
@ -0,0 +1,121 @@
|
|||
import "../arrays/map";
|
||||
import "../core/identity";
|
||||
import "../format/formatPrefix";
|
||||
import "../format/precision";
|
||||
import "../format/round";
|
||||
|
||||
function d3_format(specifier) {
|
||||
var match = d3_format_re.exec(specifier),
|
||||
fill = match[1] || " ",
|
||||
align = match[2] || ">",
|
||||
sign = match[3] || "",
|
||||
symbol = match[4] || "",
|
||||
zfill = match[5],
|
||||
width = +match[6],
|
||||
comma = match[7],
|
||||
precision = match[8],
|
||||
type = match[9],
|
||||
scale = 1,
|
||||
suffix = "",
|
||||
integer = false;
|
||||
|
||||
if (precision) precision = +precision.substring(1);
|
||||
|
||||
if (zfill || fill === "0" && align === "=") {
|
||||
zfill = fill = "0";
|
||||
align = "=";
|
||||
if (comma) width -= Math.floor((width - 1) / 4);
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case "n": comma = true; type = "g"; break;
|
||||
case "%": scale = 100; suffix = "%"; type = "f"; break;
|
||||
case "p": scale = 100; suffix = "%"; type = "r"; break;
|
||||
case "b":
|
||||
case "o":
|
||||
case "x":
|
||||
case "X": if (symbol === "#") symbol = "0" + type.toLowerCase();
|
||||
case "c":
|
||||
case "d": integer = true; precision = 0; break;
|
||||
case "s": scale = -1; type = "r"; break;
|
||||
}
|
||||
|
||||
if (symbol === "#") symbol = "";
|
||||
else if (symbol === "$") symbol = d3_format_currencySymbol;
|
||||
|
||||
// If no precision is specified for r, fallback to general notation.
|
||||
if (type == "r" && !precision) type = "g";
|
||||
|
||||
// Ensure that the requested precision is in the supported range.
|
||||
if (precision != null) {
|
||||
if (type == "g") precision = Math.max(1, Math.min(21, precision));
|
||||
else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision));
|
||||
}
|
||||
|
||||
type = d3_format_types.get(type) || d3_format_typeDefault;
|
||||
|
||||
var zcomma = zfill && comma;
|
||||
|
||||
return function(value) {
|
||||
|
||||
// Return the empty string for floats formatted as ints.
|
||||
if (integer && (value % 1)) return "";
|
||||
|
||||
// Convert negative to positive, and record the sign prefix.
|
||||
var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign;
|
||||
|
||||
// Apply the scale, computing it from the value's exponent for si format.
|
||||
if (scale < 0) {
|
||||
var prefix = d3.formatPrefix(value, precision);
|
||||
value = prefix.scale(value);
|
||||
suffix = prefix.symbol;
|
||||
} else {
|
||||
value *= scale;
|
||||
}
|
||||
|
||||
// Convert to the desired precision.
|
||||
value = type(value, precision);
|
||||
|
||||
// Break the value into the integer part (before) and decimal part (after).
|
||||
var i = value.lastIndexOf("."),
|
||||
before = i < 0 ? value : value.substring(0, i),
|
||||
after = i < 0 ? "" : d3_format_decimalPoint + value.substring(i + 1);
|
||||
|
||||
// If the fill character is not "0", grouping is applied before padding.
|
||||
if (!zfill && comma) before = d3_format_group(before);
|
||||
|
||||
var length = symbol.length + before.length + after.length + (zcomma ? 0 : negative.length),
|
||||
padding = length < width ? new Array(length = width - length + 1).join(fill) : "";
|
||||
|
||||
// If the fill character is "0", grouping is applied after padding.
|
||||
if (zcomma) before = d3_format_group(padding + before);
|
||||
|
||||
// Apply symbol as prefix. TODO allow suffix symbols
|
||||
negative += symbol;
|
||||
|
||||
// Rejoin integer and decimal parts.
|
||||
value = before + after;
|
||||
|
||||
return (align === "<" ? negative + value + padding
|
||||
: align === ">" ? padding + negative + value
|
||||
: align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length)
|
||||
: negative + (zcomma ? value : padding + value)) + suffix;
|
||||
};
|
||||
};
|
||||
|
||||
// Apply comma grouping for thousands.
|
||||
var d3_format_group = d3_identity;
|
||||
if (d3_format_grouping) {
|
||||
var d3_format_groupingLength = d3_format_grouping.length;
|
||||
d3_format_group = function(value) {
|
||||
var i = value.length,
|
||||
t = [],
|
||||
j = 0,
|
||||
g = d3_format_grouping[0];
|
||||
while (i > 0 && g > 0) {
|
||||
t.push(value.substring(i -= g, i + g));
|
||||
g = d3_format_grouping[j = (j + 1) % d3_format_groupingLength];
|
||||
}
|
||||
return t.reverse().join(d3_format_thousandsSeparator);
|
||||
};
|
||||
}
|
|
@ -0,0 +1,319 @@
|
|||
import "../arrays/map";
|
||||
import "../format/requote";
|
||||
import "../math/abs";
|
||||
import "../time/day";
|
||||
import "../time/time";
|
||||
import "../time/week";
|
||||
|
||||
function d3_time_format(template) {
|
||||
var n = template.length;
|
||||
|
||||
function format(date) {
|
||||
var string = [],
|
||||
i = -1,
|
||||
j = 0,
|
||||
c,
|
||||
p,
|
||||
f;
|
||||
while (++i < n) {
|
||||
if (template.charCodeAt(i) === 37) {
|
||||
string.push(template.substring(j, i));
|
||||
if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);
|
||||
if (f = d3_time_formats[c]) c = f(date, p == null ? (c === "e" ? " " : "0") : p);
|
||||
string.push(c);
|
||||
j = i + 1;
|
||||
}
|
||||
}
|
||||
string.push(template.substring(j, i));
|
||||
return string.join("");
|
||||
}
|
||||
|
||||
format.parse = function(string) {
|
||||
var d = {y: 1900, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0, Z: null},
|
||||
i = d3_time_parse(d, template, string, 0);
|
||||
if (i != string.length) return null;
|
||||
|
||||
// The am-pm flag is 0 for AM, and 1 for PM.
|
||||
if ("p" in d) d.H = d.H % 12 + d.p * 12;
|
||||
|
||||
// If a time zone is specified, it is always relative to UTC;
|
||||
// we need to use d3_date_utc if we aren’t already.
|
||||
var localZ = d.Z != null && d3_date !== d3_date_utc,
|
||||
date = new (localZ ? d3_date_utc : d3_date);
|
||||
|
||||
// Set year, month, date.
|
||||
if ("j" in d) date.setFullYear(d.y, 0, d.j);
|
||||
else if ("w" in d && ("W" in d || "U" in d)) {
|
||||
date.setFullYear(d.y, 0, 1);
|
||||
date.setFullYear(d.y, 0, "W" in d
|
||||
? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7
|
||||
: d.w + d.U * 7 - (date.getDay() + 6) % 7);
|
||||
} else date.setFullYear(d.y, d.m, d.d);
|
||||
|
||||
// Set hours, minutes, seconds and milliseconds.
|
||||
date.setHours(d.H + Math.floor(d.Z / 100), d.M + d.Z % 100, d.S, d.L);
|
||||
|
||||
return localZ ? date._ : date;
|
||||
};
|
||||
|
||||
format.toString = function() {
|
||||
return template;
|
||||
};
|
||||
|
||||
return format;
|
||||
}
|
||||
|
||||
function d3_time_parse(date, template, string, j) {
|
||||
var c,
|
||||
p,
|
||||
t,
|
||||
i = 0,
|
||||
n = template.length,
|
||||
m = string.length;
|
||||
while (i < n) {
|
||||
if (j >= m) return -1;
|
||||
c = template.charCodeAt(i++);
|
||||
if (c === 37) {
|
||||
t = template.charAt(i++);
|
||||
p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];
|
||||
if (!p || ((j = p(date, string, j)) < 0)) return -1;
|
||||
} else if (c != string.charCodeAt(j++)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
function d3_time_formatRe(names) {
|
||||
return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i");
|
||||
}
|
||||
|
||||
function d3_time_formatLookup(names) {
|
||||
var map = new d3_Map, i = -1, n = names.length;
|
||||
while (++i < n) map.set(names[i].toLowerCase(), i);
|
||||
return map;
|
||||
}
|
||||
|
||||
function d3_time_formatPad(value, fill, width) {
|
||||
var sign = value < 0 ? "-" : "",
|
||||
string = (sign ? -value : value) + "",
|
||||
length = string.length;
|
||||
return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
|
||||
}
|
||||
|
||||
var d3_time_dayRe = d3_time_formatRe(d3_time_days),
|
||||
d3_time_dayLookup = d3_time_formatLookup(d3_time_days),
|
||||
d3_time_dayAbbrevRe = d3_time_formatRe(d3_time_dayAbbreviations),
|
||||
d3_time_dayAbbrevLookup = d3_time_formatLookup(d3_time_dayAbbreviations),
|
||||
d3_time_monthRe = d3_time_formatRe(d3_time_months),
|
||||
d3_time_monthLookup = d3_time_formatLookup(d3_time_months),
|
||||
d3_time_monthAbbrevRe = d3_time_formatRe(d3_time_monthAbbreviations),
|
||||
d3_time_monthAbbrevLookup = d3_time_formatLookup(d3_time_monthAbbreviations),
|
||||
d3_time_percentRe = /^%/;
|
||||
|
||||
var d3_time_formatPads = {
|
||||
"-": "",
|
||||
"_": " ",
|
||||
"0": "0"
|
||||
};
|
||||
|
||||
var d3_time_formats = {
|
||||
a: function(d) { return d3_time_dayAbbreviations[d.getDay()]; },
|
||||
A: function(d) { return d3_time_days[d.getDay()]; },
|
||||
b: function(d) { return d3_time_monthAbbreviations[d.getMonth()]; },
|
||||
B: function(d) { return d3_time_months[d.getMonth()]; },
|
||||
c: d3_time_format(d3_time_formatDateTime),
|
||||
d: function(d, p) { return d3_time_formatPad(d.getDate(), p, 2); },
|
||||
e: function(d, p) { return d3_time_formatPad(d.getDate(), p, 2); },
|
||||
H: function(d, p) { return d3_time_formatPad(d.getHours(), p, 2); },
|
||||
I: function(d, p) { return d3_time_formatPad(d.getHours() % 12 || 12, p, 2); },
|
||||
j: function(d, p) { return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3); },
|
||||
L: function(d, p) { return d3_time_formatPad(d.getMilliseconds(), p, 3); },
|
||||
m: function(d, p) { return d3_time_formatPad(d.getMonth() + 1, p, 2); },
|
||||
M: function(d, p) { return d3_time_formatPad(d.getMinutes(), p, 2); },
|
||||
p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; },
|
||||
S: function(d, p) { return d3_time_formatPad(d.getSeconds(), p, 2); },
|
||||
U: function(d, p) { return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2); },
|
||||
w: function(d) { return d.getDay(); },
|
||||
W: function(d, p) { return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2); },
|
||||
x: d3_time_format(d3_time_formatDate),
|
||||
X: d3_time_format(d3_time_formatTime),
|
||||
y: function(d, p) { return d3_time_formatPad(d.getFullYear() % 100, p, 2); },
|
||||
Y: function(d, p) { return d3_time_formatPad(d.getFullYear() % 10000, p, 4); },
|
||||
Z: d3_time_zone,
|
||||
"%": function() { return "%"; }
|
||||
};
|
||||
|
||||
var d3_time_parsers = {
|
||||
a: d3_time_parseWeekdayAbbrev,
|
||||
A: d3_time_parseWeekday,
|
||||
b: d3_time_parseMonthAbbrev,
|
||||
B: d3_time_parseMonth,
|
||||
c: d3_time_parseLocaleFull,
|
||||
d: d3_time_parseDay,
|
||||
e: d3_time_parseDay,
|
||||
H: d3_time_parseHour24,
|
||||
I: d3_time_parseHour24,
|
||||
j: d3_time_parseDayOfYear,
|
||||
L: d3_time_parseMilliseconds,
|
||||
m: d3_time_parseMonthNumber,
|
||||
M: d3_time_parseMinutes,
|
||||
p: d3_time_parseAmPm,
|
||||
S: d3_time_parseSeconds,
|
||||
U: d3_time_parseWeekNumberSunday,
|
||||
w: d3_time_parseWeekdayNumber,
|
||||
W: d3_time_parseWeekNumberMonday,
|
||||
x: d3_time_parseLocaleDate,
|
||||
X: d3_time_parseLocaleTime,
|
||||
y: d3_time_parseYear,
|
||||
Y: d3_time_parseFullYear,
|
||||
Z: d3_time_parseZone,
|
||||
"%": d3_time_parseLiteralPercent
|
||||
};
|
||||
|
||||
function d3_time_parseWeekdayAbbrev(date, string, i) {
|
||||
d3_time_dayAbbrevRe.lastIndex = 0;
|
||||
var n = d3_time_dayAbbrevRe.exec(string.substring(i));
|
||||
return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseWeekday(date, string, i) {
|
||||
d3_time_dayRe.lastIndex = 0;
|
||||
var n = d3_time_dayRe.exec(string.substring(i));
|
||||
return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseWeekdayNumber(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 1));
|
||||
return n ? (date.w = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseWeekNumberSunday(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i));
|
||||
return n ? (date.U = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseWeekNumberMonday(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i));
|
||||
return n ? (date.W = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseMonthAbbrev(date, string, i) {
|
||||
d3_time_monthAbbrevRe.lastIndex = 0;
|
||||
var n = d3_time_monthAbbrevRe.exec(string.substring(i));
|
||||
return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseMonth(date, string, i) {
|
||||
d3_time_monthRe.lastIndex = 0;
|
||||
var n = d3_time_monthRe.exec(string.substring(i));
|
||||
return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseLocaleFull(date, string, i) {
|
||||
return d3_time_parse(date, d3_time_formats.c.toString(), string, i);
|
||||
}
|
||||
|
||||
function d3_time_parseLocaleDate(date, string, i) {
|
||||
return d3_time_parse(date, d3_time_formats.x.toString(), string, i);
|
||||
}
|
||||
|
||||
function d3_time_parseLocaleTime(date, string, i) {
|
||||
return d3_time_parse(date, d3_time_formats.X.toString(), string, i);
|
||||
}
|
||||
|
||||
function d3_time_parseFullYear(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 4));
|
||||
return n ? (date.y = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseYear(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 2));
|
||||
return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseZone(date, string, i) {
|
||||
return /^[+-]\d{4}$/.test(string = string.substring(i, i + 5))
|
||||
? (date.Z = +string, i + 5)
|
||||
: -1;
|
||||
}
|
||||
|
||||
function d3_time_expandYear(d) {
|
||||
return d + (d > 68 ? 1900 : 2000);
|
||||
}
|
||||
|
||||
function d3_time_parseMonthNumber(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 2));
|
||||
return n ? (date.m = n[0] - 1, i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseDay(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 2));
|
||||
return n ? (date.d = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseDayOfYear(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 3));
|
||||
return n ? (date.j = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
// Note: we don't validate that the hour is in the range [0,23] or [1,12].
|
||||
function d3_time_parseHour24(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 2));
|
||||
return n ? (date.H = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseMinutes(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 2));
|
||||
return n ? (date.M = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseSeconds(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 2));
|
||||
return n ? (date.S = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseMilliseconds(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 3));
|
||||
return n ? (date.L = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
// Note: we don't look at the next directive.
|
||||
var d3_time_numberRe = /^\s*\d+/;
|
||||
|
||||
function d3_time_parseAmPm(date, string, i) {
|
||||
var n = d3_time_amPmLookup.get(string.substring(i, i += 2).toLowerCase());
|
||||
return n == null ? -1 : (date.p = n, i);
|
||||
}
|
||||
|
||||
var d3_time_amPmLookup = d3.map({
|
||||
am: 0,
|
||||
pm: 1
|
||||
});
|
||||
|
||||
// TODO table of time zone offset names?
|
||||
function d3_time_zone(d) {
|
||||
var z = d.getTimezoneOffset(),
|
||||
zs = z > 0 ? "-" : "+",
|
||||
zh = ~~(abs(z) / 60),
|
||||
zm = abs(z) % 60;
|
||||
return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2);
|
||||
}
|
||||
|
||||
function d3_time_parseLiteralPercent(date, string, i) {
|
||||
d3_time_percentRe.lastIndex = 0;
|
||||
var n = d3_time_percentRe.exec(string.substring(i, i + 1));
|
||||
return n ? i + n[0].length : -1;
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
import "../core/identity";
|
||||
|
||||
function d3_scale_nice(domain, nice) {
|
||||
var i0 = 0,
|
||||
i1 = domain.length - 1,
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import "../core/identity";
|
||||
import "../math/trigonometry";
|
||||
import "../scale/linear";
|
||||
import "../scale/scale";
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import "../core/identity";
|
||||
import "../core/document";
|
||||
import "../core/rebind";
|
||||
import "../event/dispatch";
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
// The date and time format (%c), date format (%x) and time format (%X).
|
||||
var d3_time_formatDateTime = {d_t_fmt},
|
||||
d3_time_formatDate = {d_fmt},
|
||||
d3_time_formatTime = {t_fmt};
|
||||
|
||||
// The weekday and month names.
|
||||
var d3_time_days = {day},
|
||||
d3_time_dayAbbreviations = {abday},
|
||||
d3_time_months = {mon},
|
||||
d3_time_monthAbbreviations = {abmon};
|
|
@ -1,11 +0,0 @@
|
|||
// The date and time format (%c), date format (%x) and time format (%X).
|
||||
var d3_time_formatDateTime = "%a %b %e %X %Y",
|
||||
d3_time_formatDate = "%m/%d/%Y",
|
||||
d3_time_formatTime = "%H:%M:%S";
|
||||
|
||||
// The weekday and month names.
|
||||
var d3_time_days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
|
||||
d3_time_dayAbbreviations = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
||||
d3_time_months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
|
||||
d3_time_monthAbbreviations = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
||||
|
|
@ -1,322 +1,3 @@
|
|||
import "../arrays/map";
|
||||
import "../format/requote";
|
||||
import "../math/abs";
|
||||
import "day";
|
||||
import "format-localized";
|
||||
import "time";
|
||||
import "week";
|
||||
import "../locale/en-US";
|
||||
|
||||
d3_time.format = d3_time_format;
|
||||
|
||||
function d3_time_format(template) {
|
||||
var n = template.length;
|
||||
|
||||
function format(date) {
|
||||
var string = [],
|
||||
i = -1,
|
||||
j = 0,
|
||||
c,
|
||||
p,
|
||||
f;
|
||||
while (++i < n) {
|
||||
if (template.charCodeAt(i) === 37) {
|
||||
string.push(template.substring(j, i));
|
||||
if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);
|
||||
if (f = d3_time_formats[c]) c = f(date, p == null ? (c === "e" ? " " : "0") : p);
|
||||
string.push(c);
|
||||
j = i + 1;
|
||||
}
|
||||
}
|
||||
string.push(template.substring(j, i));
|
||||
return string.join("");
|
||||
}
|
||||
|
||||
format.parse = function(string) {
|
||||
var d = {y: 1900, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0, Z: null},
|
||||
i = d3_time_parse(d, template, string, 0);
|
||||
if (i != string.length) return null;
|
||||
|
||||
// The am-pm flag is 0 for AM, and 1 for PM.
|
||||
if ("p" in d) d.H = d.H % 12 + d.p * 12;
|
||||
|
||||
// If a time zone is specified, it is always relative to UTC;
|
||||
// we need to use d3_date_utc if we aren’t already.
|
||||
var localZ = d.Z != null && d3_date !== d3_date_utc,
|
||||
date = new (localZ ? d3_date_utc : d3_date);
|
||||
|
||||
// Set year, month, date.
|
||||
if ("j" in d) date.setFullYear(d.y, 0, d.j);
|
||||
else if ("w" in d && ("W" in d || "U" in d)) {
|
||||
date.setFullYear(d.y, 0, 1);
|
||||
date.setFullYear(d.y, 0, "W" in d
|
||||
? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7
|
||||
: d.w + d.U * 7 - (date.getDay() + 6) % 7);
|
||||
} else date.setFullYear(d.y, d.m, d.d);
|
||||
|
||||
// Set hours, minutes, seconds and milliseconds.
|
||||
date.setHours(d.H + Math.floor(d.Z / 100), d.M + d.Z % 100, d.S, d.L);
|
||||
|
||||
return localZ ? date._ : date;
|
||||
};
|
||||
|
||||
format.toString = function() {
|
||||
return template;
|
||||
};
|
||||
|
||||
return format;
|
||||
}
|
||||
|
||||
function d3_time_parse(date, template, string, j) {
|
||||
var c,
|
||||
p,
|
||||
t,
|
||||
i = 0,
|
||||
n = template.length,
|
||||
m = string.length;
|
||||
while (i < n) {
|
||||
if (j >= m) return -1;
|
||||
c = template.charCodeAt(i++);
|
||||
if (c === 37) {
|
||||
t = template.charAt(i++);
|
||||
p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];
|
||||
if (!p || ((j = p(date, string, j)) < 0)) return -1;
|
||||
} else if (c != string.charCodeAt(j++)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
function d3_time_formatRe(names) {
|
||||
return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i");
|
||||
}
|
||||
|
||||
function d3_time_formatLookup(names) {
|
||||
var map = new d3_Map, i = -1, n = names.length;
|
||||
while (++i < n) map.set(names[i].toLowerCase(), i);
|
||||
return map;
|
||||
}
|
||||
|
||||
function d3_time_formatPad(value, fill, width) {
|
||||
var sign = value < 0 ? "-" : "",
|
||||
string = (sign ? -value : value) + "",
|
||||
length = string.length;
|
||||
return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
|
||||
}
|
||||
|
||||
var d3_time_dayRe = d3_time_formatRe(d3_time_days),
|
||||
d3_time_dayLookup = d3_time_formatLookup(d3_time_days),
|
||||
d3_time_dayAbbrevRe = d3_time_formatRe(d3_time_dayAbbreviations),
|
||||
d3_time_dayAbbrevLookup = d3_time_formatLookup(d3_time_dayAbbreviations),
|
||||
d3_time_monthRe = d3_time_formatRe(d3_time_months),
|
||||
d3_time_monthLookup = d3_time_formatLookup(d3_time_months),
|
||||
d3_time_monthAbbrevRe = d3_time_formatRe(d3_time_monthAbbreviations),
|
||||
d3_time_monthAbbrevLookup = d3_time_formatLookup(d3_time_monthAbbreviations),
|
||||
d3_time_percentRe = /^%/;
|
||||
|
||||
var d3_time_formatPads = {
|
||||
"-": "",
|
||||
"_": " ",
|
||||
"0": "0"
|
||||
};
|
||||
|
||||
var d3_time_formats = {
|
||||
a: function(d) { return d3_time_dayAbbreviations[d.getDay()]; },
|
||||
A: function(d) { return d3_time_days[d.getDay()]; },
|
||||
b: function(d) { return d3_time_monthAbbreviations[d.getMonth()]; },
|
||||
B: function(d) { return d3_time_months[d.getMonth()]; },
|
||||
c: d3_time_format(d3_time_formatDateTime),
|
||||
d: function(d, p) { return d3_time_formatPad(d.getDate(), p, 2); },
|
||||
e: function(d, p) { return d3_time_formatPad(d.getDate(), p, 2); },
|
||||
H: function(d, p) { return d3_time_formatPad(d.getHours(), p, 2); },
|
||||
I: function(d, p) { return d3_time_formatPad(d.getHours() % 12 || 12, p, 2); },
|
||||
j: function(d, p) { return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3); },
|
||||
L: function(d, p) { return d3_time_formatPad(d.getMilliseconds(), p, 3); },
|
||||
m: function(d, p) { return d3_time_formatPad(d.getMonth() + 1, p, 2); },
|
||||
M: function(d, p) { return d3_time_formatPad(d.getMinutes(), p, 2); },
|
||||
p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; },
|
||||
S: function(d, p) { return d3_time_formatPad(d.getSeconds(), p, 2); },
|
||||
U: function(d, p) { return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2); },
|
||||
w: function(d) { return d.getDay(); },
|
||||
W: function(d, p) { return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2); },
|
||||
x: d3_time_format(d3_time_formatDate),
|
||||
X: d3_time_format(d3_time_formatTime),
|
||||
y: function(d, p) { return d3_time_formatPad(d.getFullYear() % 100, p, 2); },
|
||||
Y: function(d, p) { return d3_time_formatPad(d.getFullYear() % 10000, p, 4); },
|
||||
Z: d3_time_zone,
|
||||
"%": function() { return "%"; }
|
||||
};
|
||||
|
||||
var d3_time_parsers = {
|
||||
a: d3_time_parseWeekdayAbbrev,
|
||||
A: d3_time_parseWeekday,
|
||||
b: d3_time_parseMonthAbbrev,
|
||||
B: d3_time_parseMonth,
|
||||
c: d3_time_parseLocaleFull,
|
||||
d: d3_time_parseDay,
|
||||
e: d3_time_parseDay,
|
||||
H: d3_time_parseHour24,
|
||||
I: d3_time_parseHour24,
|
||||
j: d3_time_parseDayOfYear,
|
||||
L: d3_time_parseMilliseconds,
|
||||
m: d3_time_parseMonthNumber,
|
||||
M: d3_time_parseMinutes,
|
||||
p: d3_time_parseAmPm,
|
||||
S: d3_time_parseSeconds,
|
||||
U: d3_time_parseWeekNumberSunday,
|
||||
w: d3_time_parseWeekdayNumber,
|
||||
W: d3_time_parseWeekNumberMonday,
|
||||
x: d3_time_parseLocaleDate,
|
||||
X: d3_time_parseLocaleTime,
|
||||
y: d3_time_parseYear,
|
||||
Y: d3_time_parseFullYear,
|
||||
Z: d3_time_parseZone,
|
||||
"%": d3_time_parseLiteralPercent
|
||||
};
|
||||
|
||||
function d3_time_parseWeekdayAbbrev(date, string, i) {
|
||||
d3_time_dayAbbrevRe.lastIndex = 0;
|
||||
var n = d3_time_dayAbbrevRe.exec(string.substring(i));
|
||||
return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseWeekday(date, string, i) {
|
||||
d3_time_dayRe.lastIndex = 0;
|
||||
var n = d3_time_dayRe.exec(string.substring(i));
|
||||
return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseWeekdayNumber(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 1));
|
||||
return n ? (date.w = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseWeekNumberSunday(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i));
|
||||
return n ? (date.U = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseWeekNumberMonday(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i));
|
||||
return n ? (date.W = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseMonthAbbrev(date, string, i) {
|
||||
d3_time_monthAbbrevRe.lastIndex = 0;
|
||||
var n = d3_time_monthAbbrevRe.exec(string.substring(i));
|
||||
return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseMonth(date, string, i) {
|
||||
d3_time_monthRe.lastIndex = 0;
|
||||
var n = d3_time_monthRe.exec(string.substring(i));
|
||||
return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseLocaleFull(date, string, i) {
|
||||
return d3_time_parse(date, d3_time_formats.c.toString(), string, i);
|
||||
}
|
||||
|
||||
function d3_time_parseLocaleDate(date, string, i) {
|
||||
return d3_time_parse(date, d3_time_formats.x.toString(), string, i);
|
||||
}
|
||||
|
||||
function d3_time_parseLocaleTime(date, string, i) {
|
||||
return d3_time_parse(date, d3_time_formats.X.toString(), string, i);
|
||||
}
|
||||
|
||||
function d3_time_parseFullYear(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 4));
|
||||
return n ? (date.y = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseYear(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 2));
|
||||
return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseZone(date, string, i) {
|
||||
return /^[+-]\d{4}$/.test(string = string.substring(i, i + 5))
|
||||
? (date.Z = +string, i + 5)
|
||||
: -1;
|
||||
}
|
||||
|
||||
function d3_time_expandYear(d) {
|
||||
return d + (d > 68 ? 1900 : 2000);
|
||||
}
|
||||
|
||||
function d3_time_parseMonthNumber(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 2));
|
||||
return n ? (date.m = n[0] - 1, i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseDay(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 2));
|
||||
return n ? (date.d = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseDayOfYear(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 3));
|
||||
return n ? (date.j = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
// Note: we don't validate that the hour is in the range [0,23] or [1,12].
|
||||
function d3_time_parseHour24(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 2));
|
||||
return n ? (date.H = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseMinutes(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 2));
|
||||
return n ? (date.M = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseSeconds(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 2));
|
||||
return n ? (date.S = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
function d3_time_parseMilliseconds(date, string, i) {
|
||||
d3_time_numberRe.lastIndex = 0;
|
||||
var n = d3_time_numberRe.exec(string.substring(i, i + 3));
|
||||
return n ? (date.L = +n[0], i + n[0].length) : -1;
|
||||
}
|
||||
|
||||
// Note: we don't look at the next directive.
|
||||
var d3_time_numberRe = /^\s*\d+/;
|
||||
|
||||
function d3_time_parseAmPm(date, string, i) {
|
||||
var n = d3_time_amPmLookup.get(string.substring(i, i += 2).toLowerCase());
|
||||
return n == null ? -1 : (date.p = n, i);
|
||||
}
|
||||
|
||||
var d3_time_amPmLookup = d3.map({
|
||||
am: 0,
|
||||
pm: 1
|
||||
});
|
||||
|
||||
// TODO table of time zone offset names?
|
||||
function d3_time_zone(d) {
|
||||
var z = d.getTimezoneOffset(),
|
||||
zs = z > 0 ? "-" : "+",
|
||||
zh = ~~(abs(z) / 60),
|
||||
zm = abs(z) % 60;
|
||||
return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2);
|
||||
}
|
||||
|
||||
function d3_time_parseLiteralPercent(date, string, i) {
|
||||
d3_time_percentRe.lastIndex = 0;
|
||||
var n = d3_time_percentRe.exec(string.substring(i, i + 1));
|
||||
return n ? i + n[0].length : -1;
|
||||
}
|
||||
var d3_time_format = d3.time.format = d3_locale_enUS.timeFormat;
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import "time";
|
||||
import "format-localized";
|
||||
import "format";
|
||||
import "format-utc";
|
||||
import "format-iso";
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
var d3_time = d3.time = {},
|
||||
d3_date = Date,
|
||||
d3_time_daySymbols = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
||||
d3_time_daySymbols = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"];
|
||||
|
||||
function d3_date_utc() {
|
||||
this._ = new Date(arguments.length > 1
|
||||
|
|
|
@ -4,7 +4,6 @@ import "time";
|
|||
import "year";
|
||||
|
||||
d3_time_daySymbols.forEach(function(day, i) {
|
||||
day = day.toLowerCase();
|
||||
i = 7 - i;
|
||||
|
||||
var interval = d3_time[day] = d3_time_interval(function(date) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче