コード例 #1
0
        private Grammar LoadExternalGramar(string value)
        {
            //przycięcie db#
            value = value.Substring(3, value.Length - 3);
            string[] options = null;
            using (var repo = new GramarRepository())
            {
                switch (value)
                {
                case "brands":
                    options = repo.GetBrandOptions();
                    break;

                case "name":
                    options = repo.GetNameOptions();
                    break;

                case "surname":
                    options = repo.GetSurnameOptions();
                    break;

                default:
                    break;
                }
            }
            var sb = new StringBuilder("<grammar root=\"top\"><rule id=\"top\">");

            sb.AppendLine("<ruleref special=\"GARBAGE\" />");
            sb.AppendLine("<one-of>");
            foreach (var option in options)
            {
                sb.AppendLine("<item>" + option + "</item>");
            }
            sb.AppendLine("</one-of>");
            sb.AppendLine("<ruleref special=\"GARBAGE\" />");
            sb.AppendLine("</rule></grammar>");
            var xml     = sb.ToString();
            var ok      = GrammarValidator.ValidateAndFixGrammar(ref xml);
            var grammar = new Grammar
            {
                Rules = new[] { new Rule {
                                    Items = new[] { new OneOfRule {
                                                        Items = options.Select(s => new RuleItem {
                                    Content = s
                                }).ToArray()
                                                    } }
                                } },
                XMLGrammar = xml,
            };

            return(grammar);
        }
コード例 #2
0
        private Grammar ParseGrammar(XElement grammarElement, FieldGrammarType?type)
        {
            if (type.HasValue)
            {
                return(type.Value.LoadGrammar());
            }

            var src = grammarElement.GetAttributeByName("src");

            if (src != null && src.Value.StartsWith("db"))
            {
                return(LoadExternalGramar(src.Value));
            }

            var grammarXml = grammarElement.ToString();
            var isValid    = GrammarValidator.ValidateAndFixGrammar(ref grammarXml);

            if (!isValid)
            {
                throw new ArgumentException("Grammar is invalid - " + grammarElement.ToString());
            }
            var rules   = grammarElement.GetElementsByName("rule").ToArray();
            var grammar = new Grammar {
                Rules = new Rule[rules.Length], XMLGrammar = grammarXml
            };

            for (int i = 0; i < rules.Length; i++)
            {
                var ruleItems = rules[i].Elements().ToArray();
                var r         = new Rule
                {
                    Id    = rules[i].GetAttributeByName("id")?.Value,
                    Items = new RuleItem[ruleItems.Length],
                };
                for (int j = 0; j < ruleItems.Length; j++)
                {
                    if (ruleItems[j].IsNamed("one-of"))
                    {
                        r.Items[j] = ParseOneOfGrammar(ruleItems[j]);
                    }
                    else if (ruleItems[j].IsNamed("item"))
                    {
                        r.Items[j] = new RuleItem {
                            Content = ruleItems[j].Value.Trim()
                        };
                    }
                }
                grammar.Rules[i] = r;
            }
            return(grammar);
        }