From 2563c951e32dfb21f514446930f9846558e60283 Mon Sep 17 00:00:00 2001 From: rotsee Date: Tue, 8 Apr 2025 20:05:59 +0200 Subject: [PATCH 1/4] Adding dayPeriodPatterns --- README.md | 22 ++++++++++++++++++ lib/cldr.js | 40 ++++++++++++++++++++++++++++++++ test/extractDayPeriodPatterns.js | 22 ++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 test/extractDayPeriodPatterns.js diff --git a/README.md b/README.md index 8d233535..e896ba9b 100644 --- a/README.md +++ b/README.md @@ -453,6 +453,28 @@ cldr.extractDayPeriods('en_GB', 'gregorian'); wide: { am: 'AM', pm: 'PM' } } } ``` +### cldr.extractDayPeriodRules(localeId='root') + +Extract a ruleset for locale-aware day periods, +to be used with extractDayPeriods(). + +```javascript +cldr.extractDayPeriodRules('nl'); +{ format: [ + { type: 'morning1', at: '', from: '06:00', before: '12:00' }, + { type: 'afternoon1', at: '', from: '12:00', before: '18:00' }, + { type: 'evening1', at: '', from: '18:00', before: '24:00' }, + { type: 'night1', at: '', from: '00:00', before: '06:00' }, + ], + standAlone: [ + { type: 'midnight', at: '00:00', from: '', before: '' }, + { type: 'morning1', at: '', from: '06:00', before: '12:00' }, + { type: 'afternoon1', at: '', from: '12:00', before: '18:00' }, + { type: 'evening1', at: '', from: '18:00', before: '24:00' }, + { type: 'night1', at: '', from: '00:00', before: '06:00' } + ] } +``` + ### cldr.extractCyclicNames(localeId='root', calendarId='gregorian') Extract a nested hash with cyclic names for a calendar and locale diff --git a/lib/cldr.js b/lib/cldr.js index f02eb9c9..9758c73e 100644 --- a/lib/cldr.js +++ b/lib/cldr.js @@ -838,6 +838,46 @@ Cldr.prototype = { return dayPeriods; }, + extractDayPeriodRules(localeId) { + const document = this.getDocument( + Path.resolve(this.cldrPath, 'common', 'supplemental', 'dayPeriods.xml'), + ); + const dayPeriodRulesNode = xpath.select( + '/supplementalData/dayPeriodRuleSet[not(@type)]' + + `/dayPeriodRules[@locales='${localeId}']`, + document, + )[0]; + const dayPeriodRules = xpath.select('dayPeriodRule', dayPeriodRulesNode); + + const dayPeriodRulesSelectNode = xpath.select( + "/supplementalData/dayPeriodRuleSet[@type='selection']" + + `/dayPeriodRules[@locales='${localeId}']`, + document, + )[0]; + const dayPeriodSelectsRules = xpath.select( + 'dayPeriodRule', + dayPeriodRulesSelectNode, + ); + return { + standAlone: dayPeriodRules.map((dayPeriodRuleNode) => { + return { + type: dayPeriodRuleNode.getAttribute('type'), + at: dayPeriodRuleNode.getAttribute('at'), + from: dayPeriodRuleNode.getAttribute('from'), + before: dayPeriodRuleNode.getAttribute('before'), + }; + }), + format: dayPeriodSelectsRules.map((dayPeriodRuleNode) => { + return { + type: dayPeriodRuleNode.getAttribute('type'), + at: dayPeriodRuleNode.getAttribute('at'), + from: dayPeriodRuleNode.getAttribute('from'), + before: dayPeriodRuleNode.getAttribute('before'), + }; + }), + }; + }, + extractCyclicNames(localeId, calendarId) { this.checkValidLocaleId(localeId); calendarId = calendarId || 'gregorian'; diff --git a/test/extractDayPeriodPatterns.js b/test/extractDayPeriodPatterns.js new file mode 100644 index 00000000..9dd705b7 --- /dev/null +++ b/test/extractDayPeriodPatterns.js @@ -0,0 +1,22 @@ +const expect = require('unexpected'); + +const cldr = require('../lib/cldr'); + +describe('extractDayPeriodRules', () => { + const dutchDayPeriodRules = cldr.extractDayPeriodRules('nl'); + it('should have the correct rules', () => { + expect(dutchDayPeriodRules.standAlone, 'to equal', [ + { type: 'midnight', at: '00:00', from: '', before: '' }, + { type: 'morning1', at: '', from: '06:00', before: '12:00' }, + { type: 'afternoon1', at: '', from: '12:00', before: '18:00' }, + { type: 'evening1', at: '', from: '18:00', before: '24:00' }, + { type: 'night1', at: '', from: '00:00', before: '06:00' }, + ]); + expect(dutchDayPeriodRules.format, 'to equal', [ + { type: 'morning1', at: '', from: '06:00', before: '12:00' }, + { type: 'afternoon1', at: '', from: '12:00', before: '18:00' }, + { type: 'evening1', at: '', from: '18:00', before: '24:00' }, + { type: 'night1', at: '', from: '00:00', before: '06:00' }, + ]); + }); +}); From 87b883ef7e55ecefefa5dc92fc4f9f0c16ccd919 Mon Sep 17 00:00:00 2001 From: rotsee Date: Tue, 8 Apr 2025 20:10:15 +0200 Subject: [PATCH 2/4] add locale check --- lib/cldr.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/cldr.js b/lib/cldr.js index 9758c73e..97202e49 100644 --- a/lib/cldr.js +++ b/lib/cldr.js @@ -839,6 +839,7 @@ Cldr.prototype = { }, extractDayPeriodRules(localeId) { + this.checkValidLocaleId(localeId); const document = this.getDocument( Path.resolve(this.cldrPath, 'common', 'supplemental', 'dayPeriods.xml'), ); From 9a3e4e30a614906f65eff899eed1c798bdf589b4 Mon Sep 17 00:00:00 2001 From: Andreas Lind Date: Tue, 8 Apr 2025 22:50:42 +0200 Subject: [PATCH 3/4] Update lib/cldr.js --- lib/cldr.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/cldr.js b/lib/cldr.js index 97202e49..34e21fa4 100644 --- a/lib/cldr.js +++ b/lib/cldr.js @@ -843,11 +843,11 @@ Cldr.prototype = { const document = this.getDocument( Path.resolve(this.cldrPath, 'common', 'supplemental', 'dayPeriods.xml'), ); - const dayPeriodRulesNode = xpath.select( + const dayPeriodRulesNode = xpath.select1( '/supplementalData/dayPeriodRuleSet[not(@type)]' + `/dayPeriodRules[@locales='${localeId}']`, document, - )[0]; + ); const dayPeriodRules = xpath.select('dayPeriodRule', dayPeriodRulesNode); const dayPeriodRulesSelectNode = xpath.select( From d10a582a26d592a763fd8b31fc9ef30d16502b50 Mon Sep 17 00:00:00 2001 From: Andreas Lind Date: Tue, 8 Apr 2025 22:50:49 +0200 Subject: [PATCH 4/4] Update lib/cldr.js --- lib/cldr.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/cldr.js b/lib/cldr.js index 34e21fa4..538e70bd 100644 --- a/lib/cldr.js +++ b/lib/cldr.js @@ -850,11 +850,11 @@ Cldr.prototype = { ); const dayPeriodRules = xpath.select('dayPeriodRule', dayPeriodRulesNode); - const dayPeriodRulesSelectNode = xpath.select( + const dayPeriodRulesSelectNode = xpath.select1( "/supplementalData/dayPeriodRuleSet[@type='selection']" + `/dayPeriodRules[@locales='${localeId}']`, document, - )[0]; + ); const dayPeriodSelectsRules = xpath.select( 'dayPeriodRule', dayPeriodRulesSelectNode,