Ejemplo n.º 1
0
        private ExtractionValue _getNodeValue(NodeBase nodeBase, string sourceText)
        {
            if (nodeBase.Type == NodeType.Leaf)
            {
                return(new ExtractionValue(nodeBase.As <Leaf>().Token.Text, ValueType.String, nodeBase.SemanticId));
            }

            var subNode = nodeBase.As <Node>();

            if (subNode.IsPossibleList)
            {
                var list = new List <ExtractionValue>();
                foreach (var childBase in subNode.Children)
                {
                    var value = _getNodeValue(childBase, sourceText);
                    if (value.Type == ValueType.List)
                    {
                        list.AddRange(value.GetValue <List <ExtractionValue> >());
                    }
                    else
                    {
                        list.Add(value);
                    }
                }
                return(new ExtractionValue(list, ValueType.List, nodeBase.SemanticId));
            }

            // Если есть шаблон, то извлекаем словарь по шаблону
            // иначе возвращаем текст данной ветки
            if (subNode.Rule.HasTemplate)
            {
                var dic = _extract(subNode, sourceText);

                // Если есть в словаре есть только одно значение и оно с ключем Value, то возвращаем его
                if (dic.Count == 1 && dic.ContainsKey("Value"))
                {
                    return(dic["Value"]);
                }

                return(new ExtractionValue(dic, ValueType.Dictionary, nodeBase.SemanticId));
            }

            var text = _getNodeText(subNode, sourceText, out int _);

            return(new ExtractionValue(text, ValueType.String, nodeBase.SemanticId));
        }