public IEnumerable <ITimePeriod> GetTimePeriodsFromText(string text, TemporalParserOptions options) { var components = GetComponentsFromText(text); var groupedComponents = TemporalComponent.GroupComponents(components); var result = new List <ITimePeriod>(); foreach (var componentGroup in groupedComponents) { var tmpTimePeriod = GetTimePeriodFromComponents(componentGroup, options); if (tmpTimePeriod != null) { result.Add(tmpTimePeriod); } } return(result); }
private ITimePeriod GetTimePeriodFromComponents(IEnumerable <TemporalComponent> components, TemporalParserOptions options) { //TODO: Overhaul this so it actually is smart! It currently can't: // - Match all component types together // - Handle variations of types (eg. open-ended date with open-ended time) var processedComponents = components.Select(c => new ProcessedComponent { Component = c, TimePeriod = c.GetTimePeriod(options.BaseDate) }).Where(c => c.TimePeriod != null).ToList(); if (processedComponents.Count() == 0) { return(null); } else if (processedComponents.Count() == 1) { return(processedComponents.FirstOrDefault().TimePeriod); } var dateComponents = processedComponents.Where(c => c.Component is DateComponent); var timeComponents = processedComponents.Where(c => c.Component is TimeComponent); var sequenceComponents = processedComponents.Where(c => c.Component is SequenceComponent); var fuzzyComponents = processedComponents.Where(c => c.Component is FuzzyComponent); //var durationComponents = processedComponents.Where(c => c.Component is DurationComponent); //var relativeComponents = processedComponents.Where(c => c.Component is RelativeDateTimeComponent); if (components.Any(c => c is SequenceComponent)) { var dateComponent = dateComponents.FirstOrDefault(); var timeComponent = timeComponents.FirstOrDefault(); var sequenceComponent = sequenceComponents.FirstOrDefault(); if (sequenceComponent != null) { return(TransformSequenceDateTime( sequenceComponent, dateComponent, timeComponent )); } } else if (components.Count() == 2 && components.Any(c => c is DateComponent) && components.Any(c => c is TimeComponent)) { var dateComponent = dateComponents.FirstOrDefault(); var timeComponent = timeComponents.FirstOrDefault(); if (dateComponent != null && timeComponent != null) { return(TransformDateTimeComponents(dateComponent.TimePeriod, timeComponent.TimePeriod)); } } else if (components.Count() == 2 && components.Any(c => c is FuzzyComponent) && components.Any(c => c is TimeComponent)) { var fuzzyComponent = fuzzyComponents.FirstOrDefault(); var timeComponent = timeComponents.FirstOrDefault(); if (fuzzyComponent != null && timeComponent != null) { return(TransformDateTimeComponents(fuzzyComponent.TimePeriod, timeComponent.TimePeriod)); } } return(null); }