/// <summary>
        /// Builds the header for the modern page
        /// </summary>
        /// <param name="targetPage">Modern page instance</param>
        public void TransformHeader(ref ClientSidePage targetPage)
        {
            // Get the mapping model to use as it describes how the page header needs to be generated
            var publishingPageTransformationModel = new PageLayoutManager(this.RegisteredLogObservers).GetPageLayoutMappingModel(this.publishingPageTransformation, publishingPageTransformationInformation.SourcePage);

            // Configure the page header
            if (publishingPageTransformationModel.PageHeader == PageLayoutPageHeader.None)
            {
                targetPage.RemovePageHeader();
            }
            else if (publishingPageTransformationModel.PageHeader == PageLayoutPageHeader.Default)
            {
                targetPage.SetDefaultPageHeader();
            }
            else
            {
                // Custom page header

                // ImageServerRelativeUrl
                string      imageServerRelativeUrl      = "";
                HeaderField imageServerRelativeUrlField = GetHeaderField(publishingPageTransformationModel, HeaderFieldHeaderProperty.ImageServerRelativeUrl);

                if (imageServerRelativeUrlField != null)
                {
                    imageServerRelativeUrl = GetFieldValue(imageServerRelativeUrlField);
                }

                bool headerCreated = false;
                // Did we get a header image url?
                if (!string.IsNullOrEmpty(imageServerRelativeUrl))
                {
                    string newHeaderImageServerRelativeUrl = "";
                    try
                    {
                        // Integrate asset transformator
                        AssetTransfer assetTransfer = new AssetTransfer(this.sourceClientContext, this.targetClientContext, base.RegisteredLogObservers);
                        newHeaderImageServerRelativeUrl = assetTransfer.TransferAsset(imageServerRelativeUrl, System.IO.Path.GetFileNameWithoutExtension(publishingPageTransformationInformation.SourcePage[Constants.FileLeafRefField].ToString()));
                    }
                    catch (Exception ex)
                    {
                        LogError(LogStrings.Error_HeaderImageAssetTransferFailed, LogStrings.Heading_PublishingPageHeader, ex);
                    }

                    if (!string.IsNullOrEmpty(newHeaderImageServerRelativeUrl))
                    {
                        LogInfo(string.Format(LogStrings.SettingHeaderImage, newHeaderImageServerRelativeUrl), LogStrings.Heading_PublishingPageHeader);
                        targetPage.SetCustomPageHeader(newHeaderImageServerRelativeUrl);
                        headerCreated = true;
                    }
                }

                if (!headerCreated)
                {
                    // let's fall back to the default header
                    targetPage.SetDefaultPageHeader();
                }

                // Header type handling
                switch (publishingPageTransformationModel.Header.Type)
                {
                case HeaderType.ColorBlock: targetPage.PageHeader.LayoutType = ClientSidePageHeaderLayoutType.ColorBlock; break;

                case HeaderType.CutInShape: targetPage.PageHeader.LayoutType = ClientSidePageHeaderLayoutType.CutInShape; break;

                case HeaderType.NoImage: targetPage.PageHeader.LayoutType = ClientSidePageHeaderLayoutType.NoImage; break;

                case HeaderType.FullWidthImage: targetPage.PageHeader.LayoutType = ClientSidePageHeaderLayoutType.FullWidthImage; break;
                }

                // Alignment handling
                switch (publishingPageTransformationModel.Header.Alignment)
                {
                case HeaderAlignment.Left: targetPage.PageHeader.TextAlignment = ClientSidePageHeaderTitleAlignment.Left; break;

                case HeaderAlignment.Center: targetPage.PageHeader.TextAlignment = ClientSidePageHeaderTitleAlignment.Center; break;
                }

                // Show published date
                targetPage.PageHeader.ShowPublishDate = publishingPageTransformationModel.Header.ShowPublishedDate;

                // Topic header handling
                HeaderField topicHeaderField = GetHeaderField(publishingPageTransformationModel, HeaderFieldHeaderProperty.TopicHeader);
                if (topicHeaderField != null)
                {
                    if (publishingPageTransformationInformation.SourcePage.FieldExistsAndUsed(topicHeaderField.Name))
                    {
                        targetPage.PageHeader.TopicHeader     = publishingPageTransformationInformation.SourcePage[topicHeaderField.Name].ToString();
                        targetPage.PageHeader.ShowTopicHeader = true;
                    }
                }

                // AlternativeText handling
                HeaderField alternativeTextHeaderField = GetHeaderField(publishingPageTransformationModel, HeaderFieldHeaderProperty.AlternativeText);
                if (alternativeTextHeaderField != null)
                {
                    var alternativeTextHeader = GetFieldValue(alternativeTextHeaderField);
                    if (!string.IsNullOrEmpty(alternativeTextHeader))
                    {
                        targetPage.PageHeader.AlternativeText = alternativeTextHeader;
                    }
                }

                // Authors handling
                HeaderField authorsHeaderField = GetHeaderField(publishingPageTransformationModel, HeaderFieldHeaderProperty.Authors);
                if (authorsHeaderField != null)
                {
                    var authorsHeader = GetFieldValue(authorsHeaderField, PublishingFunctionProcessor.FieldType.User);
                    if (!string.IsNullOrEmpty(authorsHeader))
                    {
                        targetPage.PageHeader.Authors = authorsHeader;
                    }
                }
            }
        }
