コード例 #1
0
        public static ModAndDateResult GetModAndDate(DateObject beginDate, DateObject endDate, DateObject referenceDate, string timex, bool future)
        {
            DateObject        beginDateResult  = beginDate;
            DateObject        endDateResult    = endDate;
            var               isBusinessDay    = timex.EndsWith(Constants.TimexBusinessDay, StringComparison.Ordinal);
            var               businessDayCount = 0;
            List <DateObject> dateList         = null;

            if (isBusinessDay)
            {
                businessDayCount = int.Parse(timex.Substring(1, timex.Length - 3), CultureInfo.InvariantCulture);
            }

            if (future)
            {
                string mod = Constants.AFTER_MOD;

                // For future the beginDate should add 1 first
                if (isBusinessDay)
                {
                    beginDateResult = DurationParsingUtil.GetNextBusinessDay(referenceDate);
                    endDateResult   = DurationParsingUtil.GetNthBusinessDay(beginDateResult, businessDayCount - 1, true, out dateList);
                    endDateResult   = endDateResult.AddDays(1);
                    return(new ModAndDateResult(beginDateResult, endDateResult, mod, dateList));
                }
                else
                {
                    beginDateResult = referenceDate.AddDays(1);
                    endDateResult   = DurationParsingUtil.ShiftDateTime(timex, beginDateResult, true);
                    return(new ModAndDateResult(beginDateResult, endDateResult, mod, null));
                }
            }
            else
            {
                const string mod = Constants.BEFORE_MOD;

                if (isBusinessDay)
                {
                    endDateResult   = DurationParsingUtil.GetNextBusinessDay(endDateResult, false);
                    beginDateResult = DurationParsingUtil.GetNthBusinessDay(endDateResult, businessDayCount - 1, false, out dateList);
                    endDateResult   = endDateResult.AddDays(1);
                    return(new ModAndDateResult(beginDateResult, endDateResult, mod, dateList));
                }
                else
                {
                    beginDateResult = DurationParsingUtil.ShiftDateTime(timex, endDateResult, false);
                    return(new ModAndDateResult(beginDateResult, endDateResult, mod, null));
                }
            }
        }
        private List <ExtractResult> MergeMultipleDuration(string text, List <ExtractResult> extractorResults)
        {
            if (extractorResults.Count <= 1)
            {
                return(extractorResults);
            }

            var unitMap              = UnitMap;
            var unitValueMap         = UnitValueMap;
            var unitRegex            = DurationUnitRegex;
            List <ExtractResult> ret = new List <ExtractResult>();

            var firstExtractionIndex = 0;
            var timeUnit             = 0;
            var totalUnit            = 0;

            while (firstExtractionIndex < extractorResults.Count)
            {
                string curUnit   = null;
                var    unitMatch = unitRegex.Match(extractorResults[firstExtractionIndex].Text);

                if (unitMatch.Success && unitMap.ContainsKey(unitMatch.Groups["unit"].ToString()))
                {
                    curUnit = unitMatch.Groups["unit"].ToString();
                    totalUnit++;
                    if (DurationParsingUtil.IsTimeDurationUnit(unitMap[curUnit]))
                    {
                        timeUnit++;
                    }
                }

                if (string.IsNullOrEmpty(curUnit))
                {
                    firstExtractionIndex++;
                    continue;
                }

                var secondExtractionIndex = firstExtractionIndex + 1;
                while (secondExtractionIndex < extractorResults.Count)
                {
                    var valid       = false;
                    var midStrBegin = extractorResults[secondExtractionIndex - 1].Start + extractorResults[secondExtractionIndex - 1].Length ?? 0;
                    var midStrEnd   = extractorResults[secondExtractionIndex].Start ?? 0;
                    if (midStrBegin > midStrEnd)
                    {
                        return(extractorResults);
                    }

                    var midStr = text.Substring(midStrBegin, midStrEnd - midStrBegin);
                    var match  = DurationConnectorRegex.Match(midStr);
                    if (match.Success)
                    {
                        unitMatch = unitRegex.Match(extractorResults[secondExtractionIndex].Text);
                        if (unitMatch.Success && unitMap.ContainsKey(unitMatch.Groups["unit"].ToString()))
                        {
                            var nextUnitStr = unitMatch.Groups["unit"].ToString();
                            if (unitValueMap[UnitMap[nextUnitStr]] != unitValueMap[UnitMap[curUnit]])
                            {
                                valid = true;
                                if (unitValueMap[UnitMap[nextUnitStr]] < unitValueMap[UnitMap[curUnit]])
                                {
                                    curUnit = nextUnitStr;
                                }
                            }

                            totalUnit++;
                            if (DurationParsingUtil.IsTimeDurationUnit(unitMap[nextUnitStr]))
                            {
                                timeUnit++;
                            }
                        }
                    }

                    if (!valid)
                    {
                        break;
                    }

                    secondExtractionIndex++;
                }

                if (secondExtractionIndex - 1 > firstExtractionIndex)
                {
                    var node = new ExtractResult();
                    node.Start  = extractorResults[firstExtractionIndex].Start;
                    node.Length = extractorResults[secondExtractionIndex - 1].Start + extractorResults[secondExtractionIndex - 1].Length - node.Start;
                    node.Text   = text.Substring(node.Start ?? 0, node.Length ?? 0);
                    node.Type   = extractorResults[firstExtractionIndex].Type;

                    // Add multiple duration type to extract result
                    string type = Constants.MultipleDuration_DateTime; // Default type
                    if (timeUnit == totalUnit)
                    {
                        type = Constants.MultipleDuration_Time;
                    }
                    else if (timeUnit == 0)
                    {
                        type = Constants.MultipleDuration_Date;
                    }

                    node.Data = type;

                    ret.Add(node);

                    timeUnit  = 0;
                    totalUnit = 0;
                }
                else
                {
                    ret.Add(extractorResults[firstExtractionIndex]);
                }

                firstExtractionIndex = secondExtractionIndex;
            }

            return(ret);
        }