Exemple #1
0
        /// <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);
                    }
                }
            }
        }