150 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			150 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | //////////////////////////////////////////////////////////////////////////////// | |||
|  | 
 | |||
|  | using Markdig.Renderers; | |||
|  | using Markdig.Syntax; | |||
|  | using Markdig.Syntax.Inlines; | |||
|  | 
 | |||
|  | namespace WeChatWASM.MDV | |||
|  | { | |||
|  |     //////////////////////////////////////////////////////////////////////////////// | |||
|  |     /// <see cref="Markdig.Renderers.HtmlRenderer"/> | |||
|  |     /// <see cref="Markdig.Renderers.Normalize.NormalizeRenderer"/> | |||
|  | 
 | |||
|  |     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() ); | |||
|  |         } | |||
|  | 
 | |||
|  | 
 | |||
|  |         //////////////////////////////////////////////////////////////////////////////// | |||
|  | 
 | |||
|  |         /// <see cref="Markdig.Renderers.TextRendererBase.WriteLeafInline"/> | |||
|  | 
 | |||
|  |         internal void WriteLeafBlockInline( LeafBlock block ) | |||
|  |         { | |||
|  |             var inline = block.Inline as Inline; | |||
|  | 
 | |||
|  |             while( inline != null ) | |||
|  |             { | |||
|  |                 Write( inline ); | |||
|  |                 inline = inline.NextSibling; | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Output child nodes as raw text | |||
|  |         /// </summary> | |||
|  |         /// <see cref="Markdig.Renderers.HtmlRenderer.WriteLeafRawLines"/> | |||
|  | 
 | |||
|  |         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; | |||
|  |             } | |||
|  | 
 | |||
|  |             /// <see cref="Markdig.Renderers.RendererBase.WriteChildren(ContainerInline)"/> | |||
|  |              | |||
|  |             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(); | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | } |