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("
");
TraverseParagraphAsHtml(paragraph, stringBuilder);
if (!isBlockFromList)
stringBuilder.Append("
");
}
else if (block is List list)
{
stringBuilder.Append(list.MarkerStyle == TextMarkerStyle.Decimal ? "" : "");
TraverseListAsHtml(list, stringBuilder);
stringBuilder.Append(list.MarkerStyle == TextMarkerStyle.Decimal ? "
" : "");
}
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("");
TraverseBlockAsHtml(listItem.Blocks, stringBuilder, true);
stringBuilder.Append("");
}
}
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("
");
}
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, "");
runString += "";
}
if (run.FontStyle == FontStyles.Italic)
{
runString = runString.Insert(0, "");
runString += "";
}
if (run.TextDecorations != null && run.TextDecorations.Count > 0)
{
if (run.TextDecorations.FirstOrDefault()?.Location == TextDecorationLocation.Underline)
{
runString = runString.Insert(0, "");
runString += "";
}
}
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("");
stringBuilder.Append(runString);
stringBuilder.Append("");
}
catch (Exception E)
{
LogException(E);
}
}
#endregion
}
}