-
Notifications
You must be signed in to change notification settings - Fork 18
/
spellcheck.js
83 lines (70 loc) · 1.76 KB
/
spellcheck.js
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
const { webFrame, remote } = require('electron');
const spellchecker = require('spellchecker');
const osLocale = require('os-locale');
const spellcheckerContextMenu = require('./spellcheckMenu');
const locale = osLocale.sync().replace('-', '_');
if (!process.env.LANG) {
process.env.LANG = locale;
}
const ENGLISH_SKIP_WORDS = [
'ain',
'couldn',
'didn',
'doesn',
'hadn',
'hasn',
'mightn',
'mustn',
'needn',
'oughtn',
'shan',
'shouldn',
'wasn',
'weren',
'wouldn',
];
const simpleChecker = {
spellCheck: text => !simpleChecker.isMisspelled(text),
getSuggestions: text => spellchecker.getCorrectionsForMisspelling(text),
isMisspelled: (text) => {
const misspelled = spellchecker.isMisspelled(text);
if (!misspelled) {
return false;
}
if (ENGLISH_SKIP_WORDS.includes(text)) {
return false;
}
return true;
},
add: (text) => {
spellchecker.add(text);
},
};
window.spellChecker = simpleChecker;
webFrame.setSpellCheckProvider(
'en-US',
true,
simpleChecker,
);
window.addEventListener('contextmenu', (e) => {
// Do not show spellcheck context menu
// if right click is not within editor
if (!e.target.closest('div[contenteditable=true]')) {
return;
}
const selectedText = window.getSelection().toString();
// If selection is empty, no menu
if (!selectedText || selectedText === '' || selectedText.length === 1) {
return;
}
const isMisspelled = selectedText && simpleChecker.isMisspelled(selectedText);
const suggestions = isMisspelled && simpleChecker.getSuggestions(selectedText).slice(0, 5);
const menu = spellcheckerContextMenu({
word: selectedText,
isMisspelled,
suggestions,
});
setTimeout(() => {
menu.popup(remote.getCurrentWindow());
}, 30);
});