3
3
// See the LICENSE file in the project root for more information.
4
4
5
5
using 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 ;
6
9
using CommunityToolkit . Labs . WinUI . MarkdownTextBlock . TextElements ;
7
10
using Markdig ;
8
11
@@ -13,7 +16,7 @@ public partial class MarkdownTextBlock : Control
13
16
{
14
17
private const string MarkdownContainerName = "MarkdownContainer" ;
15
18
private Grid ? _container ;
16
- private MarkdownPipeline _pipeline ;
19
+ private MarkdownPipeline _pipeline = null ! ;
17
20
private MyFlowDocument _document ;
18
21
private WinUIRenderer ? _renderer ;
19
22
@@ -42,6 +45,65 @@ public string Text
42
45
set => SetValue ( TextProperty , value ) ;
43
46
}
44
47
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
+
45
107
private static void OnConfigChanged ( DependencyObject d , DependencyPropertyChangedEventArgs e )
46
108
{
47
109
if ( d is MarkdownTextBlock self && e . NewValue != null )
@@ -62,17 +124,23 @@ public MarkdownTextBlock()
62
124
{
63
125
this . DefaultStyleKey = typeof ( MarkdownTextBlock ) ;
64
126
_document = new MyFlowDocument ( ) ;
65
- _pipeline = new MarkdownPipelineBuilder ( )
66
- . UseEmphasisExtras ( )
67
- . UseAutoLinks ( )
68
- . UseTaskLists ( )
69
- . UsePipeTables ( )
70
- . Build ( ) ;
71
127
}
72
128
73
129
protected override void OnApplyTemplate ( )
74
130
{
75
131
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
+
76
144
_container = ( Grid ) GetTemplateChild ( MarkdownContainerName ) ;
77
145
_container . Children . Clear ( ) ;
78
146
_container . Children . Add ( _document . RichTextBlock ) ;
@@ -111,6 +179,31 @@ private void Build()
111
179
if ( _renderer == null )
112
180
{
113
181
_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 ( ) ) ;
114
207
}
115
208
_pipeline . Setup ( _renderer ) ;
116
209
ApplyText ( false ) ;
0 commit comments