Пример #1
0
        private void Export(NewsItemPage newsItemPage, string destinationPath, CancellationToken cancellationToken,
                            ConcurrentQueue <string> exportedPages, ConcurrentQueue <string> errors, Action <string> changeStatus)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            NewsItem eipaNewsFileData;

            try
            {
                eipaNewsFileData = NewsPageMapper.Map(newsItemPage);
            }
            catch (Exception e)
            {
                var message = $"Page with id '{newsItemPage.PageId}' can't be converted to Eipa file. Exception: {e}";
                Logger.LogError(e, message);
                errors.Enqueue(message);
                return;
            }

            if (EipaFileHelper.Put(GetFilePath(newsItemPage, destinationPath), eipaNewsFileData))
            {
                exportedPages.Enqueue($"{newsItemPage.PageId}");
            }
            else
            {
                errors.Enqueue($"Page with id '{newsItemPage.PageId}' wasn't exported correctly");
            }

            changeStatus.Invoke($"Exported '{exportedPages.Count}' news pages. Errors: {errors.Count}");
        }
Пример #2
0
        private ContentReference ImportExternalImage(HtmlNode imageNode, NewsItemPage newsPage)
        {
            var blobFactory        = ServiceLocator.Current.GetInstance <BlobFactory>();
            var contentAssetHelper = ServiceLocator.Current.GetInstance <ContentAssetHelper>();

            // get an existing content asset folder or create a new one
            var assetsFolder = contentAssetHelper.GetOrCreateAssetFolder(newsPage.ContentLink);

            // Get source url - add ericsson.com domain if relative url
            var nodeUrl = imageNode.Attributes["src"].Value;

            if (nodeUrl.StartsWith("/"))
            {
                nodeUrl = "http://www.ericsson.com" + nodeUrl;
            }

            // Image name
            var imageName = nodeUrl.Substring(nodeUrl.LastIndexOf('/') + 1);

            // Get a new empty file data
            var file = ContentRepository.GetDefault <ImageFile>(assetsFolder.ContentLink);

            file.Name = imageName;

            // Create a blob in the binary container
            var blob = blobFactory.CreateBlob(file.BinaryDataContainer, Path.GetExtension(imageName));

            // Create a webrequest to read the file and write to EPi blob
            WebRequest req = WebRequest.Create(nodeUrl);

            using (WebResponse resp = req.GetResponse())
            {
                using (Stream stream = resp.GetResponseStream())
                {
                    using (var s = blob.OpenWrite())
                    {
                        stream.CopyTo(s);
                        s.Flush();
                    }
                }
            }

            // Set file data
            file.BinaryData = blob;
            file.AltText    = imageNode.Attributes["alt"]?.Value;

            blob = null;

            // Save file to db
            var fileId = ContentRepository.Save(file, SaveAction.Publish);

            return(fileId);
        }
