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..538e70bd 100644 --- a/lib/cldr.js +++ b/lib/cldr.js @@ -838,6 +838,47 @@ Cldr.prototype = { return dayPeriods; }, + extractDayPeriodRules(localeId) { + this.checkValidLocaleId(localeId); + const document = this.getDocument( + Path.resolve(this.cldrPath, 'common', 'supplemental', 'dayPeriods.xml'), + ); + const dayPeriodRulesNode = xpath.select1( + '/supplementalData/dayPeriodRuleSet[not(@type)]' + + `/dayPeriodRules[@locales='${localeId}']`, + document, + ); + const dayPeriodRules = xpath.select('dayPeriodRule', dayPeriodRulesNode); + + const dayPeriodRulesSelectNode = xpath.select1( + "/supplementalData/dayPeriodRuleSet[@type='selection']" + + `/dayPeriodRules[@locales='${localeId}']`, + document, + ); + 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' }, + ]); + }); +});