in Python/libraries/recognizers-date-time/recognizers_date_time/date_time/base_dateperiod.py [0:0]
def _parse_one_word_period(self, source: str, reference: datetime) -> DateTimeResolutionResult:
result = DateTimeResolutionResult()
year, month = reference.year, reference.month
if self.config.is_year_to_date(source):
result.timex = f'{year:04d}'
result.future_value = [DateUtils.safe_create_from_value(
DateUtils.min_value, year, 1, 1), reference]
result.past_value = [DateUtils.safe_create_from_value(
DateUtils.min_value, year, 1, 1), reference]
result.success = True
return result
if self.config.is_month_to_date(source):
result.timex = f'{year:04d}-{month:02d}'
result.future_value = [DateUtils.safe_create_from_value(
DateUtils.min_value, year, month, 1), reference]
result.past_value = [DateUtils.safe_create_from_value(
DateUtils.min_value, year, month, month, 1), reference]
result.success = True
return result
future_year = past_year = year
trimmed_source = source.strip().lower()
match = RegExpUtility.exact_match(self.config.one_word_period_regex, trimmed_source, True)
if not (match and match.success):
match = RegExpUtility.exact_match(self.config.later_early_period_regex, trimmed_source, True)
# For cases "that week|month|year"
if not (match and match.success):
match = RegExpUtility.exact_match(self.config.reference_date_period_regex, trimmed_source, True)
if not (match and match.success):
return result
early_prefix = late_prefix = mid_prefix = False
if match.success:
if match.get_group(Constants.EARLY_PREFIX):
early_prefix = True
trimmed_source = match.group(Constants.SUFFIX_GROUP_NAME)
result.mod = TimeTypeConstants.EARLY_MOD
elif match.get_group(Constants.LATE_PREFIX):
late_prefix = True
trimmed_source = match.group(Constants.SUFFIX_GROUP_NAME)
result.mod = TimeTypeConstants.LATE_MOD
elif match.get_group(Constants.MID_PREFIX):
mid_prefix = True
trimmed_source = match.group(Constants.SUFFIX_GROUP_NAME)
result.mod = TimeTypeConstants.MID_MOD
swift = 0
month_str = match.get_group(Constants.MONTH_GROUP_NAME)
if month_str:
swift = self.config.get_swift_year(trimmed_source)
else:
swift = self.config.get_swift_day_or_month(trimmed_source)
if self.config.unspecific_end_of_range_regex is not None and self.config.unspecific_end_of_range_regex.match(
match.value):
late_prefix = True
trimmed_source = match.value
result.mod = TimeTypeConstants.LATE_MOD
if match.get_group(Constants.REL_EARLY):
early_prefix = True
if self.is_present(swift):
result.mod = None
elif match.get_group(Constants.REL_LATE):
late_prefix = True
if self.is_present(swift):
result.mod = None
month_str = match.get_group(Constants.MONTH_GROUP_NAME)
if month_str:
swift = self.config.get_swift_year(trimmed_source)
month = self.config.month_of_year.get(month_str)
if swift >= -1:
result.timex = f'{year + swift:04d}-{month:02d}'
year += swift
future_year = year
past_year = year
else:
result.timex = f'XXXX-{month:02d}'
if month < reference.month:
future_year += 1
if month >= reference.month:
past_year -= 1
else:
swift = self.config.get_swift_day_or_month(trimmed_source)
if self.config.is_week_only(trimmed_source):
thursday = DateUtils.this(reference, DayOfWeek.THURSDAY) + datedelta(days=7 * swift)
result.timex = f'{thursday.year:04d}-W{DateUtils.week_of_year(thursday):02d}'
begin_date = DateUtils.this(reference, DayOfWeek.MONDAY) + datedelta(days=7 * swift)
end_date = DateUtils.this(reference, DayOfWeek.SUNDAY) + datedelta(days=7 * swift)
if early_prefix:
end_date = DateUtils.this(
reference, DayOfWeek.WEDNESDAY) + datedelta(days=7 * swift)
elif mid_prefix:
begin_date = DateUtils.this(reference, DayOfWeek.TUESDAY) + datedelta(days=7 * swift)
end_date = DateUtils.this(reference, DayOfWeek.FRIDAY) + datedelta(days=7 * swift)
elif late_prefix:
begin_date = DateUtils.this(reference, DayOfWeek.THURSDAY) + datedelta(days=7 * swift)
if not self._inclusive_end_period:
end_date = end_date + datedelta(days=1)
if early_prefix and swift == 0:
if end_date > reference:
end_date = reference
elif late_prefix and swift == 0:
if begin_date < reference:
begin_date = reference
result.future_value = result.past_value = [begin_date, end_date]
result.success = True
return result
if self.config.is_weekend(trimmed_source):
begin_date = DateUtils.this(reference, DayOfWeek.SATURDAY) + datedelta(days=7 * swift)
end_date = DateUtils.this(reference, DayOfWeek.SUNDAY) + datedelta(days=7 * swift)
if not self._inclusive_end_period:
end_date = end_date + datedelta(days=1)
result.timex = f'{year:04d}-W{begin_date.isocalendar()[1]:02d}-WE'
result.future_value = result.past_value = [begin_date, end_date]
result.success = True
return result
if self.config.is_month_only(trimmed_source):
temp_date = reference + datedelta(months=swift)
month, year = temp_date.month, temp_date.year
result.timex = f'{year:04d}-{month:02d}'
future_year = past_year = year
elif self.config.is_year_only(trimmed_source):
temp_date = reference + datedelta(years=swift)
year = temp_date.year
if late_prefix:
begin_date = DateUtils.safe_create_from_min_value(year, 7, 1)
else:
begin_date = DateUtils.safe_create_from_min_value(year, 1, 1)
if early_prefix:
end_date = DateUtils.safe_create_from_min_value(year, 6, 30)
else:
end_date = DateUtils.safe_create_from_min_value(year, 12, 31)
if not self._inclusive_end_period:
end_date = end_date + datedelta(days=1)
result.timex = f'{year:04d}'
result.future_value = result.past_value = [begin_date, end_date]
result.success = True
return result
else:
return result
future_start = DateUtils.safe_create_from_min_value(future_year, month, 1)
future_end = DateUtils.safe_create_from_min_value(future_year, month, 1) + datedelta(months=1)
past_start = DateUtils.safe_create_from_min_value(past_year, month, 1)
past_end = DateUtils.safe_create_from_min_value(past_year, month, 1) + datedelta(months=1)
if self._inclusive_end_period:
future_end = future_end + datedelta(days=-1)
past_end = past_end + datedelta(days=-1)
if early_prefix:
future_end = DateUtils.safe_create_from_min_value(future_year, month, 15)
past_end = DateUtils.safe_create_from_min_value(past_year, month, 15)
if not self._inclusive_end_period:
future_end = future_end + datedelta(days=1)
past_end = past_end + datedelta(days=1)
elif late_prefix:
future_start = DateUtils.safe_create_from_min_value(future_year, month, 16)
past_start = DateUtils.safe_create_from_min_value(past_year, month, 16)
result.future_value = [future_start, future_end]
result.past_value = [past_start, past_end]
result.success = True
return result