Skip to content
This repository was archived by the owner on Aug 1, 2024. It is now read-only.

Commit 6536155

Browse files
Closure Teamcopybara-github
authored andcommitted
Fixes parsing of flexible day periods in compiled JavaScript.
RELNOTES: Fixes parsing of flexible day periods in compiled JavaScript. PiperOrigin-RevId: 468762639 Change-Id: I382ff5ffdb37f33a949d90c142b594cf58077116
1 parent 7870cb9 commit 6536155

File tree

5 files changed

+168
-47
lines changed

5 files changed

+168
-47
lines changed

closure/goog/i18n/BUILD

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,63 @@ package(default_visibility = ["//visibility:public"])
44

55
licenses(["notice"])
66

7+
closure_js_library(
8+
name = "jstests_deps",
9+
lenient = True,
10+
exports = [
11+
":bidi",
12+
":bidiformatter",
13+
":charlistdecompressor",
14+
":collation",
15+
":compactnumberformatsymbols",
16+
":compactnumberformatsymbolsext",
17+
":currency",
18+
":dateintervalformat",
19+
":dateintervalpatterns",
20+
":dateintervalsymbols",
21+
":datetimeformat",
22+
":datetimeparse",
23+
":datetimepatterns",
24+
":datetimepatternsext",
25+
":datetimesymbols",
26+
":datetimesymbolsext",
27+
":dayperiodsymbols",
28+
":graphemebreak",
29+
":listformat",
30+
":listsymbols",
31+
":listsymbolsext",
32+
":localefeature",
33+
":messageformat",
34+
":mime",
35+
":numberformat",
36+
":numberformatsymbols",
37+
":numberformatsymbolsext",
38+
":ordinalrules",
39+
":pluralrules",
40+
":relativedatetimeformat",
41+
":relativedatetimesymbols",
42+
":relativedatetimesymbolsext",
43+
":timezone",
44+
":uchar",
45+
":ucharnames",
46+
"//closure/goog/date",
47+
"//closure/goog/date:daterange",
48+
"//closure/goog/date:utcdatetime",
49+
"//closure/goog/html:safehtml",
50+
"//closure/goog/html:testing",
51+
"//closure/goog/labs/useragent",
52+
"//closure/goog/object",
53+
"//closure/goog/string",
54+
"//closure/goog/testing:expectedfailures",
55+
"//closure/goog/testing:propertyreplacer",
56+
"//closure/goog/testing:testsuite",
57+
"//closure/goog/useragent",
58+
"//closure/goog/useragent:product",
59+
"//closure/goog/useragent:product_isversion",
60+
"//closure/goog:base",
61+
],
62+
)
63+
764
closure_js_library(
865
name = "bidi",
966
srcs = ["bidi.js"],

closure/goog/i18n/datetimeformat_test.js

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -622,17 +622,45 @@ testSuite({
622622
* {goog.i18n.DayPeriods}
623623
*/
624624
const fakeDayPeriods_en = {
625-
midnight: {at: '00:00', formatNames: ['midnight']},
626-
morning1:
627-
{from: '05:00', before: '08:00', formatNames: ['before breakfast']},
628-
morning2: {from: '08:00', before: '12:00', formatNames: ['morning']},
629-
noon: {at: '12:00', formatNames: ['noon']},
630-
afternoon1:
631-
{from: '12:00', before: '16:00', formatNames: ['early afternoon']},
632-
afternoon2:
633-
{from: '16:00', before: '18:00', formatNames: ['dinner time']},
634-
evening1: {from: '18:00', before: '23:00', formatNames: ['evening']},
635-
night1: {from: '23:00', before: '05:00', formatNames: ['sleeping']},
625+
midnight:
626+
{at: '00:00', formatNames: ['midnight'], periodName: 'midnight'},
627+
morning1: {
628+
from: '05:00',
629+
before: '08:00',
630+
formatNames: ['before breakfast'],
631+
periodName: 'morning1'
632+
},
633+
morning2: {
634+
from: '08:00',
635+
before: '12:00',
636+
formatNames: ['morning'],
637+
periodName: 'morning2'
638+
},
639+
noon: {at: '12:00', formatNames: ['noon'], periodName: 'noon'},
640+
afternoon1: {
641+
from: '12:00',
642+
before: '16:00',
643+
formatNames: ['early afternoon'],
644+
periodName: 'afternoon1'
645+
},
646+
afternoon2: {
647+
from: '16:00',
648+
before: '18:00',
649+
formatNames: ['dinner time'],
650+
periodName: 'afternoon2'
651+
},
652+
evening1: {
653+
from: '18:00',
654+
before: '23:00',
655+
formatNames: ['evening'],
656+
periodName: 'evening1'
657+
},
658+
night1: {
659+
from: '23:00',
660+
before: '05:00',
661+
formatNames: ['sleeping'],
662+
periodName: 'night1'
663+
},
636664
};
637665
setDayPeriods(fakeDayPeriods_en);
638666

closure/goog/i18n/datetimeparse.js

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ goog.i18n.DateTimeParse.prototype.parse = function(text, date, options) {
444444

445445
const cal = new goog.i18n.DateTimeParse.MyDate_();
446446
const parsePos = [0];
447-
cal.dayPeriodIndex = null;
447+
cal.dayPeriodIndex = -1;
448448

449449
for (let i = 0; i < this.patternParts_.length; i++) {
450450
if (predictive && parsePos[0] >= text.length) {
@@ -593,31 +593,28 @@ goog.i18n.DateTimeParse.prototype.subParse_ = function(
593593
/** {?goog.i18n.DayPeriods} */
594594
const localePeriods = DayPeriods.getDayPeriods();
595595
// Standard names such as 'noon', 'morning1', 'night2', etc.
596-
let periodNames;
596+
let periodNames = [];
597597
// The localized terms for the period names.
598598
let expectedValues = [];
599599
if (localePeriods) {
600-
periodNames = goog.object.getKeys(localePeriods);
601600
// Get the formatNames values to check
602-
for (const name of periodNames) {
601+
for (const name of goog.object.getKeys(localePeriods)) {
602+
periodNames.push(localePeriods[name].periodName);
603603
expectedValues.push(localePeriods[name].formatNames[0]);
604604
}
605605
}
606606
// Add strings for AM & PM, in addition to flexible periods
607607
const periodsData = [expectedValues.concat(this.dateTimeSymbols_.AMPMS)];
608608
// Include possible outputs of am/pm as day periods.
609-
if (periodNames) {
610-
periodNames.push('isAm');
611-
periodNames.push('isPm');
612-
}
609+
periodNames.push('isAm');
610+
periodNames.push('isPm');
611+
613612
// Record string matching this day period
614613
const foundPeriod = this.subParseString_(
615614
text, pos, periodsData, value => cal.dayPeriodIndex = value,
616615
predictive);
617-
cal.dayPeriodName = null;
618-
if (cal.dayPeriodIndex && periodNames) {
619-
cal.dayPeriodName = periodNames[cal.dayPeriodIndex];
620-
}
616+
cal.dayPeriodName = periodNames[cal.dayPeriodIndex];
617+
621618
return predictive ? foundPeriod : true;
622619
case 'a': // AM_PM
623620
const success = this.subParseString_(
@@ -1169,7 +1166,7 @@ goog.i18n.DateTimeParse.MyDate_.prototype.ampm;
11691166

11701167
/**
11711168
* Index of the time's flexible day period in data object.
1172-
* @type {?number}
1169+
* @type {number}
11731170
*/
11741171
goog.i18n.DateTimeParse.MyDate_.prototype.dayPeriodIndex;
11751172

closure/goog/i18n/datetimeparse_test.js

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ const testSuite = goog.require('goog.testing.testSuite');
3232

3333
const {DayPeriods_zh_Hant, setDayPeriods} = goog.require('goog.i18n.DayPeriods');
3434

35-
replacer.replace(goog.i18n, 'DateTimeSymbols', DateTimeSymbols_en);
35+
const DATETIMESYMBOLS =
36+
goog.reflect.objectProperty('DateTimeSymbols', goog.i18n);
37+
const LOCALE = goog.reflect.objectProperty('LOCALE', goog);
38+
39+
replacer.replace(goog.i18n, DATETIMESYMBOLS, DateTimeSymbols_en);
3640

3741
/**
3842
* @record
@@ -141,12 +145,12 @@ testSuite({
141145
setUpPage() {},
142146

143147
setUp() {
144-
replacer.replace(goog, 'LOCALE', 'en');
145-
replacer.replace(goog.i18n, 'DateTimeSymbols', DateTimeSymbols_en);
148+
replacer.replace(goog, LOCALE, 'en');
149+
replacer.replace(goog.i18n, DATETIMESYMBOLS, DateTimeSymbols_en);
146150
},
147151

148152
tearDown() {
149-
replacer.replace(goog.i18n, 'DateTimeSymbols', DateTimeSymbols_en);
153+
replacer.replace(goog.i18n, DATETIMESYMBOLS, DateTimeSymbols_en);
150154
},
151155

152156
testNegativeYear() {
@@ -489,7 +493,7 @@ testSuite({
489493
},
490494

491495
testChineseDate() {
492-
replacer.replace(goog.i18n, 'DateTimeSymbols', DateTimeSymbols_zh);
496+
replacer.replace(goog.i18n, DATETIMESYMBOLS, DateTimeSymbols_zh);
493497

494498
// JavaScript month start from 0, July is 7 - 1
495499
const date = new Date(2006, 7 - 1, 24, 12, 12, 12, 0);
@@ -531,7 +535,8 @@ testSuite({
531535
},
532536

533537
testZhTwBFormat() {
534-
replacer.replace(goog.i18n, 'DateTimeSymbols', DateTimeSymbols_zh_TW);
538+
let nativeMode = true;
539+
replacer.replace(goog.i18n, DATETIMESYMBOLS, DateTimeSymbols_zh_TW);
535540

536541
// Make sure we have the day period info.
537542
setDayPeriods(DayPeriods_zh_Hant);
@@ -544,7 +549,10 @@ testSuite({
544549
let date = new Date(2006, 7 - 1, 24, 12, 12, 12, 0);
545550

546551
let parsedDate = parser.parse(gmtDateStringPm, date);
547-
assertTrue('parsedDate=' + parsedDate, parsedDate > 0);
552+
553+
assertTrue(
554+
'nativeMode=' + nativeMode + ', parsedDate=' + parsedDate,
555+
parsedDate > 0);
548556
// This should be give 10PM == 22:00.
549557
const normalizedHourPm =
550558
(24 + date.getHours() + date.getTimezoneOffset() / 60) % 24;
@@ -556,7 +564,7 @@ testSuite({
556564
// for parsing dates with such native digits.
557565
testDatesWithNativeDigits() {
558566
// Language Arabic is one example with
559-
replacer.replace(goog.i18n, 'DateTimeSymbols', DateTimeSymbols_fa);
567+
replacer.replace(goog.i18n, DATETIMESYMBOLS, DateTimeSymbols_fa);
560568

561569
let formatter = new DateTimeFormat(DateTimeFormat.Format.FULL_DATE);
562570
let parser = new DateTimeParse(DateTimeFormat.Format.FULL_DATE);
@@ -679,7 +687,7 @@ testSuite({
679687
},
680688

681689
testFrenchShortQuarter() {
682-
replacer.replace(goog.i18n, 'DateTimeSymbols', DateTimeSymbols_fr);
690+
replacer.replace(goog.i18n, DATETIMESYMBOLS, DateTimeSymbols_fr);
683691
const parser = new DateTimeParse('yyyyQQ');
684692

685693
assertParsedDateEquals(2009, 7 - 1, 1, parser, '2009T3');
@@ -769,7 +777,7 @@ testSuite({
769777

770778
/** @bug 9901750 */
771779
testStandaloneMonthPattern() {
772-
replacer.replace(goog.i18n, 'DateTimeSymbols', DateTimeSymbols_pl);
780+
replacer.replace(goog.i18n, DATETIMESYMBOLS, DateTimeSymbols_pl);
773781
const date1 = new GoogDate(2006, 7 - 1);
774782
const date2 = new GoogDate();
775783
const formatter = new DateTimeFormat('LLLL yyyy');
@@ -784,7 +792,7 @@ testSuite({
784792
const symbols = [DateTimeSymbols_en, DateTimeSymbols_pl];
785793

786794
for (let i = 0; i < symbols.length; i++) {
787-
replacer.replace(goog.i18n, 'DateTimeSymbols', symbols[i]);
795+
replacer.replace(goog.i18n, DATETIMESYMBOLS, symbols[i]);
788796
const dateTimeSymbols = symbols[i];
789797
const tests = {
790798
'MMMM yyyy': dateTimeSymbols.MONTHS,
@@ -827,7 +835,7 @@ testSuite({
827835

828836
testQuotedPattern() {
829837
// Regression test for b/29990921.
830-
replacer.replace(goog.i18n, 'DateTimeSymbols', DateTimeSymbols_en);
838+
replacer.replace(goog.i18n, DATETIMESYMBOLS, DateTimeSymbols_en);
831839

832840
// Literal apostrophe
833841
let parser = new DateTimeParse('MMM \'\'yy');
@@ -879,8 +887,8 @@ testSuite({
879887
testZhHantTwDayPeriods() {
880888
// b/208532468, 3-Dec-2021
881889

882-
replacer.replace(goog, 'LOCALE', 'zh-TW');
883-
replacer.replace(goog.i18n, 'DateTimeSymbols', DateTimeSymbols_zh_TW);
890+
replacer.replace(goog, LOCALE, 'zh-TW');
891+
replacer.replace(goog.i18n, DATETIMESYMBOLS, DateTimeSymbols_zh_TW);
884892
// Set up for parts of the day in Chinese.
885893
setDayPeriods(DayPeriods_zh_Hant);
886894

@@ -943,8 +951,8 @@ testSuite({
943951
testRoundTripZhTw() {
944952
// Test for b/208532468 round trip with zh_TW with flexible time periods
945953
const date = new Date(0, 0, 0, 17);
946-
replacer.replace(goog, 'LOCALE', 'zh-TW');
947-
replacer.replace(goog.i18n, 'DateTimeSymbols', DateTimeSymbols_zh_TW);
954+
replacer.replace(goog, LOCALE, 'zh-TW');
955+
replacer.replace(goog.i18n, DATETIMESYMBOLS, DateTimeSymbols_zh_TW);
948956

949957
setDayPeriods(DayPeriods_zh_Hant);
950958

closure/goog/i18n/dayperiodsymbols.js

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ goog.module.declareLegacyNamespace();
2020
* at: (string|undefined),
2121
* from: (string|undefined),
2222
* before: (string|undefined),
23+
* periodName: (string),
2324
* formatNames: (!Array<string>|undefined),
2425
* standaloneNames: (!Array<string>|undefined)
2526
* }}
@@ -54,13 +55,43 @@ exports.DayPeriods = DayPeriods;
5455
* @type {!DayPeriods}
5556
*/
5657
exports.DayPeriods_zh_Hant = {
57-
midnight: {at: '00:00', formatNames: ['午夜']},
58-
night1: {from: '00:00', before: '05:00', formatNames: ['凌晨']},
59-
morning1: {from: '05:00', before: '08:00', formatNames: ['清晨']},
60-
morning2: {from: '08:00', before: '12:00', formatNames: ['上午']},
61-
afternoon1: {from: '12:00', before: '13:00', formatNames: ['中午']},
62-
afternoon2: {from: '13:00', before: '19:00', formatNames: ['下午']},
63-
evening1: {from: '19:00', before: '24:00', formatNames: ['晚上']},
58+
midnight: {at: '00:00', formatNames: ['午夜'], periodName: 'midnight'},
59+
night1: {
60+
from: '00:00',
61+
before: '05:00',
62+
formatNames: ['凌晨'],
63+
periodName: 'night1'
64+
},
65+
morning1: {
66+
from: '05:00',
67+
before: '08:00',
68+
formatNames: ['清晨'],
69+
periodName: 'morning1'
70+
},
71+
morning2: {
72+
from: '08:00',
73+
before: '12:00',
74+
formatNames: ['上午'],
75+
periodName: 'morning2'
76+
},
77+
afternoon1: {
78+
from: '12:00',
79+
before: '13:00',
80+
formatNames: ['中午'],
81+
periodName: 'afternoon1'
82+
},
83+
afternoon2: {
84+
from: '13:00',
85+
before: '19:00',
86+
formatNames: ['下午'],
87+
periodName: 'afternoon1'
88+
},
89+
evening1: {
90+
from: '19:00',
91+
before: '24:00',
92+
formatNames: ['晚上'],
93+
periodName: 'evening1'
94+
},
6495
};
6596

6697
/**

0 commit comments

Comments
 (0)