Пример #3
0
        public void Map(NewsItemPage newsItemPage, NewsItem item, DateTime publishDate)
        {
            newsItemPage.PageName    = item.Title;
            newsItemPage.ListHeading = item.LinkTitle;
            newsItemPage.Headline    = item.Title;
            newsItemPage.Preamble    = item.Introduction;

            if (item.MetaData.CreatedDateMilliseconds > 0)
            {
                newsItemPage.Created = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
                                       .AddMilliseconds(item.MetaData.CreatedDateMilliseconds);
            }

            if (item.MetaData.ModifiedDateMilliseconds > 0)
            {
                newsItemPage.Saved = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
                                     .AddMilliseconds(item.MetaData.ModifiedDateMilliseconds);
            }

            /* DATES */
            newsItemPage.StartPublish = publishDate;

            if (item.ClosingDate != DateTime.MinValue)
            {
                newsItemPage.StopPublish = item.ClosingDate;
            }
            /* END DATES */

            // Need to save before setting MainBody (ContentFolder needs to be created)
            ContentRepository.Save(newsItemPage, SaveAction.Save, AccessLevel.NoAccess);

            // Prepend domain to relative urls
            var mainBody = item.Text.Replace("href=\"/", "href=\"//www.ericsson.com/");

            // Download, upload, save media to page, and replace markup in MainBody
            newsItemPage.MainBody = new XhtmlString(GetMainBodyWithMediaAndLinks(mainBody, newsItemPage));

            /* Media items */
            foreach (var media in item.MediaItems)
            {
                var htmlDoc = new HtmlDocument();
                htmlDoc.LoadHtml(media.Html);

                /* Images */
                var imageNodes = htmlDoc.DocumentNode.Descendants().Where(n => n.Name.StartsWith("macro:image"));
                if (imageNodes.Any())
                {
                    newsItemPage.Image3 = ImportExternalImage(imageNodes.First(), newsItemPage);
                }

                /* Videos */
                var videoNodes = htmlDoc.DocumentNode.Descendants()
                                 .Where(n => n.Name.StartsWith("macro:video") || n.Name.StartsWith("macro:kaltura-video"));

                if (videoNodes.Any())
                {
                    var videoId = "not found";
                    if (videoNodes.First().Attributes["entry-id"] != null)
                    {
                        videoId = videoNodes.First().Attributes["entry-id"].Value;
                    }
                    else if (videoNodes.First().Attributes["video-path"] != null)
                    {
                        videoId = videoNodes.First().Attributes["video-path"].Value;
                    }

                    var missingText = "<h3 style=\"color: red;\">MISSING VIDEO. Id/path: " + videoId + "</h3>";

                    var currentMainBody = newsItemPage.MainBody != null?newsItemPage.MainBody.ToHtmlString() : string.Empty;

                    newsItemPage.MainBody = new XhtmlString(missingText + currentMainBody);
                }
            }

            newsItemPage.ImportedTagList = item.TagListString;

            newsItemPage.ImportedCategories = item.Categories != null && item.Categories.Count > 0
                ? string.Join(CategoriesSeparator, item.Categories.Select(s => s.Reference))
                : string.Empty;

            //newsItemPage.DirectLink = item.DirectLink;
            newsItemPage.ImportedReferences = EipaReferenceMapper.ReferencesToString(item.References);
            //newsItemPage.Targeting = item.Targeting;

            /* Meta data */
            if (item.MetaData != null)
            {
                newsItemPage.MetaTitle       = item.MetaData.Title;
                newsItemPage.MetaDescription = item.MetaData.Description;
                newsItemPage.MetaKeywords    = item.MetaData.KeyWordsString;
            }
            if (item.ShareOptions != null)
            {
                newsItemPage.ShareDescription = item.ShareOptions.Description;
            }
            //newsPage.ShareImage = item.ShareOptions.Image.Reference; // images urls from XML does not resolve

            // Publish page
            ContentRepository.Save(newsItemPage, SaveAction.Publish, AccessLevel.NoAccess);
        }
Пример #4
0
        private string GetMainBodyWithMediaAndLinks(string text, NewsItemPage newsPage)
        {
            // Return emtpy string if MainBody is empty
            if (string.IsNullOrEmpty(text))
            {
                return(string.Empty);
            }

            HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(text);

            /* LINKS */
            // Get all <macro:link> in the text
            var linkNodes = htmlDoc.DocumentNode.Descendants().Where(n => n.Name.StartsWith("macro:link"));

            foreach (HtmlNode node in linkNodes.ToList())
            {
                // Get source url - add ericsson.com domain if relative url
                var url = node.Attributes["ref"].Value;
                if (url.StartsWith("/"))
                {
                    url = "//www.ericsson.com" + url;
                }

                var link = HtmlNode.CreateNode(string.Format("<a href=\"{0}\">{1}</a>", url, node.Attributes["label"].Value));

                // Replace <macro:link> with proper link tag
                node.ParentNode.ReplaceChild(link, node);
            }

            /* IMAGES */
            var urlResolver = ServiceLocator.Current.GetInstance <UrlResolver>();
            var contentRepo = ServiceLocator.Current.GetInstance <IContentRepository>();

            var imageNodes = htmlDoc.DocumentNode.Descendants().Where(n => n.Name.StartsWith("macro:image"));

            foreach (HtmlNode node in imageNodes.ToList())
            {
                var fileId = ImportExternalImage(node, newsPage);

                var file    = contentRepo.Get <ImageFile>(fileId);
                var fileUrl = urlResolver.GetUrl(fileId);
                var image   = HtmlNode.CreateNode(string.Format("<img src=\"{0}\" alt=\"{1}\" class=\"imported-image\">", fileUrl, file.AltText));

                // Replace <macro:image> with proper img tag with reference to EPi file
                node.ParentNode.ReplaceChild(image, node);
            }

            /* Videos */
            var videoNodes = htmlDoc.DocumentNode.Descendants().Where(n => n.Name.StartsWith("macro:video") || n.Name.StartsWith("macro:kaltura-video"));

            foreach (HtmlNode node in videoNodes.ToList())
            {
                var videoId = "not found";
                if (videoNodes.First().Attributes["entry-id"] != null)
                {
                    videoId = videoNodes.First().Attributes["entry-id"].Value;
                }
                else if (videoNodes.First().Attributes["video-path"] != null)
                {
                    videoId = videoNodes.First().Attributes["video-path"].Value;
                }

                var missingVideoNode = HtmlNode.CreateNode("<h3 style=\"color: red;\">MISSING VIDEO. Id/path: " + videoId + "</h3>");

                node.ParentNode.ReplaceChild(missingVideoNode, node);
            }

            return(htmlDoc.DocumentNode.OuterHtml);
        }
