Skip to content

Commit 5a8f801

Browse files
committed
Refactored how fences are applied
1 parent 8ba849c commit 5a8f801

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

src/LinkDotNet.Blog.Web/Shared/TextAreaWithShortcuts.razor

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
@code {
88
private string textContent = string.Empty;
9+
private const string SelectedMarker = "#selection#";
10+
private const string CursorMarker = "#cursor#";
911

1012
[Parameter]
1113
public string Value
@@ -39,22 +41,24 @@
3941
StateHasChanged();
4042
}
4143

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)
4348
{
4449
return keyboardEventArgs.CtrlKey ? keyboardEventArgs.Key switch
4550
{
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})"),
4954
_ => original,
5055
} : original;
5156
}
5257

5358
private async Task<string> GetNewMarkdownForElementAsync(
5459
string elementId,
5560
string content,
56-
string fenceBegin,
57-
string fenceEnd)
61+
string fence)
5862
{
5963
var selectionRange = await jsRuntime.InvokeAsync<SelectionRange>("getSelectionFromElement", elementId);
6064
if (selectionRange.Start == selectionRange.End)
@@ -63,10 +67,12 @@
6367
}
6468

6569
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);
6772
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);
6975
await jsRuntime.InvokeVoidAsync("setSelectionFromElement", elementId, shift);
70-
return beforeMarker + fenceBegin + marker + fenceEnd + afterMarker;
76+
return beforeMarker + removedCursor + afterMarker;
7177
}
7278
}

0 commit comments

Comments
 (0)