using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; using Saxonite.Net.Standard.Base.App; using System; using System.Collections.Generic; using System.Text; using System.Xml.Linq; namespace Saxonite.Net.Standard.Base.Bus { //======================================================================= // Article - Content data. //======================================================================= partial class SaxArticle { //------------------------------------------------------------------- // Definitions. private static readonly String ElementName_Content = "content"; private static readonly String ElementName_Segments = "segments"; private static readonly String ElementName_Segment = "segment"; private static readonly String ElementName_Body = "body"; private static readonly String ElementName_Html = "html"; private static readonly String ElementName_Image = "image"; private static readonly String ElementName_ImageId = "imageId"; //------------------------------------------------------------------- /// Article content. public class ContentData { /// /// Article Content Segment - either body content or image. /// public class SegmentData { // Segment body. public class BodyData { public bool IsValid() { if (!StringUtil.IsEmpty(Html)) return true; return false; } public String Html { get; set; } = String.Empty; } public BodyData Body { get; } = new BodyData(); // Segment image. public class ImageData { public bool IsValid() { if (SysId.IsValid(ItemImageId)) return true; return false; } public SysId ItemImageId { get; set; } } public ImageData Image { get; } = new ImageData(); // Validate. public bool IsValid() { if (Body.IsValid()) return true; if (Image.IsValid()) return true; return false; } } public List Segments { get; } = new List(); // Add segment. public SegmentData AddSegment() { SegmentData segment = new SegmentData(); Segments.Add(segment); return segment; } } //------------------------------------------------------------------- /// /// Convert serialised data from database to Content. /// public static ContentData ExtractContent(String contentData) { String fn = typeof(ContentData).FullName + ".ExtractContent"; ContentData content = new ContentData(); if (StringUtil.IsEmpty(contentData)) return content; try { // Load XML data. XDocument doc = XDocument.Parse(contentData); XElement rootElement = doc.Root; foreach (XElement rootChildElement in rootElement.GetChildElements()) { String rootChildElementName = rootChildElement.GetLocalName(); if (rootChildElementName.EqualsCI(ElementName_Segments)) { // Content segments. XElement segmentsElement = rootChildElement; foreach (XElement segmentsChildElement in segmentsElement.GetChildElements()) { String segmentsChildElementName = segmentsChildElement.GetLocalName(); if (segmentsChildElementName.EqualsCI(ElementName_Segment)) { // Content segment. ContentData.SegmentData segment = new ContentData.SegmentData(); XElement segmentElement = segmentsChildElement; foreach (XElement segmentChildElement in segmentElement.GetChildElements()) { String segmentChildElementName = segmentChildElement.GetLocalName(); if (segmentChildElementName.EqualsCI(ElementName_Body)) { // Content segment body. XElement bodyElement = segmentChildElement; foreach (XElement bodyChildElement in bodyElement.GetChildElements()) { String bodyChildElementName = bodyChildElement.GetLocalName(); if (bodyChildElementName.EqualsCI(ElementName_Html)) { // Content segment body HTML. XElement htmlElement = bodyChildElement; segment.Body.Html = htmlElement.Value; } else SaLogger.Warn(fn + " Unexpected 'Segment' child element: " + segmentChildElementName); } } else if (segmentChildElementName.EqualsCI(ElementName_Image)) { // Content segment image. XElement imageElement = segmentChildElement; foreach (XElement imageChildElement in imageElement.GetChildElements()) { String imageChildElementName = imageChildElement.GetLocalName(); if (imageChildElementName.EqualsCI(ElementName_ImageId)) { // Content segment image Id. XElement imageIdElement = imageChildElement; segment.Image.ItemImageId = imageIdElement.Value.ToSysId(); } else SaLogger.Warn(fn + " Unexpected 'Segment' child element: " + segmentChildElementName); } } else SaLogger.Warn(fn + " Unexpected 'Segment' child element: " + segmentChildElementName); } // Add this segment to the list. if (segment.IsValid()) content.Segments.Add(segment); } else SaLogger.Warn(fn + " Unexpected 'Segments' child element: " + segmentsChildElementName); } } else SaLogger.Warn(fn + " Unexpected 'Root' child element: " + rootChildElementName); } } catch (Exception exc) { SaLogger.Warn(fn + " " + ExceptionUtil.GetLogMessage(exc)); } return content; } //------------------------------------------------------------------- /// /// Convert Content to serialised data to store on database. /// public static String GetContentData(ContentData content) { String fn = typeof(ContentData).FullName + ".GetContentData"; try { XDocument doc = new XDocument(); XElement contentElement = doc.AppendElement(ElementName_Content); XElement segmentsElement = contentElement.AppendElement(ElementName_Segments); foreach (ContentData.SegmentData segment in content.Segments) { if (!segment.IsValid()) continue; XElement segmentElement = segmentsElement.AppendElement(ElementName_Segment); if (segment.Body.IsValid()) { // Segment Body. XElement bodyElement = segmentElement.AppendElement(ElementName_Body); if (!StringUtil.IsEmpty(segment.Body.Html)) bodyElement.AppendElement(ElementName_Html, segment.Body.Html); } else if (segment.Image.IsValid()) { // Segment Image. XElement imageElement = segmentElement.AppendElement(ElementName_Image); if (SysId.IsValid(segment.Image.ItemImageId)) imageElement.AppendElement(ElementName_ImageId, SysId.ToString(segment.Image.ItemImageId)); } } return doc.GetXml(); } catch (Exception exc) { SaLogger.Warn(fn + " " + ExceptionUtil.GetLogMessage(exc)); } return ""; } //------------------------------------------------------------------- } //======================================================================= }