chrono-node 2.3.8 → 2.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/calculation/mergingCalculation.js +1 -0
- package/dist/calculation/mergingCalculation.js.map +1 -0
- package/dist/calculation/weeks.js +1 -0
- package/dist/calculation/weeks.js.map +1 -0
- package/dist/calculation/years.js +1 -0
- package/dist/calculation/years.js.map +1 -0
- package/dist/chrono.js +1 -0
- package/dist/chrono.js.map +1 -0
- package/dist/common/abstractRefiners.js +1 -0
- package/dist/common/abstractRefiners.js.map +1 -0
- package/dist/common/casualReferences.d.ts +8 -0
- package/dist/common/casualReferences.js +65 -9
- package/dist/common/casualReferences.js.map +1 -0
- package/dist/common/parsers/AbstractParserWithWordBoundary.d.ts +1 -0
- package/dist/common/parsers/AbstractParserWithWordBoundary.js +5 -1
- package/dist/common/parsers/AbstractParserWithWordBoundary.js.map +1 -0
- package/dist/common/parsers/AbstractTimeExpressionParser.d.ts +2 -0
- package/dist/common/parsers/AbstractTimeExpressionParser.js +40 -27
- package/dist/common/parsers/AbstractTimeExpressionParser.js.map +1 -0
- package/dist/common/parsers/ISOFormatParser.js +1 -0
- package/dist/common/parsers/ISOFormatParser.js.map +1 -0
- package/dist/common/parsers/SlashDateFormatParser.js +1 -0
- package/dist/common/parsers/SlashDateFormatParser.js.map +1 -0
- package/dist/common/refiners/AbstractMergeDateRangeRefiner.js +1 -0
- package/dist/common/refiners/AbstractMergeDateRangeRefiner.js.map +1 -0
- package/dist/common/refiners/AbstractMergeDateTimeRefiner.js +1 -0
- package/dist/common/refiners/AbstractMergeDateTimeRefiner.js.map +1 -0
- package/dist/common/refiners/ExtractTimezoneAbbrRefiner.js +1 -0
- package/dist/common/refiners/ExtractTimezoneAbbrRefiner.js.map +1 -0
- package/dist/common/refiners/ExtractTimezoneOffsetRefiner.js +5 -1
- package/dist/common/refiners/ExtractTimezoneOffsetRefiner.js.map +1 -0
- package/dist/common/refiners/ForwardDateRefiner.js +1 -0
- package/dist/common/refiners/ForwardDateRefiner.js.map +1 -0
- package/dist/common/refiners/MergeWeekdayComponentRefiner.js +1 -0
- package/dist/common/refiners/MergeWeekdayComponentRefiner.js.map +1 -0
- package/dist/common/refiners/OverlapRemovalRefiner.js +1 -0
- package/dist/common/refiners/OverlapRemovalRefiner.js.map +1 -0
- package/dist/common/refiners/UnlikelyFormatFilter.js +1 -0
- package/dist/common/refiners/UnlikelyFormatFilter.js.map +1 -0
- package/dist/configurations.js +1 -0
- package/dist/configurations.js.map +1 -0
- package/dist/debugging.js +1 -0
- package/dist/debugging.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -0
- package/dist/locales/de/constants.js +1 -0
- package/dist/locales/de/constants.js.map +1 -0
- package/dist/locales/de/index.js +1 -0
- package/dist/locales/de/index.js.map +1 -0
- package/dist/locales/de/parsers/DECasualDateParser.js +1 -0
- package/dist/locales/de/parsers/DECasualDateParser.js.map +1 -0
- package/dist/locales/de/parsers/DECasualTimeParser.js +1 -0
- package/dist/locales/de/parsers/DECasualTimeParser.js.map +1 -0
- package/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js +1 -0
- package/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js.map +1 -0
- package/dist/locales/de/parsers/DESpecificTimeExpressionParser.js +1 -0
- package/dist/locales/de/parsers/DESpecificTimeExpressionParser.js.map +1 -0
- package/dist/locales/de/parsers/DETimeExpressionParser.js +1 -0
- package/dist/locales/de/parsers/DETimeExpressionParser.js.map +1 -0
- package/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.js +1 -0
- package/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.js.map +1 -0
- package/dist/locales/de/parsers/DEWeekdayParser.js +1 -0
- package/dist/locales/de/parsers/DEWeekdayParser.js.map +1 -0
- package/dist/locales/de/refiners/DEMergeDateRangeRefiner.js +1 -0
- package/dist/locales/de/refiners/DEMergeDateRangeRefiner.js.map +1 -0
- package/dist/locales/de/refiners/DEMergeDateTimeRefiner.js +1 -0
- package/dist/locales/de/refiners/DEMergeDateTimeRefiner.js.map +1 -0
- package/dist/locales/en/constants.js +1 -0
- package/dist/locales/en/constants.js.map +1 -0
- package/dist/locales/en/index.js +1 -0
- package/dist/locales/en/index.js.map +1 -0
- package/dist/locales/en/parsers/ENCasualDateParser.js +1 -0
- package/dist/locales/en/parsers/ENCasualDateParser.js.map +1 -0
- package/dist/locales/en/parsers/ENCasualTimeParser.js +1 -0
- package/dist/locales/en/parsers/ENCasualTimeParser.js.map +1 -0
- package/dist/locales/en/parsers/ENCasualYearMonthDayParser.js +1 -0
- package/dist/locales/en/parsers/ENCasualYearMonthDayParser.js.map +1 -0
- package/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js +1 -0
- package/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js.map +1 -0
- package/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js +1 -0
- package/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js.map +1 -0
- package/dist/locales/en/parsers/ENMonthNameParser.js +1 -0
- package/dist/locales/en/parsers/ENMonthNameParser.js.map +1 -0
- package/dist/locales/en/parsers/ENRelativeDateFormatParser.js +1 -0
- package/dist/locales/en/parsers/ENRelativeDateFormatParser.js.map +1 -0
- package/dist/locales/en/parsers/ENSlashMonthFormatParser.js +1 -0
- package/dist/locales/en/parsers/ENSlashMonthFormatParser.js.map +1 -0
- package/dist/locales/en/parsers/ENTimeExpressionParser.js +1 -0
- package/dist/locales/en/parsers/ENTimeExpressionParser.js.map +1 -0
- package/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js +1 -0
- package/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js.map +1 -0
- package/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js +1 -0
- package/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js.map +1 -0
- package/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js +1 -0
- package/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js.map +1 -0
- package/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js +1 -0
- package/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js.map +1 -0
- package/dist/locales/en/parsers/ENWeekdayParser.js +1 -0
- package/dist/locales/en/parsers/ENWeekdayParser.js.map +1 -0
- package/dist/locales/en/refiners/ENMergeDateRangeRefiner.js +1 -0
- package/dist/locales/en/refiners/ENMergeDateRangeRefiner.js.map +1 -0
- package/dist/locales/en/refiners/ENMergeDateTimeRefiner.js +1 -0
- package/dist/locales/en/refiners/ENMergeDateTimeRefiner.js.map +1 -0
- package/dist/locales/en/refiners/ENMergeRelativeDateRefiner.js +1 -0
- package/dist/locales/en/refiners/ENMergeRelativeDateRefiner.js.map +1 -0
- package/dist/locales/fr/constants.js +1 -0
- package/dist/locales/fr/constants.js.map +1 -0
- package/dist/locales/fr/index.js +1 -0
- package/dist/locales/fr/index.js.map +1 -0
- package/dist/locales/fr/parsers/FRCasualDateParser.js +1 -0
- package/dist/locales/fr/parsers/FRCasualDateParser.js.map +1 -0
- package/dist/locales/fr/parsers/FRCasualTimeParser.js +1 -0
- package/dist/locales/fr/parsers/FRCasualTimeParser.js.map +1 -0
- package/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js +1 -0
- package/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js.map +1 -0
- package/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js +1 -0
- package/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js.map +1 -0
- package/dist/locales/fr/parsers/FRTimeExpressionParser.js +1 -0
- package/dist/locales/fr/parsers/FRTimeExpressionParser.js.map +1 -0
- package/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js +1 -0
- package/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js.map +1 -0
- package/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js +1 -0
- package/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js.map +1 -0
- package/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js +2 -1
- package/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js.map +1 -0
- package/dist/locales/fr/parsers/FRWeekdayParser.js +1 -0
- package/dist/locales/fr/parsers/FRWeekdayParser.js.map +1 -0
- package/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js +1 -0
- package/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js.map +1 -0
- package/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js +1 -0
- package/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js.map +1 -0
- package/dist/locales/ja/constants.js +1 -0
- package/dist/locales/ja/constants.js.map +1 -0
- package/dist/locales/ja/index.js +1 -0
- package/dist/locales/ja/index.js.map +1 -0
- package/dist/locales/ja/parsers/JPCasualDateParser.js +1 -0
- package/dist/locales/ja/parsers/JPCasualDateParser.js.map +1 -0
- package/dist/locales/ja/parsers/JPStandardParser.js +1 -0
- package/dist/locales/ja/parsers/JPStandardParser.js.map +1 -0
- package/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js +1 -0
- package/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js.map +1 -0
- package/dist/locales/nl/constants.js +1 -0
- package/dist/locales/nl/constants.js.map +1 -0
- package/dist/locales/nl/index.js +1 -0
- package/dist/locales/nl/index.js.map +1 -0
- package/dist/locales/nl/parsers/NLCasualDateParser.js +1 -0
- package/dist/locales/nl/parsers/NLCasualDateParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLCasualDateTimeParser.js +1 -0
- package/dist/locales/nl/parsers/NLCasualDateTimeParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLCasualTimeParser.js +1 -0
- package/dist/locales/nl/parsers/NLCasualTimeParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js +1 -0
- package/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js +1 -0
- package/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLMonthNameParser.js +1 -0
- package/dist/locales/nl/parsers/NLMonthNameParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLRelativeDateFormatParser.js +1 -0
- package/dist/locales/nl/parsers/NLRelativeDateFormatParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLSlashMonthFormatParser.js +1 -0
- package/dist/locales/nl/parsers/NLSlashMonthFormatParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLTimeExpressionParser.js +1 -0
- package/dist/locales/nl/parsers/NLTimeExpressionParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLTimeUnitAgoFormatParser.js +1 -0
- package/dist/locales/nl/parsers/NLTimeUnitAgoFormatParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js +1 -0
- package/dist/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLTimeUnitLaterFormatParser.js +1 -0
- package/dist/locales/nl/parsers/NLTimeUnitLaterFormatParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js +1 -0
- package/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js.map +1 -0
- package/dist/locales/nl/parsers/NLWeekdayParser.js +1 -0
- package/dist/locales/nl/parsers/NLWeekdayParser.js.map +1 -0
- package/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js +1 -0
- package/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js.map +1 -0
- package/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js +1 -0
- package/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js.map +1 -0
- package/dist/locales/pt/constants.js +1 -0
- package/dist/locales/pt/constants.js.map +1 -0
- package/dist/locales/pt/index.js +1 -0
- package/dist/locales/pt/index.js.map +1 -0
- package/dist/locales/pt/parsers/PTCasualDateParser.js +1 -0
- package/dist/locales/pt/parsers/PTCasualDateParser.js.map +1 -0
- package/dist/locales/pt/parsers/PTCasualTimeParser.js +1 -0
- package/dist/locales/pt/parsers/PTCasualTimeParser.js.map +1 -0
- package/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js +1 -0
- package/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js.map +1 -0
- package/dist/locales/pt/parsers/PTTimeExpressionParser.js +1 -0
- package/dist/locales/pt/parsers/PTTimeExpressionParser.js.map +1 -0
- package/dist/locales/pt/parsers/PTWeekdayParser.js +1 -0
- package/dist/locales/pt/parsers/PTWeekdayParser.js.map +1 -0
- package/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js +1 -0
- package/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js.map +1 -0
- package/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js +1 -0
- package/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js.map +1 -0
- package/dist/locales/ru/constants.d.ts +33 -0
- package/dist/locales/ru/constants.js +302 -0
- package/dist/locales/ru/constants.js.map +1 -0
- package/dist/locales/ru/index.d.ts +8 -0
- package/dist/locales/ru/index.js +56 -0
- package/dist/locales/ru/index.js.map +1 -0
- package/dist/locales/ru/parsers/RUCasualDateParser.d.ts +8 -0
- package/dist/locales/ru/parsers/RUCasualDateParser.js +52 -0
- package/dist/locales/ru/parsers/RUCasualDateParser.js.map +1 -0
- package/dist/locales/ru/parsers/RUCasualTimeParser.d.ts +7 -0
- package/dist/locales/ru/parsers/RUCasualTimeParser.js +74 -0
- package/dist/locales/ru/parsers/RUCasualTimeParser.js.map +1 -0
- package/dist/locales/ru/parsers/RUMonthNameLittleEndianParser.d.ts +8 -0
- package/dist/locales/ru/parsers/RUMonthNameLittleEndianParser.js +59 -0
- package/dist/locales/ru/parsers/RUMonthNameLittleEndianParser.js.map +1 -0
- package/dist/locales/ru/parsers/RUMonthNameParser.d.ts +7 -0
- package/dist/locales/ru/parsers/RUMonthNameParser.js +45 -0
- package/dist/locales/ru/parsers/RUMonthNameParser.js.map +1 -0
- package/dist/locales/ru/parsers/RURelativeDateFormatParser.d.ts +8 -0
- package/dist/locales/ru/parsers/RURelativeDateFormatParser.js +60 -0
- package/dist/locales/ru/parsers/RURelativeDateFormatParser.js.map +1 -0
- package/dist/locales/ru/parsers/RUTimeExpressionParser.d.ts +12 -0
- package/dist/locales/ru/parsers/RUTimeExpressionParser.js +57 -0
- package/dist/locales/ru/parsers/RUTimeExpressionParser.js.map +1 -0
- package/dist/locales/ru/parsers/RUTimeUnitAgoFormatParser.d.ts +8 -0
- package/dist/locales/ru/parsers/RUTimeUnitAgoFormatParser.js +22 -0
- package/dist/locales/ru/parsers/RUTimeUnitAgoFormatParser.js.map +1 -0
- package/dist/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.d.ts +8 -0
- package/dist/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.js +29 -0
- package/dist/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.js.map +1 -0
- package/dist/locales/ru/parsers/RUTimeUnitWithinFormatParser.d.ts +8 -0
- package/dist/locales/ru/parsers/RUTimeUnitWithinFormatParser.js +22 -0
- package/dist/locales/ru/parsers/RUTimeUnitWithinFormatParser.js.map +1 -0
- package/dist/locales/ru/parsers/RUWeekdayParser.d.ts +8 -0
- package/dist/locales/ru/parsers/RUWeekdayParser.js +55 -0
- package/dist/locales/ru/parsers/RUWeekdayParser.js.map +1 -0
- package/dist/locales/ru/refiners/RUMergeDateRangeRefiner.d.ts +4 -0
- package/dist/locales/ru/refiners/RUMergeDateRangeRefiner.js +13 -0
- package/dist/locales/ru/refiners/RUMergeDateRangeRefiner.js.map +1 -0
- package/dist/locales/ru/refiners/RUMergeDateTimeRefiner.d.ts +4 -0
- package/dist/locales/ru/refiners/RUMergeDateTimeRefiner.js +13 -0
- package/dist/locales/ru/refiners/RUMergeDateTimeRefiner.js.map +1 -0
- package/dist/locales/zh/hans/constants.js +1 -0
- package/dist/locales/zh/hans/constants.js.map +1 -0
- package/dist/locales/zh/hans/index.js +1 -0
- package/dist/locales/zh/hans/index.js.map +1 -0
- package/dist/locales/zh/hans/parsers/ZHHansCasualDateParser.js +1 -0
- package/dist/locales/zh/hans/parsers/ZHHansCasualDateParser.js.map +1 -0
- package/dist/locales/zh/hans/parsers/ZHHansDateParser.js +1 -0
- package/dist/locales/zh/hans/parsers/ZHHansDateParser.js.map +1 -0
- package/dist/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.js +1 -0
- package/dist/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.js.map +1 -0
- package/dist/locales/zh/hans/parsers/ZHHansRelationWeekdayParser.js +1 -0
- package/dist/locales/zh/hans/parsers/ZHHansRelationWeekdayParser.js.map +1 -0
- package/dist/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js +1 -0
- package/dist/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js.map +1 -0
- package/dist/locales/zh/hans/parsers/ZHHansWeekdayParser.js +1 -0
- package/dist/locales/zh/hans/parsers/ZHHansWeekdayParser.js.map +1 -0
- package/dist/locales/zh/hans/refiners/ZHHansMergeDateRangeRefiner.js +1 -0
- package/dist/locales/zh/hans/refiners/ZHHansMergeDateRangeRefiner.js.map +1 -0
- package/dist/locales/zh/hans/refiners/ZHHansMergeDateTimeRefiner.js +1 -0
- package/dist/locales/zh/hans/refiners/ZHHansMergeDateTimeRefiner.js.map +1 -0
- package/dist/locales/zh/hant/constants.js +1 -0
- package/dist/locales/zh/hant/constants.js.map +1 -0
- package/dist/locales/zh/hant/index.js +1 -0
- package/dist/locales/zh/hant/index.js.map +1 -0
- package/dist/locales/zh/hant/parsers/ZHHantCasualDateParser.js +1 -0
- package/dist/locales/zh/hant/parsers/ZHHantCasualDateParser.js.map +1 -0
- package/dist/locales/zh/hant/parsers/ZHHantDateParser.js +1 -0
- package/dist/locales/zh/hant/parsers/ZHHantDateParser.js.map +1 -0
- package/dist/locales/zh/hant/parsers/ZHHantDeadlineFormatParser.js +1 -0
- package/dist/locales/zh/hant/parsers/ZHHantDeadlineFormatParser.js.map +1 -0
- package/dist/locales/zh/hant/parsers/ZHHantRelationWeekdayParser.js +1 -0
- package/dist/locales/zh/hant/parsers/ZHHantRelationWeekdayParser.js.map +1 -0
- package/dist/locales/zh/hant/parsers/ZHHantTimeExpressionParser.js +1 -0
- package/dist/locales/zh/hant/parsers/ZHHantTimeExpressionParser.js.map +1 -0
- package/dist/locales/zh/hant/parsers/ZHHantWeekdayParser.js +1 -0
- package/dist/locales/zh/hant/parsers/ZHHantWeekdayParser.js.map +1 -0
- package/dist/locales/zh/hant/refiners/ZHHantMergeDateRangeRefiner.js +1 -0
- package/dist/locales/zh/hant/refiners/ZHHantMergeDateRangeRefiner.js.map +1 -0
- package/dist/locales/zh/hant/refiners/ZHHantMergeDateTimeRefiner.js +1 -0
- package/dist/locales/zh/hant/refiners/ZHHantMergeDateTimeRefiner.js.map +1 -0
- package/dist/locales/zh/index.d.ts +1 -1
- package/dist/locales/zh/index.js +14 -2
- package/dist/locales/zh/index.js.map +1 -0
- package/dist/results.d.ts +2 -2
- package/dist/results.js +1 -0
- package/dist/results.js.map +1 -0
- package/dist/timezone.js +1 -0
- package/dist/timezone.js.map +1 -0
- package/dist/utils/dayjs.js +1 -0
- package/dist/utils/dayjs.js.map +1 -0
- package/dist/utils/pattern.js +1 -0
- package/dist/utils/pattern.js.map +1 -0
- package/dist/utils/timeunits.js +1 -0
- package/dist/utils/timeunits.js.map +1 -0
- package/package.json +1 -1
- package/src/common/casualReferences.ts +64 -9
- package/src/common/parsers/AbstractParserWithWordBoundary.ts +5 -1
- package/src/common/parsers/AbstractTimeExpressionParser.ts +52 -28
- package/src/common/refiners/ExtractTimezoneOffsetRefiner.ts +5 -1
- package/src/index.ts +2 -1
- package/src/locales/fr/parsers/FRTimeUnitWithinFormatParser.ts +1 -1
- package/src/locales/ru/constants.ts +344 -0
- package/src/locales/ru/index.ts +84 -0
- package/src/locales/ru/parsers/RUCasualDateParser.ts +44 -0
- package/src/locales/ru/parsers/RUCasualTimeParser.ts +56 -0
- package/src/locales/ru/parsers/RUMonthNameLittleEndianParser.ts +72 -0
- package/src/locales/ru/parsers/RUMonthNameParser.ts +61 -0
- package/src/locales/ru/parsers/RURelativeDateFormatParser.ts +75 -0
- package/src/locales/ru/parsers/RUTimeExpressionParser.ts +64 -0
- package/src/locales/ru/parsers/RUTimeUnitAgoFormatParser.ts +24 -0
- package/src/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.ts +34 -0
- package/src/locales/ru/parsers/RUTimeUnitWithinFormatParser.ts +24 -0
- package/src/locales/ru/parsers/RUWeekdayParser.ts +63 -0
- package/src/locales/ru/refiners/RUMergeDateRangeRefiner.ts +13 -0
- package/src/locales/ru/refiners/RUMergeDateTimeRefiner.ts +13 -0
- package/src/locales/zh/index.ts +1 -1
- package/src/results.ts +3 -3
- package/src/utils/timeunits.ts +2 -2
- package/test/en/en_relative.test.ts +6 -0
- package/test/en/en_timezone_exp.test.ts +27 -0
- package/test/en/negative_cases.test.ts +8 -0
- package/test/fr/fr_time_units_within.test.ts +7 -0
- package/test/ru/ru_casual.test.ts +147 -0
- package/test/ru/ru_month.test.ts +70 -0
- package/test/ru/ru_month_name_little_endian.test.ts +145 -0
- package/test/ru/ru_relative.test.ts +74 -0
- package/test/ru/ru_time_exp.test.ts +111 -0
- package/test/ru/ru_time_units_ago.test.ts +48 -0
- package/test/ru/ru_time_units_casual_relative.test.ts +112 -0
- package/test/ru/ru_time_units_within.test.ts +16 -0
- package/test/ru/ru_weekday.test.ts +52 -0
- package/tsconfig.json +1 -1
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { OpUnitType, QUnitType } from "dayjs";
|
|
2
|
+
import { matchAnyPattern, repeatedTimeunitPattern } from "../../utils/pattern";
|
|
3
|
+
import { findMostLikelyADYear } from "../../calculation/years";
|
|
4
|
+
import { TimeUnits } from "../../utils/timeunits";
|
|
5
|
+
|
|
6
|
+
export const REGEX_PARTS = {
|
|
7
|
+
leftBoundary: "([^\\p{L}\\p{N}_]|^)",
|
|
8
|
+
rightBoundary: "(?=[^\\p{L}\\p{N}_]|$)",
|
|
9
|
+
flags: "iu",
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const WEEKDAY_DICTIONARY: { [word: string]: number } = {
|
|
13
|
+
воскресенье: 0,
|
|
14
|
+
воскресенья: 0,
|
|
15
|
+
вск: 0,
|
|
16
|
+
"вск.": 0,
|
|
17
|
+
понедельник: 1,
|
|
18
|
+
понедельника: 1,
|
|
19
|
+
пн: 1,
|
|
20
|
+
"пн.": 1,
|
|
21
|
+
вторник: 2,
|
|
22
|
+
вторника: 2,
|
|
23
|
+
вт: 2,
|
|
24
|
+
"вт.": 2,
|
|
25
|
+
среда: 3,
|
|
26
|
+
среды: 3,
|
|
27
|
+
среду: 3,
|
|
28
|
+
ср: 3,
|
|
29
|
+
"ср.": 3,
|
|
30
|
+
четверг: 4,
|
|
31
|
+
четверга: 4,
|
|
32
|
+
чт: 4,
|
|
33
|
+
"чт.": 4,
|
|
34
|
+
пятница: 5,
|
|
35
|
+
пятницу: 5,
|
|
36
|
+
пятницы: 5,
|
|
37
|
+
пт: 5,
|
|
38
|
+
"пт.": 5,
|
|
39
|
+
суббота: 6,
|
|
40
|
+
субботу: 6,
|
|
41
|
+
субботы: 6,
|
|
42
|
+
сб: 6,
|
|
43
|
+
"сб.": 6,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const FULL_MONTH_NAME_DICTIONARY: { [word: string]: number } = {
|
|
47
|
+
январь: 1,
|
|
48
|
+
января: 1,
|
|
49
|
+
январе: 1,
|
|
50
|
+
февряль: 2,
|
|
51
|
+
февряля: 2,
|
|
52
|
+
февряле: 2,
|
|
53
|
+
март: 3,
|
|
54
|
+
марта: 3,
|
|
55
|
+
марте: 3,
|
|
56
|
+
апрель: 4,
|
|
57
|
+
апреля: 4,
|
|
58
|
+
апреле: 4,
|
|
59
|
+
май: 5,
|
|
60
|
+
мая: 5,
|
|
61
|
+
мае: 5,
|
|
62
|
+
июнь: 6,
|
|
63
|
+
июня: 6,
|
|
64
|
+
июне: 6,
|
|
65
|
+
июль: 7,
|
|
66
|
+
июля: 7,
|
|
67
|
+
июле: 7,
|
|
68
|
+
август: 8,
|
|
69
|
+
августа: 8,
|
|
70
|
+
августе: 8,
|
|
71
|
+
сентябрь: 9,
|
|
72
|
+
сентября: 9,
|
|
73
|
+
сентябре: 9,
|
|
74
|
+
октябрь: 10,
|
|
75
|
+
октября: 10,
|
|
76
|
+
октябре: 10,
|
|
77
|
+
ноябрь: 11,
|
|
78
|
+
ноября: 11,
|
|
79
|
+
ноябре: 11,
|
|
80
|
+
декабрь: 12,
|
|
81
|
+
декабря: 12,
|
|
82
|
+
декабре: 12,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const MONTH_DICTIONARY: { [word: string]: number } = {
|
|
86
|
+
...FULL_MONTH_NAME_DICTIONARY,
|
|
87
|
+
янв: 1,
|
|
88
|
+
"янв.": 1,
|
|
89
|
+
фев: 2,
|
|
90
|
+
"фев.": 2,
|
|
91
|
+
мар: 3,
|
|
92
|
+
"мар.": 3,
|
|
93
|
+
апр: 4,
|
|
94
|
+
"апр.": 4,
|
|
95
|
+
авг: 8,
|
|
96
|
+
"авг.": 8,
|
|
97
|
+
сен: 9,
|
|
98
|
+
"сен.": 9,
|
|
99
|
+
окт: 10,
|
|
100
|
+
"окт.": 10,
|
|
101
|
+
ноя: 11,
|
|
102
|
+
"ноя.": 11,
|
|
103
|
+
дек: 12,
|
|
104
|
+
"дек.": 12,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export const INTEGER_WORD_DICTIONARY: { [word: string]: number } = {
|
|
108
|
+
один: 1,
|
|
109
|
+
одна: 1,
|
|
110
|
+
одной: 1,
|
|
111
|
+
одну: 1,
|
|
112
|
+
две: 2,
|
|
113
|
+
два: 2,
|
|
114
|
+
двух: 2,
|
|
115
|
+
три: 3,
|
|
116
|
+
трех: 3,
|
|
117
|
+
трёх: 3,
|
|
118
|
+
четыре: 4,
|
|
119
|
+
четырех: 4,
|
|
120
|
+
четырёх: 4,
|
|
121
|
+
пять: 5,
|
|
122
|
+
пяти: 5,
|
|
123
|
+
шесть: 6,
|
|
124
|
+
шести: 6,
|
|
125
|
+
семь: 7,
|
|
126
|
+
семи: 7,
|
|
127
|
+
восемь: 8,
|
|
128
|
+
восемьми: 8,
|
|
129
|
+
девять: 9,
|
|
130
|
+
девяти: 9,
|
|
131
|
+
десять: 10,
|
|
132
|
+
десяти: 10,
|
|
133
|
+
одиннадцать: 11,
|
|
134
|
+
одиннадцати: 11,
|
|
135
|
+
двенадцать: 12,
|
|
136
|
+
двенадцати: 12,
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export const ORDINAL_WORD_DICTIONARY: { [word: string]: number } = {
|
|
140
|
+
первое: 1,
|
|
141
|
+
первого: 1,
|
|
142
|
+
второе: 2,
|
|
143
|
+
второго: 2,
|
|
144
|
+
третье: 3,
|
|
145
|
+
третьего: 3,
|
|
146
|
+
четвертое: 4,
|
|
147
|
+
четвертого: 4,
|
|
148
|
+
пятое: 5,
|
|
149
|
+
пятого: 5,
|
|
150
|
+
шестое: 6,
|
|
151
|
+
шестого: 6,
|
|
152
|
+
седьмое: 7,
|
|
153
|
+
седьмого: 7,
|
|
154
|
+
восьмое: 8,
|
|
155
|
+
восьмого: 8,
|
|
156
|
+
девятое: 9,
|
|
157
|
+
девятого: 9,
|
|
158
|
+
десятое: 10,
|
|
159
|
+
десятого: 10,
|
|
160
|
+
одиннадцатое: 11,
|
|
161
|
+
одиннадцатого: 11,
|
|
162
|
+
двенадцатое: 12,
|
|
163
|
+
двенадцатого: 12,
|
|
164
|
+
тринадцатое: 13,
|
|
165
|
+
тринадцатого: 13,
|
|
166
|
+
четырнадцатое: 14,
|
|
167
|
+
четырнадцатого: 14,
|
|
168
|
+
пятнадцатое: 15,
|
|
169
|
+
пятнадцатого: 15,
|
|
170
|
+
шестнадцатое: 16,
|
|
171
|
+
шестнадцатого: 16,
|
|
172
|
+
семнадцатое: 17,
|
|
173
|
+
семнадцатого: 17,
|
|
174
|
+
восемнадцатое: 18,
|
|
175
|
+
восемнадцатого: 18,
|
|
176
|
+
девятнадцатое: 19,
|
|
177
|
+
девятнадцатого: 19,
|
|
178
|
+
двадцатое: 20,
|
|
179
|
+
двадцатого: 20,
|
|
180
|
+
"двадцать первое": 21,
|
|
181
|
+
"двадцать первого": 21,
|
|
182
|
+
"двадцать второе": 22,
|
|
183
|
+
"двадцать второго": 22,
|
|
184
|
+
"двадцать третье": 23,
|
|
185
|
+
"двадцать третьего": 23,
|
|
186
|
+
"двадцать четвертое": 24,
|
|
187
|
+
"двадцать четвертого": 24,
|
|
188
|
+
"двадцать пятое": 25,
|
|
189
|
+
"двадцать пятого": 25,
|
|
190
|
+
"двадцать шестое": 26,
|
|
191
|
+
"двадцать шестого": 26,
|
|
192
|
+
"двадцать седьмое": 27,
|
|
193
|
+
"двадцать седьмого": 27,
|
|
194
|
+
"двадцать восьмое": 28,
|
|
195
|
+
"двадцать восьмого": 28,
|
|
196
|
+
"двадцать девятое": 29,
|
|
197
|
+
"двадцать девятого": 29,
|
|
198
|
+
"тридцатое": 30,
|
|
199
|
+
"тридцатого": 30,
|
|
200
|
+
"тридцать первое": 31,
|
|
201
|
+
"тридцать первого": 31,
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
export const TIME_UNIT_DICTIONARY: { [word: string]: OpUnitType | QUnitType } = {
|
|
205
|
+
сек: "second",
|
|
206
|
+
секунда: "second",
|
|
207
|
+
секунд: "second",
|
|
208
|
+
секунды: "second",
|
|
209
|
+
секунду: "second",
|
|
210
|
+
секундочка: "second",
|
|
211
|
+
секундочки: "second",
|
|
212
|
+
секундочек: "second",
|
|
213
|
+
секундочку: "second",
|
|
214
|
+
мин: "minute",
|
|
215
|
+
минута: "minute",
|
|
216
|
+
минут: "minute",
|
|
217
|
+
минуты: "minute",
|
|
218
|
+
минуту: "minute",
|
|
219
|
+
минуток: "minute",
|
|
220
|
+
минутки: "minute",
|
|
221
|
+
минутку: "minute",
|
|
222
|
+
час: "hour",
|
|
223
|
+
часов: "hour",
|
|
224
|
+
часа: "hour",
|
|
225
|
+
часу: "hour",
|
|
226
|
+
часиков: "hour",
|
|
227
|
+
часика: "hour",
|
|
228
|
+
часике: "hour",
|
|
229
|
+
часик: "hour",
|
|
230
|
+
день: "d",
|
|
231
|
+
дня: "d",
|
|
232
|
+
дней: "d",
|
|
233
|
+
суток: "d",
|
|
234
|
+
сутки: "d",
|
|
235
|
+
неделя: "week",
|
|
236
|
+
неделе: "week",
|
|
237
|
+
недели: "week",
|
|
238
|
+
неделю: "week",
|
|
239
|
+
недель: "week",
|
|
240
|
+
недельке: "week",
|
|
241
|
+
недельки: "week",
|
|
242
|
+
неделек: "week",
|
|
243
|
+
месяц: "month",
|
|
244
|
+
месяце: "month",
|
|
245
|
+
месяцев: "month",
|
|
246
|
+
месяца: "month",
|
|
247
|
+
квартал: "quarter",
|
|
248
|
+
квартале: "quarter",
|
|
249
|
+
кварталов: "quarter",
|
|
250
|
+
год: "year",
|
|
251
|
+
года: "year",
|
|
252
|
+
году: "year",
|
|
253
|
+
годов: "year",
|
|
254
|
+
лет: "year",
|
|
255
|
+
годик: "year",
|
|
256
|
+
годика: "year",
|
|
257
|
+
годиков: "year",
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
//-----------------------------
|
|
261
|
+
|
|
262
|
+
export const NUMBER_PATTERN = `(?:${matchAnyPattern(
|
|
263
|
+
INTEGER_WORD_DICTIONARY
|
|
264
|
+
)}|[0-9]+|[0-9]+\\.[0-9]+|пол|несколько|пар(?:ы|у)|\\s{0,3})`;
|
|
265
|
+
|
|
266
|
+
export function parseNumberPattern(match: string): number {
|
|
267
|
+
const num = match.toLowerCase();
|
|
268
|
+
if (INTEGER_WORD_DICTIONARY[num] !== undefined) {
|
|
269
|
+
return INTEGER_WORD_DICTIONARY[num];
|
|
270
|
+
}
|
|
271
|
+
if (num.match(/несколько/)) {
|
|
272
|
+
return 3;
|
|
273
|
+
} else if (num.match(/пол/)) {
|
|
274
|
+
return 0.5;
|
|
275
|
+
} else if (num.match(/пар/)) {
|
|
276
|
+
return 2;
|
|
277
|
+
} else if (num === "") {
|
|
278
|
+
return 1;
|
|
279
|
+
}
|
|
280
|
+
return parseFloat(num);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
//-----------------------------
|
|
284
|
+
|
|
285
|
+
export const ORDINAL_NUMBER_PATTERN = `(?:${matchAnyPattern(ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:го|ого|е|ое)?)`;
|
|
286
|
+
export function parseOrdinalNumberPattern(match: string): number {
|
|
287
|
+
let num = match.toLowerCase();
|
|
288
|
+
if (ORDINAL_WORD_DICTIONARY[num] !== undefined) {
|
|
289
|
+
return ORDINAL_WORD_DICTIONARY[num];
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
num = num.replace(/(?:st|nd|rd|th)$/i, "");
|
|
293
|
+
return parseInt(num);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
//-----------------------------
|
|
297
|
+
|
|
298
|
+
const year = "(?:\\s+(?:году|года|год|г|г.))?";
|
|
299
|
+
export const YEAR_PATTERN = `(?:[1-9][0-9]{0,3}${year}\\s*(?:н.э.|до н.э.|н. э.|до н. э.)|[1-2][0-9]{3}${year}|[5-9][0-9]${year})`;
|
|
300
|
+
export function parseYear(match: string): number {
|
|
301
|
+
if (/(год|года|г|г.)/i.test(match)) {
|
|
302
|
+
match = match.replace(/(год|года|г|г.)/i, "");
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (/(до н.э.|до н. э.)/i.test(match)) {
|
|
306
|
+
//Before Common Era
|
|
307
|
+
match = match.replace(/(до н.э.|до н. э.)/i, "");
|
|
308
|
+
return -parseInt(match);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (/(н. э.|н.э.)/i.test(match)) {
|
|
312
|
+
//Common Era
|
|
313
|
+
match = match.replace(/(н. э.|н.э.)/i, "");
|
|
314
|
+
return parseInt(match);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const rawYearNumber = parseInt(match);
|
|
318
|
+
return findMostLikelyADYear(rawYearNumber);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
//-----------------------------
|
|
322
|
+
|
|
323
|
+
const SINGLE_TIME_UNIT_PATTERN = `(${NUMBER_PATTERN})\\s{0,3}(${matchAnyPattern(TIME_UNIT_DICTIONARY)})`;
|
|
324
|
+
const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i");
|
|
325
|
+
|
|
326
|
+
export const TIME_UNITS_PATTERN = repeatedTimeunitPattern(`(?:(?:около|примерно)\\s{0,3})?`, SINGLE_TIME_UNIT_PATTERN);
|
|
327
|
+
|
|
328
|
+
export function parseTimeUnits(timeunitText): TimeUnits {
|
|
329
|
+
const fragments = {};
|
|
330
|
+
let remainingText = timeunitText;
|
|
331
|
+
let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText);
|
|
332
|
+
while (match) {
|
|
333
|
+
collectDateTimeFragment(fragments, match);
|
|
334
|
+
remainingText = remainingText.substring(match[0].length).trim();
|
|
335
|
+
match = SINGLE_TIME_UNIT_REGEX.exec(remainingText);
|
|
336
|
+
}
|
|
337
|
+
return fragments;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function collectDateTimeFragment(fragments, match) {
|
|
341
|
+
const num = parseNumberPattern(match[1]);
|
|
342
|
+
const unit = TIME_UNIT_DICTIONARY[match[2].toLowerCase()];
|
|
343
|
+
fragments[unit] = num;
|
|
344
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chrono components for Russian support (*parsers*, *refiners*, and *configuration*)
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import RUTimeUnitWithinFormatParser from "./parsers/RUTimeUnitWithinFormatParser";
|
|
8
|
+
import RUMonthNameLittleEndianParser from "./parsers/RUMonthNameLittleEndianParser";
|
|
9
|
+
import RUMonthNameParser from "./parsers/RUMonthNameParser";
|
|
10
|
+
import RUTimeExpressionParser from "./parsers/RUTimeExpressionParser";
|
|
11
|
+
import RUTimeUnitAgoFormatParser from "./parsers/RUTimeUnitAgoFormatParser";
|
|
12
|
+
import RUMergeDateRangeRefiner from "./refiners/RUMergeDateRangeRefiner";
|
|
13
|
+
import RUMergeDateTimeRefiner from "./refiners/RUMergeDateTimeRefiner";
|
|
14
|
+
|
|
15
|
+
import { includeCommonConfiguration } from "../../configurations";
|
|
16
|
+
import RUCasualDateParser from "./parsers/RUCasualDateParser";
|
|
17
|
+
import RUCasualTimeParser from "./parsers/RUCasualTimeParser";
|
|
18
|
+
import RUWeekdayParser from "./parsers/RUWeekdayParser";
|
|
19
|
+
import RURelativeDateFormatParser from "./parsers/RURelativeDateFormatParser";
|
|
20
|
+
|
|
21
|
+
import { ParsedResult, ParsingOption } from "../../index";
|
|
22
|
+
import { Chrono, Configuration } from "../../chrono";
|
|
23
|
+
import SlashDateFormatParser from "../../common/parsers/SlashDateFormatParser";
|
|
24
|
+
import RUTimeUnitCasualRelativeFormatParser from "./parsers/RUTimeUnitCasualRelativeFormatParser";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Chrono object configured for parsing *casual* Russian
|
|
28
|
+
*/
|
|
29
|
+
export const casual = new Chrono(createCasualConfiguration());
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Chrono object configured for parsing *strict* Russian
|
|
33
|
+
*/
|
|
34
|
+
export const strict = new Chrono(createConfiguration(true));
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* A shortcut for ru.casual.parse()
|
|
38
|
+
*/
|
|
39
|
+
export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
|
|
40
|
+
return casual.parse(text, ref, option);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* A shortcut for ru.casual.parseDate()
|
|
45
|
+
*/
|
|
46
|
+
export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
|
|
47
|
+
return casual.parseDate(text, ref, option);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Create a default *casual* {@Link Configuration} for Russian chrono.
|
|
52
|
+
* It calls {@Link createConfiguration} and includes additional parsers.
|
|
53
|
+
*/
|
|
54
|
+
export function createCasualConfiguration(): Configuration {
|
|
55
|
+
const option = createConfiguration(false);
|
|
56
|
+
option.parsers.unshift(new RUCasualDateParser());
|
|
57
|
+
option.parsers.unshift(new RUCasualTimeParser());
|
|
58
|
+
option.parsers.unshift(new RUMonthNameParser());
|
|
59
|
+
option.parsers.unshift(new RURelativeDateFormatParser());
|
|
60
|
+
option.parsers.unshift(new RUTimeUnitCasualRelativeFormatParser());
|
|
61
|
+
return option;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Create a default {@Link Configuration} for Russian chrono
|
|
66
|
+
*
|
|
67
|
+
* @param strictMode If the timeunit mentioning should be strict, not casual
|
|
68
|
+
*/
|
|
69
|
+
export function createConfiguration(strictMode = true): Configuration {
|
|
70
|
+
return includeCommonConfiguration(
|
|
71
|
+
{
|
|
72
|
+
parsers: [
|
|
73
|
+
new SlashDateFormatParser(true),
|
|
74
|
+
new RUTimeUnitWithinFormatParser(),
|
|
75
|
+
new RUMonthNameLittleEndianParser(),
|
|
76
|
+
new RUWeekdayParser(),
|
|
77
|
+
new RUTimeExpressionParser(strictMode),
|
|
78
|
+
new RUTimeUnitAgoFormatParser(),
|
|
79
|
+
],
|
|
80
|
+
refiners: [new RUMergeDateTimeRefiner(), new RUMergeDateRangeRefiner()],
|
|
81
|
+
},
|
|
82
|
+
strictMode
|
|
83
|
+
);
|
|
84
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ParsingContext } from "../../../chrono";
|
|
2
|
+
import { ParsingComponents, ParsingResult } from "../../../results";
|
|
3
|
+
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
|
|
4
|
+
import * as references from "../../../common/casualReferences";
|
|
5
|
+
import { REGEX_PARTS } from "../constants";
|
|
6
|
+
|
|
7
|
+
const PATTERN = new RegExp(
|
|
8
|
+
`(?:с|со)?\\s*(сегодня|вчера|завтра|послезавтра|позавчера)${REGEX_PARTS.rightBoundary}`,
|
|
9
|
+
REGEX_PARTS.flags
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export default class RUCasualDateParser extends AbstractParserWithWordBoundaryChecking {
|
|
13
|
+
patternLeftBoundary(): string {
|
|
14
|
+
return REGEX_PARTS.leftBoundary;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
innerPattern(context: ParsingContext): RegExp {
|
|
18
|
+
return PATTERN;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents | ParsingResult {
|
|
22
|
+
const lowerText = match[1].toLowerCase();
|
|
23
|
+
const component = context.createParsingComponents();
|
|
24
|
+
|
|
25
|
+
switch (lowerText) {
|
|
26
|
+
case "сегодня":
|
|
27
|
+
return references.today(context.reference);
|
|
28
|
+
|
|
29
|
+
case "вчера":
|
|
30
|
+
return references.yesterday(context.reference);
|
|
31
|
+
|
|
32
|
+
case "завтра":
|
|
33
|
+
return references.tomorrow(context.reference);
|
|
34
|
+
|
|
35
|
+
case "послезавтра":
|
|
36
|
+
return references.theDayAfter(context.reference, 2);
|
|
37
|
+
|
|
38
|
+
case "позавчера":
|
|
39
|
+
return references.theDayBefore(context.reference, 2);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return component;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ParsingContext } from "../../../chrono";
|
|
2
|
+
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
|
|
3
|
+
import * as references from "../../../common/casualReferences";
|
|
4
|
+
import { assignSimilarDate } from "../../../utils/dayjs";
|
|
5
|
+
import dayjs from "dayjs";
|
|
6
|
+
import { REGEX_PARTS } from "../constants";
|
|
7
|
+
|
|
8
|
+
const PATTERN = new RegExp(
|
|
9
|
+
`(сейчас|прошлым\\s*вечером|прошлой\\s*ночью|следующей\\s*ночью|сегодня\\s*ночью|этой\\s*ночью|ночью|этим утром|утром|утра|в\\s*полдень|вечером|вечера|в\\s*полночь)` +
|
|
10
|
+
`${REGEX_PARTS.rightBoundary}`,
|
|
11
|
+
REGEX_PARTS.flags
|
|
12
|
+
);
|
|
13
|
+
export default class RUCasualTimeParser extends AbstractParserWithWordBoundaryChecking {
|
|
14
|
+
patternLeftBoundary(): string {
|
|
15
|
+
return REGEX_PARTS.leftBoundary;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
innerPattern() {
|
|
19
|
+
return PATTERN;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
innerExtract(context: ParsingContext, match: RegExpMatchArray) {
|
|
23
|
+
let targetDate = dayjs(context.refDate);
|
|
24
|
+
const lowerText = match[0].toLowerCase();
|
|
25
|
+
const component = context.createParsingComponents();
|
|
26
|
+
|
|
27
|
+
if (lowerText === "сейчас") {
|
|
28
|
+
return references.now(context.reference);
|
|
29
|
+
}
|
|
30
|
+
if (lowerText === "вечером" || lowerText === "вечера") {
|
|
31
|
+
return references.evening(context.reference);
|
|
32
|
+
}
|
|
33
|
+
if (lowerText.endsWith("утром") || lowerText.endsWith("утра")) {
|
|
34
|
+
return references.morning(context.reference);
|
|
35
|
+
}
|
|
36
|
+
if (lowerText.match(/в\s*полдень/)) {
|
|
37
|
+
return references.noon(context.reference);
|
|
38
|
+
}
|
|
39
|
+
if (lowerText.match(/прошлой\s*ночью/)) {
|
|
40
|
+
return references.lastNight(context.reference);
|
|
41
|
+
}
|
|
42
|
+
if (lowerText.match(/прошлым\s*вечером/)) {
|
|
43
|
+
return references.yesterdayEvening(context.reference);
|
|
44
|
+
}
|
|
45
|
+
if (lowerText.match(/следующей\s*ночью/)) {
|
|
46
|
+
const daysToAdd = targetDate.hour() < 22 ? 1 : 2;
|
|
47
|
+
targetDate = targetDate.add(daysToAdd, "day");
|
|
48
|
+
assignSimilarDate(component, targetDate);
|
|
49
|
+
component.imply("hour", 0);
|
|
50
|
+
}
|
|
51
|
+
if (lowerText.match(/в\s*полночь/) || lowerText.endsWith("ночью")) {
|
|
52
|
+
return references.midnight(context.reference);
|
|
53
|
+
}
|
|
54
|
+
return component;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { ParsingContext } from "../../../chrono";
|
|
2
|
+
import { ParsingResult } from "../../../results";
|
|
3
|
+
import { findYearClosestToRef } from "../../../calculation/years";
|
|
4
|
+
import { MONTH_DICTIONARY, REGEX_PARTS } from "../constants";
|
|
5
|
+
import { YEAR_PATTERN, parseYear } from "../constants";
|
|
6
|
+
import { ORDINAL_NUMBER_PATTERN, parseOrdinalNumberPattern } from "../constants";
|
|
7
|
+
import { matchAnyPattern } from "../../../utils/pattern";
|
|
8
|
+
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
|
|
9
|
+
|
|
10
|
+
// prettier-ignore
|
|
11
|
+
const PATTERN = new RegExp(
|
|
12
|
+
`(?:с)?\\s*(${ORDINAL_NUMBER_PATTERN})` +
|
|
13
|
+
`(?:` +
|
|
14
|
+
`\\s{0,3}(?:по|-|–|до)?\\s{0,3}` +
|
|
15
|
+
`(${ORDINAL_NUMBER_PATTERN})` +
|
|
16
|
+
`)?` +
|
|
17
|
+
`(?:-|\\/|\\s{0,3}(?:of)?\\s{0,3})` +
|
|
18
|
+
`(${matchAnyPattern(MONTH_DICTIONARY)})` +
|
|
19
|
+
`(?:` +
|
|
20
|
+
`(?:-|\\/|,?\\s{0,3})` +
|
|
21
|
+
`(${YEAR_PATTERN}(?![^\\s]\\d))` +
|
|
22
|
+
`)?` +
|
|
23
|
+
`${REGEX_PARTS.rightBoundary}`,
|
|
24
|
+
REGEX_PARTS.flags
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
const DATE_GROUP = 1;
|
|
28
|
+
const DATE_TO_GROUP = 2;
|
|
29
|
+
const MONTH_NAME_GROUP = 3;
|
|
30
|
+
const YEAR_GROUP = 4;
|
|
31
|
+
|
|
32
|
+
export default class RUMonthNameLittleEndianParser extends AbstractParserWithWordBoundaryChecking {
|
|
33
|
+
patternLeftBoundary(): string {
|
|
34
|
+
return REGEX_PARTS.leftBoundary;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
innerPattern(): RegExp {
|
|
38
|
+
return PATTERN;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingResult {
|
|
42
|
+
const result = context.createParsingResult(match.index, match[0]);
|
|
43
|
+
|
|
44
|
+
const month = MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
|
|
45
|
+
const day = parseOrdinalNumberPattern(match[DATE_GROUP]);
|
|
46
|
+
if (day > 31) {
|
|
47
|
+
// e.g. "[96 Aug]" => "9[6 Aug]", we need to shift away from the next number
|
|
48
|
+
match.index = match.index + match[DATE_GROUP].length;
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
result.start.assign("month", month);
|
|
53
|
+
result.start.assign("day", day);
|
|
54
|
+
|
|
55
|
+
if (match[YEAR_GROUP]) {
|
|
56
|
+
const yearNumber = parseYear(match[YEAR_GROUP]);
|
|
57
|
+
result.start.assign("year", yearNumber);
|
|
58
|
+
} else {
|
|
59
|
+
const year = findYearClosestToRef(context.refDate, day, month);
|
|
60
|
+
result.start.imply("year", year);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (match[DATE_TO_GROUP]) {
|
|
64
|
+
const endDate = parseOrdinalNumberPattern(match[DATE_TO_GROUP]);
|
|
65
|
+
|
|
66
|
+
result.end = result.start.clone();
|
|
67
|
+
result.end.assign("day", endDate);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { FULL_MONTH_NAME_DICTIONARY, MONTH_DICTIONARY, REGEX_PARTS } from "../constants";
|
|
2
|
+
import { ParsingContext } from "../../../chrono";
|
|
3
|
+
import { findYearClosestToRef } from "../../../calculation/years";
|
|
4
|
+
import { matchAnyPattern } from "../../../utils/pattern";
|
|
5
|
+
import { YEAR_PATTERN, parseYear } from "../constants";
|
|
6
|
+
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
|
|
7
|
+
|
|
8
|
+
const PATTERN = new RegExp(
|
|
9
|
+
`((?:в)\\s*)?` +
|
|
10
|
+
`(${matchAnyPattern(MONTH_DICTIONARY)})` +
|
|
11
|
+
`\\s*` +
|
|
12
|
+
`(?:` +
|
|
13
|
+
`[,-]?\\s*(${YEAR_PATTERN})?` +
|
|
14
|
+
`)?` +
|
|
15
|
+
`(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`,
|
|
16
|
+
REGEX_PARTS.flags
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
const MONTH_NAME_GROUP = 2;
|
|
20
|
+
const YEAR_GROUP = 3;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The parser for parsing month name and year.
|
|
24
|
+
* - Январь, 2012
|
|
25
|
+
* - Январь 2012
|
|
26
|
+
* - Январь
|
|
27
|
+
*/
|
|
28
|
+
export default class RUMonthNameParser extends AbstractParserWithWordBoundaryChecking {
|
|
29
|
+
patternLeftBoundary(): string {
|
|
30
|
+
return REGEX_PARTS.leftBoundary;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
innerPattern(): RegExp {
|
|
34
|
+
return PATTERN;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
innerExtract(context: ParsingContext, match: RegExpMatchArray) {
|
|
38
|
+
const monthName = match[MONTH_NAME_GROUP].toLowerCase();
|
|
39
|
+
|
|
40
|
+
// skip some unlikely words "янв", "фер", ..
|
|
41
|
+
if (match[0].length <= 3 && !FULL_MONTH_NAME_DICTIONARY[monthName]) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const result = context.createParsingResult(match.index, match.index + match[0].length);
|
|
46
|
+
result.start.imply("day", 1);
|
|
47
|
+
|
|
48
|
+
const month = MONTH_DICTIONARY[monthName];
|
|
49
|
+
result.start.assign("month", month);
|
|
50
|
+
|
|
51
|
+
if (match[YEAR_GROUP]) {
|
|
52
|
+
const year = parseYear(match[YEAR_GROUP]);
|
|
53
|
+
result.start.assign("year", year);
|
|
54
|
+
} else {
|
|
55
|
+
const year = findYearClosestToRef(context.refDate, 1, month);
|
|
56
|
+
result.start.imply("year", year);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
}
|