-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmapper.py
117 lines (92 loc) · 2.68 KB
/
mapper.py
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
from pynput import keyboard
MAX_ENTITIES_LENGTH = 6
listener: keyboard.Listener | None = None
key_tab = []
keyController = keyboard.Controller()
Key = keyboard.Key
initialized = False
html_entities_mapping = {
"aacute": "á",
"eacute": "é",
"iacute": "í",
"oacute": "ó",
"uacute": "ú",
"agrave": "à",
"egrave": "è",
"igrave": "ì",
"ograve": "ò",
"ugrave": "ù",
"acirc": "â",
"ecirc": "ê",
"icirc": "î",
"ocirc": "ô",
"ucirc": "û",
"atilde": "ã",
"etilde": "ẽ",
"itilde": "ĩ",
"otilde": "õ",
"utilde": "ũ",
"auml": "ä",
"euml": "ë",
"iuml": "ï",
"ouml": "ö",
"uuml": "ü",
"ccedil": "ç",
"nbsp": "\t",
}
def bind_listener():
global listener
listener = keyboard.Listener(on_release=on_release)
listener.start()
def initialize(char):
global initialized
if (char == ';' and len(key_tab) == 0) or initialized:
initialized = True
return True
return False
def append_to_keytab(char):
global key_tab, initialized
if char != ';':
if len(key_tab) < MAX_ENTITIES_LENGTH:
key_tab.append(char)
return True
else:
key_tab = []
initialized = False
return False
# map an HTML entity to its corresponding accent
def mapper(entity_candidate):
global key_tab, initialized
if entity_candidate in html_entities_mapping:
listener.stop()
for i in range(len(entity_candidate) + 2): # + 2 because we also delete the `;` character
keyController.press(Key.backspace)
keyController.release(Key.backspace)
keyController.type(html_entities_mapping[entity_candidate])
key_tab = []
initialized = False
bind_listener()
else:
key_tab = []
if entity_candidate != '': # because the first time entity_candidate will equal to ''
initialized = False
def on_release(key: keyboard.Key | keyboard.KeyCode):
global key_tab, initialized
try:
has_been_initialized = initialize(key.char)
if has_been_initialized:
has_append = append_to_keytab(key.char)
if not has_append:
entity_candidate = ''.join(key_tab)
mapper(entity_candidate=entity_candidate)
except AttributeError:
if key == keyboard.Key.space or key == keyboard.Key.enter:
key_tab = []
initialized = False
def start_mapping():
bind_listener()
def stop_mapping():
global key_tab, initialized
listener.stop()
key_tab = []
initialized = False