aboutsummaryrefslogtreecommitdiffstats
path: root/spellchecker.js
blob: de521a8bbfcc085f19281733cde2f97165ed05f8 (plain)
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 <janus_wel@fb3.so-net.ne.jp>
 * @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. plugins.spellchecker.setDictionary('en-US').suggest('liberater');
 *      -> liberate
 *         liberate r
 *         liberated
 *         liberates
 *         liberator
 *
 *  2. 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 plugins.spellchecker.getDictionaryList())].join(', ')),
    {}
);

})();

// vim: sw=4 sts=4 ts=4 et