protected virtual IEnumerable <XmlRenderGroup> ReadRenderGroup(ComponentDescription description, XElement renderElement, XmlRenderGroup parentGroup) { IConditionTreeItem conditionCollection = ConditionTree.Empty; var conditionsAttribute = renderElement.Attribute("conditions"); if (conditionsAttribute != null) { if (!conditionParser.Parse(conditionsAttribute, description, logger, out conditionCollection)) { yield break; } } var renderGroup = new XmlRenderGroup(new ConditionTree(ConditionTree.ConditionOperator.AND, parentGroup.Conditions, conditionCollection)) { AutoRotate = parentGroup.AutoRotate, AutoRotateFlip = parentGroup.AutoRotateFlip, }; autoRotateOptionsReader.TrySetAutoRotateOptions(renderElement, renderGroup); var childGroups = renderElement.Elements().SelectMany(x => ReadElement(x, description, renderGroup)); yield return(renderGroup); foreach (var child in childGroups) { yield return(child); } }
public virtual void ReadSection(XElement element, ComponentDescription description) { var groups = new List <XmlRenderGroup>(); var defaultGroup = new XmlRenderGroup(ConditionTree.Empty); if (description.Metadata.FormatVersion >= Version1_5) { autoRotateOptionsReader.TrySetAutoRotateOptions(element, defaultGroup); } groups.Add(defaultGroup); foreach (var child in element.Elements()) { groups.AddRange(ReadElement(child, description, defaultGroup)); } var flatGroups = groups.SelectMany(x => x.FlattenRoot(logger)).ToArray(); description.RenderDescriptions = flatGroups.GroupBy(x => ConditionsReducer.SimplifyConditions(x.Conditions)).Select(g => new RenderDescription(g.Key, g.SelectMany(x => x.Value).ToArray())).ToArray(); }
public virtual IEnumerable <XmlRenderGroup> ReadElement(XElement element, ComponentDescription description, XmlRenderGroup groupContext) { if (element.Name == GroupElementName || (description.Metadata.FormatVersion >= Version1_5 && element.Name == GElementName)) { return(ReadRenderGroup(description, element, groupContext)); } else if (renderCommandReaders.TryGetValue($"{XmlLoader.ComponentNamespace.NamespaceName}:{element.Name.LocalName}", out var renderCommandReader)) { if (renderCommandReader.ReadRenderCommand(element, description, out var command)) { groupContext.Value.Add(command); } return(Enumerable.Empty <XmlRenderGroup>()); } else if (element.Name == LineElementName) { if (ReadLineCommand(element, out var line)) { groupContext.Value.Add(line); } return(Enumerable.Empty <XmlRenderGroup>()); } else if (element.Name == RectElementName) { if (ReadRectCommand(element, out var rect)) { groupContext.Value.Add(rect); } return(Enumerable.Empty <XmlRenderGroup>()); } else if (element.Name == EllipseElementName) { if (ReadEllipseCommand(description.Metadata.FormatVersion, element, out var ellipse)) { groupContext.Value.Add(ellipse); } return(Enumerable.Empty <XmlRenderGroup>()); } else if (element.Name == PathElementName) { if (ReadPathCommand(element, out var path)) { groupContext.Value.Add(path); } return(Enumerable.Empty <XmlRenderGroup>()); } else if (element.HasElements) { if (element.Name.Namespace == XmlLoader.ComponentNamespace) { logger.LogWarning(element, $"Descending unknown render element '{element.Name.LocalName}'"); } return(element.Elements().SelectMany(x => ReadElement(x, description, groupContext))); } else { if (element.Name.Namespace == XmlLoader.ComponentNamespace) { logger.LogWarning(element, $"Unknown render element '{element.Name.LocalName}'"); } return(Enumerable.Empty <XmlRenderGroup>()); } }