@@ -37,6 +37,12 @@ public partial class RadzenMarkdown : RadzenComponent
37
37
[ Parameter ]
38
38
public string ? Text { get ; set ; }
39
39
40
+ /// <summary>
41
+ /// Whether to create anchor links for headings.
42
+ /// </summary>
43
+ [ Parameter ]
44
+ public bool AutoLinkHeadings { get ; set ; } = true ;
45
+
40
46
/// <inheritdoc />
41
47
protected override string GetComponentCssClass ( )
42
48
{
@@ -58,21 +64,31 @@ private void RenderChildContent(RenderTreeBuilder builder)
58
64
else
59
65
{
60
66
var document = MarkdownParser . Parse ( Text ) ;
61
-
62
- var visitor = new BlazorMarkdownRenderer ( builder , Empty ) ;
63
67
64
- document . Accept ( visitor ) ;
68
+ Render ( document , builder , Empty ) ;
65
69
}
66
70
}
67
71
72
+ private void Render ( Document document , RenderTreeBuilder builder , Action < RenderTreeBuilder , int > outlet )
73
+ {
74
+ var options = new BlazorMarkdownRendererOptions
75
+ {
76
+ AutoLinkHeadings = AutoLinkHeadings
77
+ } ;
78
+
79
+ var visitor = new BlazorMarkdownRenderer ( options , builder , outlet ) ;
80
+
81
+ document . Accept ( visitor ) ;
82
+ }
83
+
68
84
private static void Empty ( RenderTreeBuilder builder , int marker )
69
85
{
70
86
}
71
87
72
- private static void ProcessFramesWithMarkers ( RenderTreeBuilder builder , ArrayRange < RenderTreeFrame > frames )
88
+ private void ProcessFramesWithMarkers ( RenderTreeBuilder builder , ArrayRange < RenderTreeFrame > frames )
73
89
{
74
- var markdownBuilder = new StringBuilder ( ) ;
75
- var componentFrames = new Dictionary < int , ( int startIndex , int endIndex ) > ( ) ;
90
+ var markdown = new StringBuilder ( ) ;
91
+ var outletFrames = new Dictionary < int , ( int startIndex , int endIndex ) > ( ) ;
76
92
var markerId = 0 ;
77
93
var index = 0 ;
78
94
@@ -83,18 +99,18 @@ private static void ProcessFramesWithMarkers(RenderTreeBuilder builder, ArrayRan
83
99
if ( frame . FrameType == RenderTreeFrameType . Text || frame . FrameType == RenderTreeFrameType . Markup )
84
100
{
85
101
var content = frame . FrameType == RenderTreeFrameType . Text ? frame . TextContent : frame . MarkupContent ;
86
- markdownBuilder . Append ( content ) ;
102
+ markdown . Append ( content ) ;
87
103
index ++ ;
88
104
}
89
105
else if ( frame . FrameType == RenderTreeFrameType . Component || frame . FrameType == RenderTreeFrameType . Element )
90
106
{
91
107
// Insert a marker for this component
92
108
var marker = string . Format ( BlazorMarkdownRenderer . Outlet , markerId ) ;
93
- markdownBuilder . Append ( marker ) ;
109
+ markdown . Append ( marker ) ;
94
110
95
111
// Store the component information for later
96
112
var subtreeLength = GetSubtreeLength ( frame ) ;
97
- componentFrames . Add ( markerId , ( index , index + subtreeLength ) ) ;
113
+ outletFrames . Add ( markerId , ( index , index + subtreeLength ) ) ;
98
114
99
115
// Increment marker ID and skip past this component
100
116
markerId ++ ;
@@ -107,19 +123,17 @@ private static void ProcessFramesWithMarkers(RenderTreeBuilder builder, ArrayRan
107
123
}
108
124
}
109
125
110
- var document = MarkdownParser . Parse ( markdownBuilder . ToString ( ) ) ;
126
+ var document = MarkdownParser . Parse ( markdown . ToString ( ) ) ;
111
127
112
128
void RenderOutlet ( RenderTreeBuilder outletBuilder , int markerId )
113
129
{
114
- if ( componentFrames . TryGetValue ( markerId , out var componentFrame ) )
130
+ if ( outletFrames . TryGetValue ( markerId , out var componentFrame ) )
115
131
{
116
132
CopyFrames ( outletBuilder , frames , componentFrame . startIndex , componentFrame . endIndex ) ;
117
133
}
118
134
}
119
135
120
- var visitor = new BlazorMarkdownRenderer ( builder , RenderOutlet ) ;
121
-
122
- document . Accept ( visitor ) ;
136
+ Render ( document , builder , RenderOutlet ) ;
123
137
}
124
138
125
139
private static void CopyFrames ( RenderTreeBuilder builder , ArrayRange < RenderTreeFrame > frames , int startIndex , int endIndex )
0 commit comments