protected parseOneWordPeriod()

in JavaScript/packages/recognizers-date-time/src/dateTime/baseDatePeriod.ts [478:727]


    protected parseOneWordPeriod(source: string, referenceDate: Date): DateTimeResolutionResult {
        let result = new DateTimeResolutionResult();
        let year = referenceDate.getFullYear();
        let month = referenceDate.getMonth();
        let earlyPrefix = false;
        let latePrefix = false;
        let midPrefix = false;
        let isRef = false;

        let earlierPrefix = false;
        let laterPrefix = false;

        if (this.config.isYearToDate(source)) {
            result.timex = DateTimeFormatUtil.toString(year, 4);
            result.futureValue = [DateUtils.safeCreateFromValue(DateUtils.minValue(), year, 0, 1), referenceDate];
            result.pastValue = [DateUtils.safeCreateFromValue(DateUtils.minValue(), year, 0, 1), referenceDate];
            result.success = true;
            return result;
        }
        if (this.config.isMonthToDate(source)) {
            result.timex = `${DateTimeFormatUtil.toString(year, 4)}-${DateTimeFormatUtil.toString(month + 1, 2)}`;
            result.futureValue = [DateUtils.safeCreateFromValue(DateUtils.minValue(), year, month, 1), referenceDate];
            result.pastValue = [DateUtils.safeCreateFromValue(DateUtils.minValue(), year, month, 1), referenceDate];
            result.success = true;
            return result;
        }

        let futureYear = year;
        let pastYear = year;
        let trimedText = source.trim().toLowerCase();
        let match = RegExpUtility.getMatches(this.config.oneWordPeriodRegex, trimedText).pop();

        if (!(match && match.index === 0 && match.length === trimedText.length)) {
            match = RegExpUtility.getMatches(this.config.laterEarlyPeriodRegex, trimedText).pop();
        }

        if (!match || match.index !== 0 || match.length !== trimedText.length) {
            return result;
        }

        if (match.groups("EarlyPrefix").value) {
            earlyPrefix = true;
            trimedText = match.groups("suffix").value;
            result.mod = Constants.EARLY_MOD;
        }

        if (match.groups("LatePrefix").value) {
            latePrefix = true;
            trimedText = match.groups("suffix").value;
            result.mod = Constants.LATE_MOD;
        }

        if (match.groups("MidPrefix").value) {
            latePrefix = true;
            trimedText = match.groups("suffix").value;
            result.mod = Constants.MID_MOD;
        }

        let monthStr = match.groups('month').value;
        let swift = 0;
        if (!StringUtility.isNullOrEmpty(monthStr)) {
            swift = this.config.getSwiftYear(trimedText);
        }
        else {
            swift = this.config.getSwiftDayOrMonth(trimedText);
        }

        if (RegExpUtility.isMatch(this.config.unspecificEndOfRangeRegex, match.value)) {
            latePrefix = true;
            trimedText = match.value;
            result.mod = Constants.LATE_MOD;
        }

        if (match.groups("RelEarly").value) {
            earlierPrefix = true;
            if (this.isPresent(swift)) {
                result.mod = null;
            }
        }

        if (match.groups("RelLate").value) {
            laterPrefix = true;
            if (this.isPresent(swift)) {
                result.mod = null;
            }
        }

        if (!StringUtility.isNullOrEmpty(monthStr)) {
            swift = this.config.getSwiftYear(trimedText);
            month = this.config.monthOfYear.get(monthStr) - 1;
            if (swift >= -1) {
                result.timex = `${DateTimeFormatUtil.toString(year + swift, 4)}-${DateTimeFormatUtil.toString(month + 1, 2)}`;
                year += swift;
                futureYear = year;
                pastYear = year;
            }
            else {
                result.timex = `XXXX-${DateTimeFormatUtil.toString(month + 1, 2)}`;
                if (month < referenceDate.getMonth()) {
                    futureYear++;
                }
                if (month >= referenceDate.getMonth()) {
                    pastYear--;
                }
            }
        }
        else {
            swift = this.config.getSwiftDayOrMonth(trimedText);
            if (this.config.isWeekOnly(trimedText)) {
                let monday = DateUtils.addDays(DateUtils.this(referenceDate, DayOfWeek.Monday), 7 * swift);
                let weekNumber = DateUtils.getWeekNumber(monday);

                result.timex = `${DateTimeFormatUtil.toString(weekNumber.year, 4)}-W${DateTimeFormatUtil.toString(weekNumber.weekNo, 2)}`;

                let beginDate = DateUtils.addDays(DateUtils.this(referenceDate, DayOfWeek.Monday), 7 * swift);
                let endDate = this.inclusiveEndPeriod
                    ? DateUtils.addDays(DateUtils.this(referenceDate, DayOfWeek.Sunday), 7 * swift)
                    : DateUtils.addDays(
                        DateUtils.addDays(DateUtils.this(referenceDate, DayOfWeek.Sunday), 7 * swift), 1);

                if (earlyPrefix) {
                    endDate = this.inclusiveEndPeriod
                        ? DateUtils.addDays(DateUtils.this(referenceDate, DayOfWeek.Wednesday), 7 * swift)
                        : DateUtils.addDays(
                            DateUtils.addDays(DateUtils.this(referenceDate, DayOfWeek.Wednesday), 7 * swift), 1);
                }

                if (latePrefix) {
                    beginDate = DateUtils.addDays(DateUtils.this(referenceDate, DayOfWeek.Thursday), 7 * swift);
                }

                if (earlierPrefix && swift === 0) {
                    if (endDate > referenceDate) {
                        endDate = referenceDate;
                    }
                }
                else if (laterPrefix && swift === 0) {
                    if (beginDate < referenceDate) {
                        beginDate = referenceDate;
                    }
                }

                result.futureValue = [beginDate, endDate];
                result.pastValue = [beginDate, endDate];
                result.success = true;
                return result;
            }
            if (this.config.isWeekend(trimedText)) {
                let beginDate = DateUtils.addDays(DateUtils.this(referenceDate, DayOfWeek.Saturday), 7 * swift);
                let endDate = DateUtils.addDays(DateUtils.this(referenceDate, DayOfWeek.Sunday), (7 * swift) + (this.inclusiveEndPeriod ? 0 : 1));

                result.timex = `${DateTimeFormatUtil.toString(beginDate.getFullYear(), 4)}-W${DateTimeFormatUtil.toString(DateUtils.getWeekNumber(beginDate).weekNo, 2)}-WE`;
                result.futureValue = [beginDate, endDate];
                result.pastValue = [beginDate, endDate];
                result.success = true;
                return result;
            }
            if (this.config.isMonthOnly(trimedText)) {
                let tempDate = new Date(referenceDate);
                tempDate.setMonth(referenceDate.getMonth() + swift);
                month = tempDate.getMonth();
                year = tempDate.getFullYear();
                result.timex = `${DateTimeFormatUtil.toString(year, 4)}-${DateTimeFormatUtil.toString(month + 1, 2)}`;
                futureYear = year;
                pastYear = year;
            }
            else if (this.config.isYearOnly(trimedText)) {
                let tempDate = new Date(referenceDate);
                tempDate.setFullYear(referenceDate.getFullYear() + swift);
                year = tempDate.getFullYear();
                let beginDate = DateUtils.safeCreateFromMinValue(year, 0, 1);
                let endDate = this.inclusiveEndPeriod
                    ? DateUtils.safeCreateFromMinValue(year, 11, 31)
                    : DateUtils.addDays(
                        DateUtils.safeCreateFromMinValue(year, 11, 31), 1);
                if (earlyPrefix) {
                    endDate = this.inclusiveEndPeriod
                        ? DateUtils.safeCreateFromMinValue(year, 5, 30)
                        : DateUtils.addDays(
                            DateUtils.safeCreateFromMinValue(year, 5, 30), 1);
                }
                if (latePrefix) {
                    beginDate = DateUtils.safeCreateFromMinValue(year, 6, 1);
                }

                if (earlierPrefix && swift === 0) {
                    if (endDate > referenceDate) {
                        endDate = referenceDate;
                    }
                }
                else if (laterPrefix && swift === 0) {
                    if (beginDate < referenceDate) {
                        beginDate = referenceDate;
                    }
                }

                result.timex = DateTimeFormatUtil.toString(year, 4);
                result.futureValue = [beginDate, endDate];
                result.pastValue = [beginDate, endDate];
                result.success = true;
                return result;
            }
        }

        // only "month" will come to here
        let futureStart = DateUtils.safeCreateFromMinValue(futureYear, month, 1);
        let futureEnd = this.inclusiveEndPeriod
            ? DateUtils.addDays(
                DateUtils.addMonths(
                    DateUtils.safeCreateFromMinValue(futureYear, month, 1), 1), -1)
            : DateUtils.addMonths(
                DateUtils.safeCreateFromMinValue(futureYear, month, 1), 1);
        let pastStart = DateUtils.safeCreateFromMinValue(pastYear, month, 1);
        let pastEnd = this.inclusiveEndPeriod
            ? DateUtils.addDays(
                DateUtils.addMonths(
                    DateUtils.safeCreateFromMinValue(pastYear, month, 1), 1), -1)
            : DateUtils.addMonths(
                DateUtils.safeCreateFromMinValue(pastYear, month, 1), 1);
        if (earlyPrefix) {
            futureEnd = this.inclusiveEndPeriod
                ? DateUtils.safeCreateFromMinValue(futureYear, month, 15)
                : DateUtils.addDays(
                    DateUtils.safeCreateFromMinValue(futureYear, month, 15), 1);
            pastEnd = this.inclusiveEndPeriod
                ? DateUtils.safeCreateFromMinValue(pastYear, month, 15)
                : DateUtils.addDays(
                    DateUtils.safeCreateFromMinValue(pastYear, month, 15), 1);
        }
        else if (latePrefix) {
            futureStart = DateUtils.safeCreateFromMinValue(futureYear, month, 16);
            pastStart = DateUtils.safeCreateFromMinValue(pastYear, month, 16);
        }

        if (earlierPrefix && futureYear === pastYear) {
            if (futureEnd > referenceDate) {
                futureEnd = pastEnd = referenceDate;
            }
        }
        else if (laterPrefix && futureYear === pastYear) {
            if (futureStart < referenceDate) {
                futureStart = pastStart = referenceDate;
            }
        }

        result.futureValue = [futureStart, futureEnd];
        result.pastValue = [pastStart, pastEnd];
        result.success = true;
        return result;
    }