[chore:] logging for MarkdownRenderer.cs

This commit is contained in:
2026-05-16 18:19:27 +02:00
parent 557052bbc7
commit c6baa6a187
+107 -96
View File
@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Media; using Avalonia.Media;
@@ -12,118 +13,128 @@ public static class MarkdownRenderer
{ {
public static Control Render(string markdown) public static Control Render(string markdown)
{ {
var panel = new StackPanel { Spacing = 6 }; try
if (string.IsNullOrWhiteSpace(markdown)) return panel;
var doc = Markdown.Parse(markdown);
foreach (var block in doc)
{ {
switch (block) var panel = new StackPanel { Spacing = 6 };
if (string.IsNullOrWhiteSpace(markdown)) return panel;
var doc = Markdown.Parse(markdown);
foreach (var block in doc)
{ {
case HeadingBlock hb: switch (block)
{ {
var text = GetInlineText(hb.Inline); case HeadingBlock hb:
var tb = new TextBlock
{ {
Text = text, var text = GetInlineText(hb.Inline);
FontWeight = FontWeight.Bold, var tb = new TextBlock
Margin = new Avalonia.Thickness(0, hb.Level == 1 ? 6 : 2, 0, 2)
};
tb.FontSize = hb.Level switch { 1 => 22, 2 => 18, 3 => 16, _ => 14 };
panel.Children.Add(tb);
break;
}
case ParagraphBlock pb:
{
var text = GetInlineText(pb.Inline);
var tb = new TextBlock { Text = text, TextWrapping = Avalonia.Media.TextWrapping.Wrap };
panel.Children.Add(tb);
break;
}
case FencedCodeBlock cb:
{
var sb = new StringBuilder();
foreach (var line in cb.Lines.Lines)
{
sb.Append(line.ToString());
}
var codeBox = new TextBox
{
Text = sb.ToString(),
FontFamily = "Consolas, monospace",
IsReadOnly = true,
AcceptsReturn = true
};
panel.Children.Add(codeBox);
break;
}
case ListBlock lb:
{
var sp = new StackPanel { Spacing = 2 };
var number = 1;
foreach (var item in lb)
{
if (item is ListItemBlock lib)
{ {
var itemText = new StringBuilder(); Text = text,
foreach (var sub in lib) FontWeight = FontWeight.Bold,
{ Margin = new Avalonia.Thickness(0, hb.Level == 1 ? 6 : 2, 0, 2)
if (sub is ParagraphBlock pp) };
itemText.Append(GetInlineText(pp.Inline)); tb.FontSize = hb.Level switch { 1 => 22, 2 => 18, 3 => 16, _ => 14 };
} panel.Children.Add(tb);
var tb = new TextBlock { Text = (lb.IsOrdered ? (number++ + ". ") : "• ") + itemText.ToString() }; break;
sp.Children.Add(tb); }
}
case ParagraphBlock pb:
{
var text = GetInlineText(pb.Inline);
var tb = new TextBlock { Text = text, TextWrapping = Avalonia.Media.TextWrapping.Wrap };
panel.Children.Add(tb);
break;
}
case FencedCodeBlock cb:
{
var sb = new StringBuilder();
foreach (var line in cb.Lines.Lines)
{
sb.Append(line.ToString());
}
var codeBox = new TextBox
{
Text = sb.ToString(),
FontFamily = "Consolas, monospace",
IsReadOnly = true,
AcceptsReturn = true
};
panel.Children.Add(codeBox);
break;
}
case ListBlock lb:
{
var sp = new StackPanel { Spacing = 2 };
var number = 1;
foreach (var item in lb)
{
if (item is ListItemBlock lib)
{
var itemText = new StringBuilder();
foreach (var sub in lib)
{
if (sub is ParagraphBlock pp)
itemText.Append(GetInlineText(pp.Inline));
}
var tb = new TextBlock { Text = (lb.IsOrdered ? (number++ + ". ") : "• ") + itemText.ToString() };
sp.Children.Add(tb);
}
}
panel.Children.Add(sp);
break;
}
default:
{
// fallback: raw text
panel.Children.Add(new TextBlock { Text = block.ToString() });
break;
} }
panel.Children.Add(sp);
break;
}
default:
{
// fallback: raw text
panel.Children.Add(new TextBlock { Text = block.ToString() });
break;
} }
} }
}
return panel;
} catch (Exception ex) { Logger.Log($"Error while : {ex.Message}",Logger.LogType.Error);}
return panel; return new Panel();
} }
private static string GetInlineText(ContainerInline? container) private static string GetInlineText(ContainerInline? container)
{ {
if (container == null) return string.Empty; try
var sb = new StringBuilder();
foreach (var inline in container)
{ {
switch (inline) if (container == null) return string.Empty;
var sb = new StringBuilder();
foreach (var inline in container)
{ {
case LiteralInline li: switch (inline)
sb.Append(li.Content.ToString()); {
break; case LiteralInline li:
case EmphasisInline ei: sb.Append(li.Content.ToString());
sb.Append(GetInlineText(ei)); break;
break; case EmphasisInline ei:
case CodeInline ci: sb.Append(GetInlineText(ei));
sb.Append(ci.Content); break;
break; case CodeInline ci:
case LinkInline li: sb.Append(ci.Content);
sb.Append(GetInlineText(li)); break;
break; case LinkInline li:
case LineBreakInline: sb.Append(GetInlineText(li));
sb.Append("\n"); break;
break; case LineBreakInline:
default: sb.Append("\n");
sb.Append(inline.ToString()); break;
break; default:
sb.Append(inline.ToString());
break;
}
} }
}
return sb.ToString(); return sb.ToString();
} catch (Exception ex) { Logger.Log($"Error while : {ex.Message}",Logger.LogType.Error);}
return null;
} }
} }