/// <summary> /// Process images /// </summary> /// <param name="htmlDoc"></param> /// <param name="taggedImageList"></param> /// <param name="parentFolder"></param> /// <param name="componentTitle"></param> /// <param name="archive"></param> private static void ProcessImages(HtmlDocument htmlDoc, EmbeddedSchemaField taggedImageList, OrganizationalItem parentFolder, String componentTitle, ZipArchive archive) { EmbeddedSchemaFieldDefinition taggedImageField = (EmbeddedSchemaFieldDefinition)taggedImageList.Definition; Schema taggedImageSchema = taggedImageField.EmbeddedSchema; SchemaFields taggedImageSchemaFields = new SchemaFields(taggedImageSchema); MultimediaLinkFieldDefinition mmLinkFieldDef = (MultimediaLinkFieldDefinition)taggedImageSchemaFields.Fields.Where(field => field.Name.Equals("image")).First(); Schema imageSchema = mmLinkFieldDef.AllowedTargetSchemas[0]; Folder imageFolder = null; var taggedImageNames = new List <string>(); var foundImages = new Dictionary <string, Component>(); var imageFolderWebDavUrl = parentFolder.WebDavUrl + "/" + componentTitle + " Images"; foreach (var node in htmlDoc.DocumentNode.QuerySelectorAll("[data-image-name]")) { var imageUrl = node.Attributes["src"]; //Logger.Write("Processing image tag...", "CampaignZipImporter", LogCategory.Custom, System.Diagnostics.TraceEventType.Information); var taggedImageName = node.Attributes["data-image-name"]; if (imageUrl != null && taggedImageName != null && !taggedImageNames.Contains(taggedImageName.Value) && !IsEntryAlreadyDefined(taggedImageName.Value, taggedImageList)) { //Logger.Write("Adding image with name: " + taggedImageName.Value, "CampaignZipImporter", LogCategory.Custom, System.Diagnostics.TraceEventType.Information); if (imageUrl != null && !imageUrl.Value.StartsWith("http")) { if (imageFolder == null) { if (parentFolder.Session.IsExistingObject(imageFolderWebDavUrl)) { imageFolder = (Folder)parentFolder.Session.GetObject(imageFolderWebDavUrl); } else { // Create folder // imageFolder = new Folder(parentFolder.Session, parentFolder.Id); imageFolder.Title = componentTitle + " Images"; imageFolder.Save(); } } } // If an absolute image URL // else if (imageUrl != null && imageUrl.Value.StartsWith("http")) { var url = imageUrl.Value; string parameters = null; if (url.Contains("?")) { var parts = url.Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries); url = parts[0]; parameters = parts[1]; } var taggedImageXml = new StringBuilder(); taggedImageXml.Append("<TaggedImage xmlns:xlink=\"http://www.w3.org/1999/xlink\"><name>"); taggedImageXml.Append(taggedImageName.Value); taggedImageXml.Append("</name><imageUrl>"); taggedImageXml.Append(SecurityElement.Escape(url)); taggedImageXml.Append("</imageUrl>"); if (parameters != null) { taggedImageXml.Append("<parameters>"); taggedImageXml.Append(SecurityElement.Escape(parameters)); taggedImageXml.Append("</parameters>"); } taggedImageXml.Append("</TaggedImage>"); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(taggedImageXml.ToString()); ItemFields taggedImage = new ItemFields(xmlDoc.DocumentElement, taggedImageSchema); taggedImageList.Values.Add(taggedImage); taggedImageNames.Add(taggedImageName.Value); continue; } ZipArchiveEntry imageEntry = archive.GetEntry(imageUrl.Value); if (imageEntry != null) { Component imageComponent; if (foundImages.TryGetValue(imageUrl.Value, out imageComponent) == false) { var imageName = Path.GetFileName(imageUrl.Value); var imageWebDavUri = imageFolderWebDavUrl + "/" + imageName; if (parentFolder.Session.IsExistingObject(imageWebDavUri)) { imageComponent = (Component)parentFolder.Session.GetObject(imageWebDavUri); } else { imageComponent = new Component(parentFolder.Session, imageFolder.Id); var metadataXml = new XmlDocument(); metadataXml.LoadXml("<Metadata xmlns=\"" + imageSchema.NamespaceUri + "\"/>"); imageComponent.Schema = imageSchema; imageComponent.Metadata = metadataXml.DocumentElement; var extension = Path.GetExtension(imageUrl.Value); imageComponent.Title = imageName.Replace(extension, ""); // Set title without extension extension = extension.ToLower().Replace(".", ""); bool foundMMType = false; foreach (var mmType in imageSchema.AllowedMultimediaTypes) { if (mmType.FileExtensions.Contains(extension)) { imageComponent.BinaryContent.MultimediaType = mmType; foundMMType = true; break; } } if (!foundMMType) { Logger.Write("Could not find multimedia type for image extension: " + extension, "CampaignZipImporter", LogCategory.Custom, System.Diagnostics.TraceEventType.Error); } imageComponent.BinaryContent.UploadFromStream = imageEntry.Open(); imageComponent.BinaryContent.Filename = imageName; imageComponent.Save(true); } foundImages.Add(imageUrl.Value, imageComponent); } var taggedImageXml = new StringBuilder(); taggedImageXml.Append("<TaggedImage xmlns:xlink=\"http://www.w3.org/1999/xlink\"><name>"); taggedImageXml.Append(taggedImageName.Value); taggedImageXml.Append("</name><image xlink:type=\"simple\" xlink:href=\""); taggedImageXml.Append(imageComponent.Id); taggedImageXml.Append("\" xlink:title=\""); taggedImageXml.Append(imageComponent.Title); taggedImageXml.Append("\" /></TaggedImage>"); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(taggedImageXml.ToString()); ItemFields taggedImage = new ItemFields(xmlDoc.DocumentElement, taggedImageSchema); taggedImageList.Values.Add(taggedImage); taggedImageNames.Add(taggedImageName.Value); } } } }
/// <summary> /// Process images /// </summary> /// <param name="htmlDoc"></param> /// <param name="taggedImageList"></param> /// <param name="parentFolder"></param> /// <param name="componentTitle"></param> /// <param name="archive"></param> private static void ProcessImages(HtmlDocument htmlDoc, EmbeddedSchemaField taggedImageList, OrganizationalItem parentFolder, String componentTitle, ZipArchive archive) { EmbeddedSchemaFieldDefinition taggedImageField = (EmbeddedSchemaFieldDefinition)taggedImageList.Definition; Schema taggedImageSchema = taggedImageField.EmbeddedSchema; SchemaFields taggedImageSchemaFields = new SchemaFields(taggedImageSchema); MultimediaLinkFieldDefinition mmLinkFieldDef = (MultimediaLinkFieldDefinition)taggedImageSchemaFields.Fields[1]; Schema imageSchema = mmLinkFieldDef.AllowedTargetSchemas[0]; Folder imageFolder = null; var taggedImageNames = new List <string>(); var foundImages = new Dictionary <string, Component>(); foreach (var node in htmlDoc.DocumentNode.QuerySelectorAll("[data-image-name]")) { if (imageFolder == null) { imageFolder = new Folder(parentFolder.Session, parentFolder.Id); imageFolder.Title = componentTitle + " " + "Images"; imageFolder.Save(); } //Logger.Write("Processing image tag...", "CampaignZipImporter", LogCategory.Custom, System.Diagnostics.TraceEventType.Information); var imageUrl = node.Attributes["src"]; var taggedImageName = node.Attributes["data-image-name"]; if (imageUrl != null && taggedImageName != null && !taggedImageNames.Contains(taggedImageName.Value)) { ZipArchiveEntry imageEntry = archive.GetEntry(imageUrl.Value); if (imageEntry != null) { Component imageComponent; if (foundImages.TryGetValue(imageUrl.Value, out imageComponent) == false) { imageComponent = new Component(parentFolder.Session, imageFolder.Id); var imageName = Path.GetFileName(imageUrl.Value); var metadataXml = new XmlDocument(); metadataXml.LoadXml("<Metadata xmlns=\"" + imageSchema.NamespaceUri + "\"/>"); imageComponent.Schema = imageSchema; imageComponent.Metadata = metadataXml.DocumentElement; imageComponent.Title = imageName; var extension = Path.GetExtension(imageUrl.Value).ToLower(); bool foundMMType = false; foreach (var mmType in imageSchema.AllowedMultimediaTypes) { if (mmType.FileExtensions.Contains(extension)) { imageComponent.BinaryContent.MultimediaType = mmType; foundMMType = true; break; } } if (!foundMMType) { Logger.Write("Could not find multimedia type for image extension: " + extension, "CampaignZipImporter", LogCategory.Custom, System.Diagnostics.TraceEventType.Error); } imageComponent.BinaryContent.UploadFromStream = imageEntry.Open(); imageComponent.BinaryContent.Filename = imageName; imageComponent.Save(true); foundImages.Add(imageUrl.Value, imageComponent); } var taggedImageXml = new StringBuilder(); taggedImageXml.Append("<TaggedImage xmlns:xlink=\"http://www.w3.org/1999/xlink\"><name>"); taggedImageXml.Append(taggedImageName.Value); taggedImageXml.Append("</name><image xlink:type=\"simple\" xlink:href=\""); taggedImageXml.Append(imageComponent.Id); taggedImageXml.Append("\" xlink:title=\""); taggedImageXml.Append(imageComponent.Title); taggedImageXml.Append("\" /></TaggedImage>"); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(taggedImageXml.ToString()); ItemFields taggedImage = new ItemFields(xmlDoc.DocumentElement, taggedImageSchema); taggedImageList.Values.Add(taggedImage); taggedImageNames.Add(taggedImageName.Value); } } } }