Files
C4IT-F4SD-Client/FasdDesktopUi/Basics/Helper/RichTextBoxHelper.cs
2025-11-11 11:03:42 +01:00

307 lines
9.4 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using static C4IT.Logging.cLogManager;
using static System.Net.Mime.MediaTypeNames;
namespace FasdDesktopUi.Basics.Helper
{
public static class cRichTextBoxHelper
{
#region Unicode
public static void TraverseBlockAsUnicode(BlockCollection blocks, StringBuilder stringBuilder, bool isBlockFromList = false)
{
try
{
foreach (Block block in blocks)
{
if (block is Paragraph paragraph)
{
TraverseParagraphAsUnicode(paragraph, stringBuilder);
stringBuilder.AppendLine();
}
else if (block is List list)
{
TraverseListAsUnicode(list, stringBuilder);
stringBuilder.AppendLine();
}
else if (block is BlockUIContainer container)
{
if (container.Child is System.Windows.Controls.Image image)
{
TraverseImageAsUnicode(image, stringBuilder);
stringBuilder.AppendLine();
}
}
}
}
catch (Exception E)
{
LogException(E);
}
}
private static void TraverseParagraphAsUnicode(Paragraph paragraph, StringBuilder stringBuilder)
{
try
{
foreach (var inline in paragraph.Inlines)
{
if (inline is Run run)
{
stringBuilder.Append(run.Text);
}
}
}
catch (Exception E)
{
LogException(E);
}
}
private static void TraverseListAsUnicode(List list, StringBuilder stringBuilder)
{
try
{
if (list.MarkerStyle == TextMarkerStyle.Decimal)
{
for (int i = 0; i < list.ListItems.Count; i++)
{
stringBuilder.Append(i + 1 + ". ");
TraverseBlockAsUnicode(list.ListItems.ElementAt(i).Blocks, stringBuilder, true);
}
}
else
{
foreach (var item in list.ListItems)
{
stringBuilder.Append("- ");
TraverseBlockAsUnicode(item.Blocks, stringBuilder, true);
}
}
}
catch (Exception E)
{
LogException(E);
}
}
private static void TraverseImageAsUnicode(System.Windows.Controls.Image image, StringBuilder stringBuilder)
{
try
{
stringBuilder.Append("[Image]");
}
catch (Exception E)
{
LogException(E);
}
}
#endregion
#region Html
public static void TraverseBlockAsHtml(BlockCollection blocks, StringBuilder stringBuilder, bool isBlockFromList = false)
{
try
{
foreach (var block in blocks)
{
if (block is Paragraph paragraph)
{
if (!isBlockFromList)
stringBuilder.Append("<p>");
TraverseParagraphAsHtml(paragraph, stringBuilder);
if (!isBlockFromList)
stringBuilder.Append("</p>");
}
else if (block is List list)
{
stringBuilder.Append(list.MarkerStyle == TextMarkerStyle.Decimal ? "<ol>" : "<ul>");
TraverseListAsHtml(list, stringBuilder);
stringBuilder.Append(list.MarkerStyle == TextMarkerStyle.Decimal ? "</ol>" : "</ul>");
}
else if (block is BlockUIContainer container)
{
if (container.Child is System.Windows.Controls.Image image)
{
TraverseImageAsHtml(image, stringBuilder);
}
}
}
}
catch (Exception E)
{
LogException(E);
}
}
private static void TraverseParagraphAsHtml(Paragraph paragraph, StringBuilder stringBuilder)
{
try
{
foreach (var inline in paragraph.Inlines)
{
TraverseInlineAsHtml(inline, stringBuilder);
}
}
catch (Exception E)
{
LogException(E);
}
}
private static void TraverseInlineAsHtml(Inline inline, StringBuilder stringBuilder)
{
try
{
if (inline is Run run)
TraverseRunAsHtml(run, stringBuilder);
else if (inline is Span span)
{
foreach (var spanInline in span.Inlines)
{
TraverseInlineAsHtml(spanInline, stringBuilder);
}
}
}
catch (Exception E)
{
LogException(E);
}
}
private static void TraverseListAsHtml(List list, StringBuilder stringBuilder)
{
try
{
foreach (var listItem in list.ListItems)
{
stringBuilder.AppendLine("<li>");
TraverseBlockAsHtml(listItem.Blocks, stringBuilder, true);
stringBuilder.Append("</li>");
}
}
catch (Exception E)
{
LogException(E);
}
}
private static void TraverseImageAsHtml(System.Windows.Controls.Image image, StringBuilder stringBuilder)
{
try
{
byte[] arr;
using (MemoryStream ms = new MemoryStream())
{
var bmp = image.Source as BitmapImage;
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));
encoder.Save(ms);
arr = ms.ToArray();
}
stringBuilder.AppendLine("<img src=\"data:image/png;base64,");
stringBuilder.Append(Convert.ToBase64String(arr));
stringBuilder.Append("\"/>");
}
catch (Exception E)
{
LogException(E);
}
}
public static void TraverseRunAsHtml(Run run, StringBuilder stringBuilder)
{
try
{
string styleString = string.Empty;
string runString = run.Text;
if (run.FontWeight == FontWeights.Bold)
{
runString = runString.Insert(0, "<strong>");
runString += "</strong>";
}
if (run.FontStyle == FontStyles.Italic)
{
runString = runString.Insert(0, "<em>");
runString += "</em>";
}
if (run.TextDecorations != null && run.TextDecorations.Count > 0)
{
if (run.TextDecorations.FirstOrDefault()?.Location == TextDecorationLocation.Underline)
{
runString = runString.Insert(0, "<u>");
runString += "</u>";
}
}
if (run.FontSize != 12)
styleString += $"font-size: {run.FontSize}px; ";
// default font size
//if (run.FontFamily != null)
// styleString += $"font-family: {run.FontFamily}; ";
//default color instead null:
//if (run.Foreground != null)
// styleString += $"color: {run.Foreground}; ";
if (!string.IsNullOrWhiteSpace(styleString))
{
styleString = styleString.Insert(0, "style=\"");
styleString += "\"";
}
stringBuilder.AppendLine("<span " + styleString + ">");
stringBuilder.Append(runString);
stringBuilder.Append("</span>");
}
catch (Exception E)
{
LogException(E);
}
}
#endregion
}
}