using Microsoft.AspNetCore.Components.Rendering;
///
/// Takes a Html string and tries to turn it into a bunch of panels
///
public class HtmlPanel : Panel
{
///
/// The actual html value
///
public string Html { get; set; }
protected override int BuildHash() => HashCode.Combine( Html );
protected override string GetRenderTreeChecksum() => $"{BuildHash()}";
protected override void BuildRenderTree( RenderTreeBuilder tree )
{
if ( string.IsNullOrWhiteSpace( Html ) )
return;
try
{
var node = Sandbox.Html.INode.Parse( Html );
int i = 0;
BuildRenderTree( tree, node, ref i );
FlushHtml( tree, node, ref i );
}
catch ( System.Exception e )
{
Log.Error( e );
}
}
static string[] breakinElements = ["div", "p", "h1", "h2", "h3", "h4", "figure", "pre", "img", "video", "blockquote", "ul", "li", "ol"];
static bool IsTextElement( Sandbox.Html.INode node )
{
if ( node.IsText ) return true;
if ( node.Name == "br" ) return true;
if ( node.Name == "strong" ) return true;
if ( node.Name == "spoiler" ) return true;
if ( node.Name == "a" ) return true;
if ( breakinElements.Contains( node.Name ) ) return false;
return node.Children.All( IsTextElement );
}
string html = "";
void FlushHtml( RenderTreeBuilder tree, Sandbox.Html.INode node, ref int index )
{
if ( string.IsNullOrWhiteSpace( html ) ) return;
tree.OpenElement