[chore:] logging for MarkdownRenderer.cs
This commit is contained in:
+107
-96
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user