aboutsummaryrefslogtreecommitdiff
path: root/src/content/domains/Key.ts
blob: b25616e34caf3ea8b585713c081f088cf9ebb0e6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
export default interface Key {
  key: string;
  shiftKey?: boolean;
  ctrlKey?: boolean;
  altKey?: boolean;
  metaKey?: boolean;
}

const modifiedKeyName = (name: string): string => {
  if (name === ' ') {
    return 'Space';
  }
  if (name.length === 1) {
    return name;
  } else if (name === 'Escape') {
    return 'Esc';
  }
  return name;
};

export const fromKeyboardEvent = (e: KeyboardEvent): Key => {
  let key = modifiedKeyName(e.key);
  let shift = e.shiftKey;
  if (key.length === 1 && key.toUpperCase() === key.toLowerCase()) {
    // make shift false for symbols to enable key bindings by symbold keys.
    // But this limits key bindings by symbol keys with Shift (such as Shift+$>.
    shift = false;
  }

  return {
    key: modifiedKeyName(e.key),
    shiftKey: shift,
    ctrlKey: e.ctrlKey,
    altKey: e.altKey,
    metaKey: e.metaKey,
  };
};

export const fromMapKey = (key: string): Key => {
  if (key.startsWith('<') && key.endsWith('>')) {
    let inner = key.slice(1, -1);
    let shift = inner.includes('S-');
    let base = inner.slice(inner.lastIndexOf('-') + 1);
    if (shift && base.length === 1) {
      base = base.toUpperCase();
    } else if (!shift && base.length === 1) {
      base = base.toLowerCase();
    }
    return {
      key: base,
      shiftKey: inner.includes('S-'),
      ctrlKey: inner.includes('C-'),
      altKey: inner.includes('A-'),
      metaKey: inner.includes('M-'),
    };
  }
  return {
    key: key,
    shiftKey: key.toLowerCase() !== key,
    ctrlKey: false,
    altKey: false,
    metaKey: false,
  };
};

export const equals = (e1: Key, e2: Key): boolean => {
  return e1.key === e2.key &&
    e1.ctrlKey === e2.ctrlKey &&
    e1.metaKey === e2.metaKey &&
    e1.altKey === e2.altKey &&
    e1.shiftKey === e2.shiftKey;
};