public override void Parse(ItemParseContext context, ITextNode textNode) { SchemaService.ValidateTextNodeSchema(textNode, "Item"); var itemNameTextNode = GetItemNameTextNode(context.ParseContext, textNode); var parentItemPath = textNode.GetAttributeValue("ParentItemPath", context.ParentItemPath); var itemIdOrPath = textNode.GetAttributeValue("ItemPath"); if (string.IsNullOrEmpty(itemIdOrPath)) { itemIdOrPath = PathHelper.CombineItemPath(parentItemPath, itemNameTextNode.Value); } else if (itemNameTextNode.Value != Path.GetFileName(itemIdOrPath)) { Trace.TraceError(Msg.P1027, "Item name in 'ItemPath' and 'Name' does not match. Using 'Name'"); } var guid = StringHelper.GetGuid(context.ParseContext.Project, textNode.GetAttributeValue("Id", itemIdOrPath)); var databaseName = textNode.GetAttributeValue("Database", context.Database.DatabaseName); var database = context.ParseContext.Project.GetDatabase(databaseName); var templateIdOrPath = textNode.GetAttributeValue("TemplateName", textNode.Key.UnescapeXmlElementName()); var item = Factory.Item(database, guid, itemNameTextNode.Value, itemIdOrPath, templateIdOrPath).With(textNode); item.ItemNameProperty.AddSourceTextNode(itemNameTextNode); item.TemplateIdOrPathProperty.AddSourceTextNode(new AttributeNameTextNode(textNode)); item.SortorderProperty.Parse(textNode, context.Sortorder); item.IsEmittable = textNode.GetAttributeBool(Constants.Fields.IsEmittable, true); item.IsImport = textNode.GetAttributeBool(Constants.Fields.IsImport, context.IsImport); if (!item.IsImport) { item.References.AddRange(ReferenceParser.ParseReferences(item, item.TemplateIdOrPathProperty)); } // parse shared fields var fieldContext = new LanguageVersionContext(); ParseAttributes(context, item, fieldContext, textNode); // parse Fields, Layout and Items child text nodes ParseChildNodes(context, item, textNode); context.ParseContext.Project.AddOrMerge(item); }
public override void Parse(ItemParseContext context, ITextNode textNode) { SchemaService.ValidateTextNodeSchema(textNode, "Template"); var itemNameTextNode = GetItemNameTextNode(context.ParseContext, textNode); var parentItemPath = textNode.GetAttributeValue("ParentItemPath", context.ParentItemPath); var itemIdOrPath = textNode.GetAttributeValue("ItemPath"); if (string.IsNullOrEmpty(itemIdOrPath)) { itemIdOrPath = PathHelper.CombineItemPath(parentItemPath, itemNameTextNode.Value); } else if (itemNameTextNode.Value != Path.GetFileName(itemIdOrPath)) { Trace.TraceError(Msg.P1034, "Item name in 'ItemPath' and 'Name' does not match. Using 'Name'"); } var guid = StringHelper.GetGuid(context.ParseContext.Project, textNode.GetAttributeValue("Id", itemIdOrPath)); var databaseName = textNode.GetAttributeValue("Database", context.Database.DatabaseName); var database = context.ParseContext.Project.GetDatabase(databaseName); var template = Factory.Template(database, guid, itemNameTextNode.Value, itemIdOrPath); template.ItemNameProperty.AddSourceTextNode(itemNameTextNode); template.BaseTemplatesProperty.Parse(textNode, Constants.Templates.StandardTemplateId); template.IconProperty.Parse(textNode); template.ShortHelpProperty.Parse(textNode); template.LongHelpProperty.Parse(textNode); template.IsEmittable = textNode.GetAttributeBool(Constants.Fields.IsEmittable, true); template.IsImport = textNode.GetAttributeBool(Constants.Fields.IsImport, context.IsImport); template.References.AddRange(ReferenceParser.ParseReferences(template, template.BaseTemplatesProperty)); Item standardValuesItem; var standardValuesTextNode = textNode.ChildNodes.FirstOrDefault(n => string.Equals(n.Value, "__Standard Values", StringComparison.OrdinalIgnoreCase)); if (standardValuesTextNode != null) { var newContext = Factory.ItemParseContext(context.ParseContext, context.Parser, template.Database, template.ItemIdOrPath, template.IsImport); context.Parser.ParseTextNode(newContext, standardValuesTextNode); standardValuesItem = template.Database.GetItem(template.ItemIdOrPath + "/__Standard Values"); if (standardValuesItem == null) { Trace.TraceError(Msg.C1137, "'__Standard Values' item not parsed correctly", standardValuesTextNode); } } else { // create standard values item var standardValuesItemIdOrPath = itemIdOrPath + "/__Standard Values"; var standardValuesGuid = StringHelper.GetGuid(context.ParseContext.Project, standardValuesItemIdOrPath); standardValuesItem = Factory.Item(database, standardValuesGuid, "__Standard Values", standardValuesItemIdOrPath, itemIdOrPath).With(textNode); context.ParseContext.Project.AddOrMerge(standardValuesItem); } if (standardValuesItem != null) { // todo: should be Uri template.StandardValuesItem = standardValuesItem; standardValuesItem.IsImport = template.IsImport; } // parse fields and sections foreach (var sectionTreeNode in textNode.ChildNodes) { ParseSection(context, template, sectionTreeNode); } Pipelines.GetPipeline <TemplateParserPipeline>().Execute(context, template, textNode); context.ParseContext.Project.AddOrMerge(template); }