/// <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; } } } }
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)); }