예제 #1
0
        protected override IEnumerable <ParseResult> ParseImpl(ParseInput input, ParseMode mode, IList <Type> facetTypes)
        {
            var builder = new DateTimeBuilder();

            ParseInputTerm termMin     = null;
            ParseInputTerm termMax     = null;
            ParseInputTerm termCurrent = null;

            Func <bool> updateTermIndexes =
                () =>
            {
                if (termMin == null)
                {
                    termMin = termCurrent;
                }

                if (termMax != null && termMax != termCurrent && termMax.Ordinal != termCurrent.Ordinal - 1)
                {
                    return(false);
                }

                termMax = termCurrent;

                return(true);
            };

            Func <Group, Action <string>, bool> parseGroup =
                (grp, parse) =>
            {
                if (grp.Success)
                {
                    if (!updateTermIndexes())
                    {
                        return(false);
                    }

                    parse(grp.Value);
                }

                return(true);
            };

            var gotAmPm = false;

            foreach (var t in input.Terms)
            {
                termCurrent = t;

                foreach (var match in
                         from r in s_regexes
                         let m = r.Match(termCurrent.Text)
                                 where m.Success
                                 select m)
                {
                    if (!builder.Hour.HasValue && !parseGroup(match.Groups["hour"], val => builder.Hour = int.Parse(val)))
                    {
                        break;
                    }

                    if (!builder.Minute.HasValue && !parseGroup(match.Groups["minute"], val => builder.Minute = int.Parse(val)))
                    {
                        break;
                    }

                    if (!gotAmPm && !parseGroup(match.Groups["ampm"],
                                                val =>
                    {
                        gotAmPm = true;
                        builder.Hour += char.ToLower(val[0]) == 'p' ? 12 : 0;
                    }))
                    {
                        break;
                    }

                    //var hourminute = match.Groups["hourminute"];

                    //if (hourminute.Success)
                    //{}

                    if (!parseGroup(match.Groups["relativeday"],
                                    val =>
                    {
                        switch (val)
                        {
                        case "yesterday":
                            builder.SetDayFrom(DateTime.Today.AddDays(-1));
                            break;

                        case "today":
                            builder.SetDayFrom(DateTime.Today);
                            break;

                        case "tomorrow":
                            builder.SetDayFrom(DateTime.Today.AddDays(1));
                            break;
                        }
                    }))
                    {
                        break;
                    }
                }
            }

            if (builder.Type != 0)
            {
                var moniker = new FacetMoniker(GetType(), typeof(DateTimeFacet), builder.ToXml(),
                                               builder.ToString(), extraData: FacetExtraData.BeginWith(typeof(IDateTimeFacet), "Type", builder.Type.ToString()), iconPath: null);
                var parseResult = new ParseResult(input, input.GetTermsRange(termMin, termMax), moniker, 1.0);

                return(new[] { parseResult });
            }

            return(null);
        }
예제 #2
0
 public static bool IsFactorySourceValid(this ParseInputTerm term, LoaderFacetFactory f)
 {
     return(term.Mode != TermParseMode.SpecificFactory ||
            (term.Mode == TermParseMode.SpecificFactory &&
             f.Aliases.Contains(term.FactoryAlias, StringComparer.CurrentCultureIgnoreCase)));
 }