public Element ParseNode(JToken node, Container parent, int index, DescribeElementsContext describeContext) { var elementTypeName = (string)node["typeName"]; if (String.IsNullOrWhiteSpace(elementTypeName)) { return(null); } var data = (string)node["data"]; var htmlId = (string)node["htmlId"]; var htmlClass = (string)node["htmlClass"]; var htmlStyle = (string)node["htmlStyle"]; var rule = (string)node["rule"]; var elementData = ElementDataHelper.Deserialize(data); var exportableData = ElementDataHelper.Deserialize((string)node["exportableData"]); var childNodes = node["elements"]; var elementDescriptor = _elementManager.GetElementDescriptorByTypeName(describeContext, elementTypeName); if (elementDescriptor == null) { return(null); // This happens if an element exists in a layout, but its type is no longer available due to its feature being disabled. } var element = _elementFactory.Activate(elementDescriptor, e => { e.Container = parent; e.Index = index; e.Data = elementData; e.ExportableData = exportableData; e.HtmlId = htmlId; e.HtmlClass = htmlClass; e.HtmlStyle = htmlStyle; e.Rule = rule; }); var container = element as Container; if (container != null) { container.Elements = childNodes != null ? childNodes.Select((x, i) => ParseNode(x, container, i, describeContext)).Where(x => x != null).ToList() : new List <Element>(); } element.IsTemplated = node.Value <bool>("isTemplated"); return(element); }
public Element ActivateElement(ElementDescriptor descriptor, Action <Element> initialize = null) { return(_factory.Activate(descriptor, initialize)); }