Пример #5
0
        public NewsItem Map(NewsItemPage newsItemPage)
        {
            var newsItem = new NewsItem
            {
                Title        = newsItemPage.Headline,
                Introduction = newsItemPage.Preamble,
                LinkTitle    = newsItemPage.ListHeading,
                PublishDate  = newsItemPage.StartPublish,
                Translation  = new Translation
                {
                    LanguageId = newsItemPage.LanguageID
                }
            };

            /* DATES */

            if (newsItemPage.StopPublish != DateTime.MaxValue)
            {
                newsItem.ClosingDate = newsItemPage.StopPublish;
            }

            if (newsItemPage.MainBody != null)
            {
                newsItem.Text = newsItemPage.MainBody.ToString();//.Replace("href=\"/", "href=\"//www.ericsson.com/");
            }

            string imageUrl;

            if (TryGetImageUrl(newsItemPage.Image1, "image-wide-100", out imageUrl))
            {
                newsItem.Images = new Images
                {
                    AlternativeText = newsItemPage.AltText1,
                    DesktopImageUrl = imageUrl
                };
            }

            var unixStartTime   = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
            var createdTimeDiff = newsItemPage.Created - unixStartTime;
            var savedTimeDiff   = newsItemPage.Saved - unixStartTime;

            /* Meta data */
            newsItem.MetaData = new Meta
            {
                Title                    = newsItemPage.MetaTitle,
                Description              = newsItemPage.MetaDescription,
                KeyWordsString           = newsItemPage.MetaKeywords,
                CreatedDateMilliseconds  = createdTimeDiff.TotalMilliseconds,
                ModifiedDateMilliseconds = savedTimeDiff.TotalMilliseconds
            };

            newsItem.ShareOptions = new ShareOptions
            {
                Description = newsItemPage.ShareDescription
            };

            string shareImageUrl;

            if (TryGetImageUrl(newsItemPage.ShareImage, "image-normal-100", out shareImageUrl))
            {
                newsItem.ShareOptions.Image = new Link
                {
                    Reference = shareImageUrl
                };
            }

            newsItem.TagListString = newsItemPage.ImportedTagList;

            /* Categories */
            if (!string.IsNullOrWhiteSpace(newsItemPage.ImportedCategories))
            {
                var categoriesList = newsItemPage.ImportedCategories
                                     .Split(new[] { CategoriesSeparator }, StringSplitOptions.RemoveEmptyEntries)
                                     .ToList();

                if (categoriesList.Count > 0)
                {
                    newsItem.Categories = new List <Link>();
                    foreach (var category in categoriesList)
                    {
                        newsItem.Categories.Add(new Link
                        {
                            Reference = category
                        });
                    }
                }
            }

            newsItem.References = EipaReferenceMapper.ReferencesFromString(newsItemPage.ImportedReferences);

            return(newsItem);
        }
Пример #6
0
        private string GetFilePath(NewsItemPage newsItemPage, string destinationPath)
        {
            var date = $"{newsItemPage.StartPublish.ToString("yy")}{newsItemPage.StartPublish.ToString("MM")}{newsItemPage.StartPublish.ToString("dd")}";

            return($"{destinationPath}/{newsItemPage.PageId}-{date}-{newsItemPage.URLSegment}.{newsItemPage.LanguageID}.eipa");
        }