205 lines
7.0 KiB
C#
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 "";
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|