Skip to content

Commit 17ee6d6

Browse files
author
Juan Osorio
committed
MarkdownTextBlock: Enable/Disable built in extensions
1 parent ba694e0 commit 17ee6d6

File tree

3 files changed

+139
-70
lines changed

3 files changed

+139
-70
lines changed
Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE file in the project root for more information. -->
2-
<Page x:Class="MarkdownTextBlockExperiment.Samples.MarkdownTextBlockCustomSample"
3-
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4-
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5-
xmlns:controls="using:CommunityToolkit.Labs.WinUI.MarkdownTextBlock"
6-
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
7-
xmlns:local="using:MarkdownTextBlockExperiment.Samples"
8-
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
9-
mc:Ignorable="d">
1+
<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE file in the project root for more information. -->
2+
<Page
3+
x:Class="MarkdownTextBlockExperiment.Samples.MarkdownTextBlockCustomSample"
4+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
5+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
6+
xmlns:controls="using:CommunityToolkit.Labs.WinUI.MarkdownTextBlock"
7+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
8+
xmlns:local="using:MarkdownTextBlockExperiment.Samples"
9+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
10+
mc:Ignorable="d">
1011

1112
<Grid>
1213
<Grid.RowDefinitions>
@@ -15,30 +16,40 @@
1516
<RowDefinition Height="auto" />
1617
<RowDefinition Height="auto" />
1718
</Grid.RowDefinitions>
18-
<TextBlock Grid.Row="0"
19-
Margin="0,0,0,12"
20-
FontSize="16"
21-
FontWeight="Bold"
22-
Text="Try it live!" />
19+
<TextBlock
20+
Grid.Row="0"
21+
Margin="0,0,0,12"
22+
FontSize="16"
23+
FontWeight="Bold"
24+
Text="Try it live!" />
2325
<Grid Grid.Row="1">
2426
<Grid.ColumnDefinitions>
2527
<ColumnDefinition Width="*" />
2628
<ColumnDefinition Width="*" />
2729
</Grid.ColumnDefinitions>
28-
<controls:MarkdownTextBlock Grid.Column="0"
29-
Config="{x:Bind LiveMarkdownConfig, Mode=OneTime}"
30-
Text="{x:Bind MarkdownTextBox.Text, Mode=OneWay}" />
31-
<TextBox x:Name="MarkdownTextBox"
32-
Grid.Column="1"
33-
AcceptsReturn="True" />
30+
<controls:MarkdownTextBlock
31+
Grid.Column="0"
32+
Config="{x:Bind LiveMarkdownConfig, Mode=OneTime}"
33+
Text="{x:Bind MarkdownTextBox.Text, Mode=OneWay}" />
34+
<TextBox
35+
x:Name="MarkdownTextBox"
36+
Grid.Column="1"
37+
AcceptsReturn="True" />
3438
</Grid>
35-
<TextBlock Grid.Row="2"
36-
Margin="0,0,0,12"
37-
FontSize="16"
38-
FontWeight="Bold"
39-
Text="Built-in Sample" />
40-
<controls:MarkdownTextBlock Grid.Row="3"
41-
Config="{x:Bind MarkdownConfig, Mode=OneTime}"
42-
Text="{x:Bind Text, Mode=OneTime}" />
39+
<TextBlock
40+
Grid.Row="2"
41+
Margin="0,0,0,12"
42+
FontSize="16"
43+
FontWeight="Bold"
44+
Text="Built-in Sample" />
45+
<controls:MarkdownTextBlock
46+
Grid.Row="3"
47+
Config="{x:Bind MarkdownConfig, Mode=OneTime}"
48+
Text="{x:Bind Text, Mode=OneTime}"
49+
UseAutoLinks="True"
50+
UseEmphasisExtras="True"
51+
UseListExtras="True"
52+
UsePipeTables="True"
53+
UseTaskLists="True" />
4354
</Grid>
4455
</Page>

components/MarkdownTextBlock/src/MarkdownTextBlock.xaml.cs

Lines changed: 100 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
// See the LICENSE file in the project root for more information.
44

55
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;
69
using CommunityToolkit.Labs.WinUI.MarkdownTextBlock.TextElements;
710
using 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);

components/MarkdownTextBlock/src/Renderers/WinUIRenderer.cs

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,6 @@ public WinUIRenderer(MyFlowDocument document, MarkdownConfig config)
3131
FlowDocument = document;
3232
// set style
3333
_stack.Push(FlowDocument);
34-
LoadOverridenRenderers();
35-
}
36-
37-
private void LoadOverridenRenderers()
38-
{
39-
LoadRenderers();
4034
}
4135

4236
public override object Render(MarkdownObject markdownObject)
@@ -50,7 +44,6 @@ public void ReloadDocument()
5044
_stack.Clear();
5145
FlowDocument.RichTextBlock.Blocks.Clear();
5246
_stack.Push(FlowDocument);
53-
LoadOverridenRenderers();
5447
}
5548

5649
public void WriteLeafInline(LeafBlock leafBlock)
@@ -143,32 +136,4 @@ private static void AddInline(IAddChild parent, IAddChild inline)
143136
{
144137
parent.AddChild(inline);
145138
}
146-
147-
protected virtual void LoadRenderers()
148-
{
149-
// Default block renderers
150-
ObjectRenderers.Add(new CodeBlockRenderer());
151-
ObjectRenderers.Add(new ListRenderer());
152-
ObjectRenderers.Add(new HeadingRenderer());
153-
ObjectRenderers.Add(new ParagraphRenderer());
154-
ObjectRenderers.Add(new QuoteBlockRenderer());
155-
ObjectRenderers.Add(new ThematicBreakRenderer());
156-
ObjectRenderers.Add(new HtmlBlockRenderer());
157-
158-
// Default inline renderers
159-
ObjectRenderers.Add(new AutoLinkInlineRenderer());
160-
ObjectRenderers.Add(new CodeInlineRenderer());
161-
ObjectRenderers.Add(new DelimiterInlineRenderer());
162-
ObjectRenderers.Add(new EmphasisInlineRenderer());
163-
ObjectRenderers.Add(new HtmlEntityInlineRenderer());
164-
ObjectRenderers.Add(new LineBreakInlineRenderer());
165-
ObjectRenderers.Add(new LinkInlineRenderer());
166-
ObjectRenderers.Add(new LiteralInlineRenderer());
167-
ObjectRenderers.Add(new ContainerInlineRenderer());
168-
169-
// Extension renderers
170-
ObjectRenderers.Add(new TableRenderer());
171-
ObjectRenderers.Add(new TaskListRenderer());
172-
ObjectRenderers.Add(new HtmlInlineRenderer());
173-
}
174139
}

0 commit comments

Comments
 (0)