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