33// See the LICENSE file in the project root for more information.
44
55using CommunityToolkit . Labs . WinUI . MarkdownTextBlock . Renderers ;
6+ using CommunityToolkit . Labs . WinUI . MarkdownTextBlock . Renderers . ObjectRenderers ;
7+ using CommunityToolkit . Labs . WinUI . MarkdownTextBlock . Renderers . ObjectRenderers . Extensions ;
8+ using CommunityToolkit . Labs . WinUI . MarkdownTextBlock . Renderers . ObjectRenderers . Inlines ;
69using CommunityToolkit . Labs . WinUI . MarkdownTextBlock . TextElements ;
710using Markdig ;
811
@@ -13,7 +16,7 @@ public partial class MarkdownTextBlock : Control
1316{
1417 private const string MarkdownContainerName = "MarkdownContainer" ;
1518 private Grid ? _container ;
16- private MarkdownPipeline _pipeline ;
19+ private MarkdownPipeline _pipeline = null ! ;
1720 private MyFlowDocument _document ;
1821 private WinUIRenderer ? _renderer ;
1922
@@ -42,6 +45,65 @@ public string Text
4245 set => SetValue ( TextProperty , value ) ;
4346 }
4447
48+ #region Built in Extensions
49+
50+ private static readonly DependencyProperty UseEmphasisExtrasProperty = DependencyProperty . Register (
51+ nameof ( UseEmphasisExtras ) ,
52+ typeof ( bool ) ,
53+ typeof ( MarkdownTextBlock ) ,
54+ new PropertyMetadata ( false ) ) ;
55+ public bool UseEmphasisExtras
56+ {
57+ get => ( bool ) GetValue ( UseEmphasisExtrasProperty ) ;
58+ set => SetValue ( UseEmphasisExtrasProperty , value ) ;
59+ }
60+
61+ private static readonly DependencyProperty UsePipeTablesProperty = DependencyProperty . Register (
62+ nameof ( UsePipeTables ) ,
63+ typeof ( bool ) ,
64+ typeof ( MarkdownTextBlock ) ,
65+ new PropertyMetadata ( false ) ) ;
66+ public bool UsePipeTables
67+ {
68+ get => ( bool ) GetValue ( UsePipeTablesProperty ) ;
69+ set => SetValue ( UsePipeTablesProperty , value ) ;
70+ }
71+
72+ private static readonly DependencyProperty UseListExtrasProperty = DependencyProperty . Register (
73+ nameof ( UseListExtras ) ,
74+ typeof ( bool ) ,
75+ typeof ( MarkdownTextBlock ) ,
76+ new PropertyMetadata ( false ) ) ;
77+ public bool UseListExtras
78+ {
79+ get => ( bool ) GetValue ( UseListExtrasProperty ) ;
80+ set => SetValue ( UseListExtrasProperty , value ) ;
81+ }
82+
83+ private static readonly DependencyProperty UseTaskListsProperty = DependencyProperty . Register (
84+ nameof ( UseTaskLists ) ,
85+ typeof ( bool ) ,
86+ typeof ( MarkdownTextBlock ) ,
87+ new PropertyMetadata ( false ) ) ;
88+ public bool UseTaskLists
89+ {
90+ get => ( bool ) GetValue ( UseTaskListsProperty ) ;
91+ set => SetValue ( UseTaskListsProperty , value ) ;
92+ }
93+
94+ private static readonly DependencyProperty UseAutoLinksProperty = DependencyProperty . Register (
95+ nameof ( UseAutoLinks ) ,
96+ typeof ( bool ) ,
97+ typeof ( MarkdownTextBlock ) ,
98+ new PropertyMetadata ( false ) ) ;
99+ public bool UseAutoLinks
100+ {
101+ get => ( bool ) GetValue ( UseAutoLinksProperty ) ;
102+ set => SetValue ( UseAutoLinksProperty , value ) ;
103+ }
104+
105+ #endregion
106+
45107 private static void OnConfigChanged ( DependencyObject d , DependencyPropertyChangedEventArgs e )
46108 {
47109 if ( d is MarkdownTextBlock self && e . NewValue != null )
@@ -62,17 +124,23 @@ public MarkdownTextBlock()
62124 {
63125 this . DefaultStyleKey = typeof ( MarkdownTextBlock ) ;
64126 _document = new MyFlowDocument ( ) ;
65- _pipeline = new MarkdownPipelineBuilder ( )
66- . UseEmphasisExtras ( )
67- . UseAutoLinks ( )
68- . UseTaskLists ( )
69- . UsePipeTables ( )
70- . Build ( ) ;
71127 }
72128
73129 protected override void OnApplyTemplate ( )
74130 {
75131 base . OnApplyTemplate ( ) ;
132+
133+ var pipelineBuilder = new MarkdownPipelineBuilder ( ) ;
134+
135+ // NOTE: Order matters here
136+ if ( UseEmphasisExtras ) pipelineBuilder = pipelineBuilder . UseEmphasisExtras ( ) ;
137+ if ( UsePipeTables ) pipelineBuilder = pipelineBuilder . UsePipeTables ( ) ;
138+ if ( UseListExtras ) pipelineBuilder = pipelineBuilder . UseListExtras ( ) ;
139+ if ( UseTaskLists ) pipelineBuilder = pipelineBuilder . UseTaskLists ( ) ;
140+ if ( UseAutoLinks ) pipelineBuilder = pipelineBuilder . UseAutoLinks ( ) ;
141+
142+ _pipeline = pipelineBuilder . Build ( ) ;
143+
76144 _container = ( Grid ) GetTemplateChild ( MarkdownContainerName ) ;
77145 _container . Children . Clear ( ) ;
78146 _container . Children . Add ( _document . RichTextBlock ) ;
@@ -111,6 +179,31 @@ private void Build()
111179 if ( _renderer == null )
112180 {
113181 _renderer = new WinUIRenderer ( _document , Config ) ;
182+
183+ // Default block renderers
184+ _renderer . ObjectRenderers . Add ( new CodeBlockRenderer ( ) ) ;
185+ _renderer . ObjectRenderers . Add ( new ListRenderer ( ) ) ;
186+ _renderer . ObjectRenderers . Add ( new HeadingRenderer ( ) ) ;
187+ _renderer . ObjectRenderers . Add ( new ParagraphRenderer ( ) ) ;
188+ _renderer . ObjectRenderers . Add ( new QuoteBlockRenderer ( ) ) ;
189+ _renderer . ObjectRenderers . Add ( new ThematicBreakRenderer ( ) ) ;
190+ _renderer . ObjectRenderers . Add ( new HtmlBlockRenderer ( ) ) ;
191+
192+ // Default inline renderers
193+ if ( UseAutoLinks ) _renderer . ObjectRenderers . Add ( new AutoLinkInlineRenderer ( ) ) ;
194+ _renderer . ObjectRenderers . Add ( new CodeInlineRenderer ( ) ) ;
195+ _renderer . ObjectRenderers . Add ( new DelimiterInlineRenderer ( ) ) ;
196+ _renderer . ObjectRenderers . Add ( new EmphasisInlineRenderer ( ) ) ;
197+ _renderer . ObjectRenderers . Add ( new HtmlEntityInlineRenderer ( ) ) ;
198+ _renderer . ObjectRenderers . Add ( new LineBreakInlineRenderer ( ) ) ;
199+ _renderer . ObjectRenderers . Add ( new LinkInlineRenderer ( ) ) ;
200+ _renderer . ObjectRenderers . Add ( new LiteralInlineRenderer ( ) ) ;
201+ _renderer . ObjectRenderers . Add ( new ContainerInlineRenderer ( ) ) ;
202+
203+ // Extension renderers
204+ if ( UsePipeTables ) _renderer . ObjectRenderers . Add ( new TableRenderer ( ) ) ;
205+ if ( UseTaskLists ) _renderer . ObjectRenderers . Add ( new TaskListRenderer ( ) ) ;
206+ _renderer . ObjectRenderers . Add ( new HtmlInlineRenderer ( ) ) ;
114207 }
115208 _pipeline . Setup ( _renderer ) ;
116209 ApplyText ( false ) ;
0 commit comments