Forge
csharp4405de34
1namespace CascadeIDE.Services.ChordNotation;
2
3/// <summary>
4/// Слой нормализации: сырые шаги Vim-стиля → <see cref="NormalizedKeySequence"/>.
5/// </summary>
6public static class ChordSemanticNormalizer
7{
8 public static NormalizedKeySequence FromVimSteps(IReadOnlyList<ChordNotationStep> steps)
9 {
10 if (steps.Count == 0)
11 return NormalizedKeySequence.Empty;
12
13 var list = new List<NormalizedSequenceStep>(steps.Count);
14 foreach (var s in steps)
15 {
16 switch (s)
17 {
18 case ChordNotationChordStep ch:
19 list.Add(new NormalizedChordStep(MapVimPrefixes(ch.ModifierPrefixes), NormalizeKeySymbol(ch.Key)));
20 break;
21 case ChordNotationPlainStep pl:
22 list.Add(new NormalizedPlainKeyStep(NormalizeKeySymbol(pl.Token)));
23 break;
24 }
25 }
26
27 return new NormalizedKeySequence(list);
28 }
29
30 private static ChordModifierKeys MapVimPrefixes(IReadOnlyList<string> prefixes)
31 {
32 ChordModifierKeys m = 0;
33 foreach (var p in prefixes)
34 {
35 m |= p switch
36 {
37 "C-" => ChordModifierKeys.Control,
38 "M-" or "A-" or "Alt-" => ChordModifierKeys.Alt,
39 "S-" => ChordModifierKeys.Shift,
40 "D-" => ChordModifierKeys.Meta,
41 _ => 0
42 };
43 }
44
45 return m;
46 }
47
48 /// <summary>Единый вид символа клавиши: буквы одной буквы — верхний регистр; остальное без лишних правок.</summary>
49 public static string NormalizeKeySymbol(string key)
50 {
51 if (key.Length == 1 && char.IsLetter(key[0]))
52 return key.ToUpperInvariant();
53 return key;
54 }
55}
56
View only · write via MCP/CIDE