Пример #2
0
        public virtual Tuple <PageLayout, List <WebPartEntity> > AnalyzeAndTransform(DelvePageTransformationInformation pageTransformationInformation, ClientSidePage targetPage)
        {
            List <WebPartEntity> webparts = new List <WebPartEntity>();

            // Load the page
            string delvePageUrl = page[Constants.FileRefField].ToString();
            string fileContents = cc.Web.GetFileByServerRelativeUrlAsString(delvePageUrl);

            if (!string.IsNullOrEmpty(fileContents))
            {
                // Delve page is a json blob
                var pageJson = JToken.Parse(fileContents);

                string pageHeaderImage = null;

                foreach (var controlDataElement in pageJson["ControlData"])
                {
                    //Grab the first
                    var contentElement = controlDataElement.First;

                    string controlType = GetValueAsString(contentElement, "ControlName");

                    if (string.IsNullOrEmpty(controlType))
                    {
                        continue;
                    }

                    if (controlType.Equals("RichTextControl"))
                    {
                        int    subType     = GetSubType(contentElement["DataContext"]);
                        string textContent = GetValueAsString(contentElement["DataContext"], "Value");

                        // H1 header
                        if (subType == 0)
                        {
                            webparts.Add(CreateWikiTextPart($"<H2>{textContent}</H2>", 1, 1, GetOrder(controlDataElement.First, pageJson["ControlMap"]["Rows"])));
                        }
                        // Text
                        else if (subType == 1)
                        {
                            // Clean html
                            textContent = CleanHtml(textContent);
                            webparts.Add(CreateWikiTextPart(textContent, 1, 1, GetOrder(controlDataElement.First, pageJson["ControlMap"]["Rows"])));
                        }
                        // Pull quote
                        else if (subType == 2)
                        {
                            webparts.Add(CreateWikiTextPart($"<blockquote>{textContent}</blockquote>", 1, 1, GetOrder(controlDataElement.First, pageJson["ControlMap"]["Rows"])));
                        }
                    }
                    else if (controlType.Equals("ImageControl"))
                    {
                        Dictionary <string, string> props = new Dictionary <string, string>();

                        string imageSource  = GetValueAsString(contentElement["DataContext"], "ImageSource");
                        string imageCaption = GetValueAsString(contentElement["DataContext"], "CaptionText");

                        if (!string.IsNullOrEmpty(imageSource))
                        {
                            props.Add("Title", "Image in wiki text");
                            props.Add("Description", "");
                            props.Add("ImageUrl", imageSource.Replace("about://", ""));
                            props.Add("Width", "");
                            props.Add("Height", "");
                            props.Add("Anchor", "");
                            props.Add("Caption", imageCaption ?? "");
                        }

                        webparts.Add(CreateImagePart(props, 1, 1, GetOrder(controlDataElement.First, pageJson["ControlMap"]["Rows"])));
                    }
                    else if (controlType.Equals("VideoControl"))
                    {
                        Dictionary <string, string> props = new Dictionary <string, string>();

                        string videoSource  = GetValueAsString(contentElement["DataContext"], "VideoSource");
                        string videoCaption = GetValueAsString(contentElement["DataContext"], "CaptionText");

                        if (!string.IsNullOrEmpty(videoSource))
                        {
                            Uri    videoSourceUri  = new Uri(videoSource);
                            string queryString     = videoSourceUri.Query;
                            var    queryDictionary = System.Web.HttpUtility.ParseQueryString(queryString);

                            if (queryDictionary["chid"] != null && queryDictionary["vid"] != null)
                            {
                                string newVideoSource = $"{videoSourceUri.Scheme}://{videoSourceUri.DnsSafeHost}{videoSourceUri.LocalPath}".Replace("pointpublishing.aspx", "VideoEmbedHost.aspx", StringComparison.InvariantCultureIgnoreCase);
                                props.Add("Title", "Video in wiki text");
                                props.Add("Description", "");
                                props.Add("IFrameEmbed", $"<iframe width=640 height=360 src='{newVideoSource}?chId={queryDictionary["chid"]}&vId={queryDictionary["vid"]}&width=640&height=360&autoPlay=false&showInfo=false' allowfullscreen></iframe>");
                                props.Add("Source", videoSource);

                                webparts.Add(CreateVideoPart(props, 1, 1, GetOrder(controlDataElement.First, pageJson["ControlMap"]["Rows"])));
                            }
                        }
                    }
                    else if (controlType.Equals("DocumentHookControl"))
                    {
                        Dictionary <string, string> props = new Dictionary <string, string>();

                        string docSource = GetValueAsString(contentElement["DataContext"]["OfficeDocumentDataContext"], "FullDocumentUrl");

                        if (!string.IsNullOrEmpty(docSource))
                        {
                            props.Add("Title", "Document embed in wiki text");
                            props.Add("Description", "");
                            props.Add("DocumentUrl", docSource);
                            props.Add("Width", "");
                            props.Add("Height", "");
                        }

                        webparts.Add(CreateEmbedPart(props, 1, 1, GetOrder(controlDataElement.First, pageJson["ControlMap"]["Rows"])));
                    }
                    else if (controlType.Equals("ImageHeaderControl"))
                    {
                        pageHeaderImage = GetValueAsString(contentElement["DataContext"], "ImageSource");
                    }
                }

                // Configure page header
                targetPage.SetDefaultPageHeader();

                // Do we have an image page header?
                if (!string.IsNullOrEmpty(pageHeaderImage))
                {
                    string newHeaderImageServerRelativeUrl = "";
                    try
                    {
                        // make server relative image url
                        pageHeaderImage = new Uri(pageHeaderImage).PathAndQuery;

                        // Integrate asset transformator
                        AssetTransfer assetTransfer = new AssetTransfer(page.Context as ClientContext, targetPage.Context, base.RegisteredLogObservers);
                        newHeaderImageServerRelativeUrl = assetTransfer.TransferAsset(pageHeaderImage, System.IO.Path.GetFileNameWithoutExtension(page[Constants.TitleField].ToString()));
                    }
                    catch (Exception ex)
                    {
                        LogError(LogStrings.Error_HeaderImageAssetTransferFailed, LogStrings.Heading_PublishingPageHeader, ex);
                    }

                    if (!string.IsNullOrEmpty(newHeaderImageServerRelativeUrl))
                    {
                        LogInfo(string.Format(LogStrings.SettingHeaderImage, newHeaderImageServerRelativeUrl), LogStrings.Heading_PublishingPageHeader);
                        targetPage.SetCustomPageHeader(newHeaderImageServerRelativeUrl);
                    }
                }

                targetPage.PageTitle = pageJson["Title"].Value <string>();

                if (pageTransformationInformation.KeepSubTitle)
                {
                    var topicHeader = GetValueAsString(pageJson, "SubTitle");
                    if (!string.IsNullOrEmpty(topicHeader))
                    {
                        if (topicHeader.Length > 40)
                        {
                            topicHeader = topicHeader.Substring(0, 40);
                        }

                        targetPage.PageHeader.ShowTopicHeader = true;
                        targetPage.PageHeader.TopicHeader     = topicHeader;
                    }
                }

                if (pageTransformationInformation.PageTitleOverride != null)
                {
                    var title = pageTransformationInformation.PageTitleOverride(targetPage.PageTitle);
                    targetPage.PageTitle = title;

                    LogInfo($"{LogStrings.TransformPageTitleOverride} - page title: {title}", LogStrings.Heading_ArticlePageHandling);
                }
            }
            else
            {
                // Should never happen
            }

            return(new Tuple <PageLayout, List <WebPartEntity> >(PageLayout.Wiki_OneColumn, webparts));
        }