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