-
Notifications
You must be signed in to change notification settings - Fork 123
/
Copy pathspellchecker.js
124 lines (108 loc) · 3.81 KB
/
spellchecker.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
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
118
119
120
121
122
123
124
/*
* ==VimperatorPlugin==
* @name spellchecker.js
* @description provide the object for spell check.
* @description-ja スペルチェック用のオブジェクトを提供する。
* @author janus_wel <[email protected]>
* @version 0.10
* @minversion 2.0pre 2008/10/16
* ==/VimperatorPlugin==
*
* LICENSE
* New BSD License
*
* USAGE
* the object is available in liberator.modules.plugins.spellchecker.
* set the dictionary and call check or suggest method.
* you can use :availabledictionaries and :adict commands
* to know available dictionaries.
* all 'set' method is return the reference of spellchecker object itself,
* so you can connect methods.
*
* METHOD
* setDictionary(dict) set dictionary to check the spell
* setBeginningWith(bool) set
* getDictionaryList() get available dictionaries
* getDictionary() return dictionary name to use for spell checking
* check(word) if word exists in dictionary, return true, not exists, return false
* suggest(word) word suggestion. return generator of iterator
*
* EXAMPLE
* 1. liberator.plugins.spellchecker.setDictionary('en-US').suggest('liberater');
* -> liberate
* liberate r
* liberated
* liberates
* liberator
*
* 2. liberator.plugins.spellchecker.check('liberater');
* -> false
* */
( function () {
// SpellChecker
function SpellChecker() {
this._initialize.apply(this, arguments);
}
SpellChecker.prototype = {
_initialize: function (dict) {
// refer: https://developer.mozilla.org/En/Using_spell_checking_in_XUL
const MOZILLA = '@mozilla.org/spellchecker/';
const MYSPELL = MOZILLA + 'myspell;1';
const HUNSPELL = MOZILLA + 'hunspell;1';
const ENGINE = MOZILLA + 'engine;1';
const Cc = Components.classes;
const Ci = Components.interfaces;
let spellclass = MYSPELL;
if (HUNSPELL in Cc) spellclass = HUNSPELL;
if (ENGINE in Cc) spellclass = ENGINE;
this._engine = Cc[spellclass].createInstance(Ci.mozISpellCheckingEngine);
// if dictionary is assigned, set it.
if (dict) this.setDictionary(dict);
},
// list of available dictionaries
getDictionaryList: function () {
let dictionaries = {};
this._engine.getDictionaryList(dictionaries, {});
for (let [, v] in Iterator(dictionaries.value)) yield v;
},
setDictionary: function (dict) {
for (let d in this.getDictionaryList()) {
if (d === dict) {
this._engine.dictionary = dict;
return this;
}
}
throw new Error('the assigned dictionary is unavailable.');
},
getDictionary: function () {
let dict;
try { dict = this._engine.dictionary; }
catch (e) {}
return dict || null;
},
setBeginningWith: function (isBeginningWith) {
this.isBeginningWith = isBeginningWith;
return this;
},
check: function (spell) this._engine.check(spell),
suggest: function (spell) {
let suggestions = {};
this._engine.suggest(spell, suggestions, {});
suggestions = suggestions.value;
if (this.isBeginningWith) {
suggestions = suggestions.filter( function (cand) {
return (cand.toLowerCase().indexOf(spell) === 0);
});
}
for (let [, v] in Iterator(suggestions)) yield v;
},
};
plugins.spellchecker = new SpellChecker();
commands.addUserCommand(
['availabledictionaries', 'adict'],
'display available dictionaries',
function () liberator.echo('available dictionaries: ' + [a for (a in liberator.plugins.spellchecker.getDictionaryList())].join(', ')),
{}
);
})();
// vim: sw=4 sts=4 ts=4 et