/// <summary>
 /// Exit a parse tree produced by the <c>structuredBody</c>
 /// labeled alternative in <see cref="LGTemplateParser.body"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitStructuredBody([NotNull] LGTemplateParser.StructuredBodyContext context)
 {
 }
Exemplo n.º 2
0
        public override List <object> VisitStructuredBody([NotNull] LGTemplateParser.StructuredBodyContext context)
        {
            var templateRefValues = new Dictionary <string, List <object> >();
            var stb      = context.structuredTemplateBody();
            var result   = new JObject();
            var typeName = stb.structuredBodyNameLine().STRUCTURE_NAME().GetText();

            result[Evaluator.LGType] = typeName;
            var expandedResult = new List <JObject>
            {
                result
            };
            var bodys = stb.structuredBodyContentLine();

            foreach (var body in bodys)
            {
                var isKVPairBody = body.keyValueStructureLine() != null;
                if (isKVPairBody)
                {
                    var property = body.keyValueStructureLine().STRUCTURE_IDENTIFIER().GetText().ToLower();
                    var value    = VisitStructureValue(body.keyValueStructureLine());
                    if (value.Count > 1)
                    {
                        var valueList = new JArray();
                        foreach (var item in value)
                        {
                            var id = Guid.NewGuid().ToString();
                            valueList.Add(id);
                            templateRefValues.Add(id, item);
                        }

                        expandedResult.ForEach(x => x[property] = valueList);
                    }
                    else
                    {
                        var id = Guid.NewGuid().ToString();
                        expandedResult.ForEach(x => x[property] = id);
                        templateRefValues.Add(id, value[0]);
                    }
                }
                else
                {
                    var propertyObjects = EvalExpression(body.objectStructureLine().GetText(), body.objectStructureLine()).Select(x => JObject.Parse(x)).ToList();
                    var tempResult      = new List <JObject>();
                    foreach (var res in expandedResult)
                    {
                        foreach (var propertyObject in propertyObjects)
                        {
                            var tempRes = JObject.FromObject(res);

                            // Full reference to another structured template is limited to the structured template with same type
                            if (propertyObject[Evaluator.LGType] != null && propertyObject[Evaluator.LGType].ToString() == typeName)
                            {
                                foreach (var item in propertyObject)
                                {
                                    if (tempRes.Property(item.Key) == null)
                                    {
                                        tempRes[item.Key] = item.Value;
                                    }
                                }
                            }

                            tempResult.Add(tempRes);
                        }
                    }

                    expandedResult = tempResult;
                }
            }

            var exps = expandedResult;

            var finalResult = new List <object>(exps);

            foreach (var templateRefValue in templateRefValues)
            {
                var tempRes = new List <object>();
                foreach (var res in finalResult)
                {
                    foreach (var refValue in templateRefValue.Value)
                    {
                        tempRes.Add(res.ToString().Replace(templateRefValue.Key, refValue.ToString().Replace("\"", "\\\"")));
                    }
                }

                finalResult = tempRes;
            }

            return(finalResult);
        }
 /// <summary>
 /// Visit a parse tree produced by the <c>structuredBody</c>
 /// labeled alternative in <see cref="LGTemplateParser.body"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitStructuredBody([NotNull] LGTemplateParser.StructuredBodyContext context)
 {
     return(VisitChildren(context));
 }