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); }
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); }