6
6
7
7
@code {
8
8
private string textContent = string .Empty ;
9
+ private const string SelectedMarker = " #selection#" ;
10
+ private const string CursorMarker = " #cursor#" ;
9
11
10
12
[Parameter ]
11
13
public string Value
39
41
StateHasChanged ();
40
42
}
41
43
42
- private async Task <string > GetNewMarkdownForElementAsync (KeyboardEventArgs keyboardEventArgs , string original , string elementId )
44
+ private async Task <string > GetNewMarkdownForElementAsync (
45
+ KeyboardEventArgs keyboardEventArgs ,
46
+ string original ,
47
+ string elementId )
43
48
{
44
49
return keyboardEventArgs .CtrlKey ? keyboardEventArgs .Key switch
45
50
{
46
- " b" => await GetNewMarkdownForElementAsync (elementId , original , " **" , " ** " ),
47
- " i" => await GetNewMarkdownForElementAsync (elementId , original , " * " , " * " ),
48
- " m" => await GetNewMarkdownForElementAsync (elementId , original , " [ " , " ]( )" ),
51
+ " b" => await GetNewMarkdownForElementAsync (elementId , original , $ " **{ SelectedMarker }**{ CursorMarker } " ),
52
+ " i" => await GetNewMarkdownForElementAsync (elementId , original , $" *{ SelectedMarker }*{ CursorMarker } " ),
53
+ " m" => await GetNewMarkdownForElementAsync (elementId , original , $" [{ SelectedMarker }]({ CursorMarker } )" ),
49
54
_ => original ,
50
55
} : original ;
51
56
}
52
57
53
58
private async Task <string > GetNewMarkdownForElementAsync (
54
59
string elementId ,
55
60
string content ,
56
- string fenceBegin ,
57
- string fenceEnd )
61
+ string fence )
58
62
{
59
63
var selectionRange = await jsRuntime .InvokeAsync <SelectionRange >(" getSelectionFromElement" , elementId );
60
64
if (selectionRange .Start == selectionRange .End )
63
67
}
64
68
65
69
var beforeMarker = selectionRange .Start > 0 ? content [.. selectionRange .Start ] : string .Empty ;
66
- var marker = content [selectionRange .Start .. selectionRange .End ];
70
+ var selectedContent = content [selectionRange .Start .. selectionRange .End ];
71
+ var fencedContent = fence .Replace (SelectedMarker , selectedContent );
67
72
var afterMarker = content [selectionRange .End .. ];
68
- var shift = selectionRange .End + fenceBegin .Length + fenceEnd .Length ;
73
+ var shift = selectionRange .Start + fencedContent .IndexOf (CursorMarker , StringComparison .Ordinal );
74
+ var removedCursor = fencedContent .Replace (CursorMarker , string .Empty );
69
75
await jsRuntime .InvokeVoidAsync (" setSelectionFromElement" , elementId , shift );
70
- return beforeMarker + fenceBegin + marker + fenceEnd + afterMarker ;
76
+ return beforeMarker + removedCursor + afterMarker ;
71
77
}
72
78
}
0 commit comments