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:
Mike Bostock 2013-11-29 12:09:51 -05:00
Родитель 3234f47ad3
Коммит 8349aa171c
24 изменённых файлов: 1095 добавлений и 1082 удалений

Просмотреть файл

@ -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 > $@

1138
d3.js поставляемый

Разница между файлами не показана из-за своего большого размера Загрузить разницу

10
d3.min.js поставляемый

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -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);

3
src/format/precision.js Normal file
Просмотреть файл

@ -0,0 +1,3 @@
function d3_format_precision(x, p) {
return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);
}

23
src/format/re.js Normal file
Просмотреть файл

@ -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

15
src/locale/en-US.js Normal file
Просмотреть файл

@ -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
);

26
src/locale/locale.js Normal file
Просмотреть файл

@ -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
};
};

121
src/locale/number-format.js Normal file
Просмотреть файл

@ -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);
};
}

319
src/locale/time-format.js Normal file
Просмотреть файл

@ -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 arent 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 arent 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) {