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;
}