//////////////////////////////////////////////////////////////////////////////// using Markdig.Renderers; using Markdig.Syntax; using Markdig.Syntax.Inlines; namespace WeChatWASM.MDV { //////////////////////////////////////////////////////////////////////////////// /// /// public class RendererMarkdown : RendererBase { internal LayoutBuilder Layout; internal Style Style = new Style(); internal string ToolTip = null; internal string Link { get { return mLink; } set { mLink = value; Style.Link = !string.IsNullOrEmpty( mLink ); } } public bool ConsumeSpace = false; private string mLink = null; internal void Text( string text ) { Layout.Text( text, Style, Link, ToolTip ); } //------------------------------------------------------------------------------ public override object Render( MarkdownObject document ) { Write( document ); return this; } public RendererMarkdown( LayoutBuilder doc ) { Layout = doc; ObjectRenderers.Add( new RendererBlockCode() ); ObjectRenderers.Add( new RendererBlockList() ); ObjectRenderers.Add( new RendererBlockHeading() ); ObjectRenderers.Add( new RendererBlockHtml() ); ObjectRenderers.Add( new RendererBlockParagraph() ); ObjectRenderers.Add( new RendererBlockQuote() ); ObjectRenderers.Add( new RendererBlockThematicBreak() ); ObjectRenderers.Add( new RendererInlineLink() ); ObjectRenderers.Add( new RendererInlineAutoLink() ); ObjectRenderers.Add( new RendererInlineCode() ); ObjectRenderers.Add( new RendererInlineDelimiter() ); ObjectRenderers.Add( new RendererInlineEmphasis() ); ObjectRenderers.Add( new RendererInlineLineBreak() ); ObjectRenderers.Add( new RendererInlineHtml() ); ObjectRenderers.Add( new RendererInlineHtmlEntity() ); ObjectRenderers.Add( new RendererInlineLiteral() ); } //////////////////////////////////////////////////////////////////////////////// /// internal void WriteLeafBlockInline( LeafBlock block ) { var inline = block.Inline as Inline; while( inline != null ) { Write( inline ); inline = inline.NextSibling; } } /// /// Output child nodes as raw text /// /// internal void WriteLeafRawLines( LeafBlock block ) { if( block.Lines.Lines == null ) { return; } var lines = block.Lines; var slices = lines.Lines; for( int i = 0; i < lines.Count; i++ ) { Text( slices[ i ].ToString() ); Layout.NewLine(); } } internal string GetContents( ContainerInline node ) { if( node == null ) { return string.Empty; } /// var inline = node.FirstChild; var content = string.Empty; while( inline != null ) { var lit = inline as LiteralInline; if( lit != null ) { content += lit.Content.ToString(); } inline = inline.NextSibling; } return content; } //------------------------------------------------------------------------------ internal void FinishBlock( bool space = false ) { if( space && !ConsumeSpace ) { Layout.Space(); } else { Layout.NewLine(); } } } }