Files
Saxonite/SaxoniteStandardBase/Base/Bus/SaxArticle-ContentData.cs
T
2024-08-20 17:51:32 +01:00

205 lines
7.0 KiB
C#

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";
//-------------------------------------------------------------------
/// <summary>Article content.</summary>
public class ContentData
{
/// <summary>
/// Article Content Segment - either body content or image.
/// </summary>
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<SegmentData> Segments { get; } = new List<SegmentData>();
// Add segment.
public SegmentData AddSegment()
{
SegmentData segment = new SegmentData();
Segments.Add(segment);
return segment;
}
}
//-------------------------------------------------------------------
/// <summary>
/// Convert serialised data from database to Content.
/// </summary>
public static ContentData ExtractContent(String contentData)
{
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($"{SysUtil.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($"{SysUtil.Fn} Unexpected 'Segment' child element: " + segmentChildElementName);
}
}
else SaLogger.Warn($"{SysUtil.Fn} Unexpected 'Segment' child element: " + segmentChildElementName);
}
// Add this segment to the list.
if (segment.IsValid())
content.Segments.Add(segment);
}
else SaLogger.Warn($"{SysUtil.Fn} Unexpected 'Segments' child element: " + segmentsChildElementName);
}
}
else SaLogger.Warn($"{SysUtil.Fn} Unexpected 'Root' child element: " + rootChildElementName);
}
}
catch (Exception exc)
{
SaLogger.Warn($"{SysUtil.Fn} " + ExceptionUtil.GetLogMessage(exc));
}
return content;
}
//-------------------------------------------------------------------
/// <summary>
/// Convert Content to serialised data to store on database.
/// </summary>
public static String GetContentData(ContentData content)
{
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($"{SysUtil.Fn} " + ExceptionUtil.GetLogMessage(exc));
}
return "";
}
//-------------------------------------------------------------------
}
//=======================================================================
}