From eff615d400ea5888dbc67ebf7d781c9f4d95a480 Mon Sep 17 00:00:00 2001 From: janus_wel Date: Fri, 26 Sep 2008 22:11:55 +0000 Subject: add word suggestion feature by dictionary for Firefox spell check git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@19995 d0d07461-0603-4401-acd4-de1884942a52 --- lookupDictionary.js | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 133 insertions(+), 4 deletions(-) (limited to 'lookupDictionary.js') diff --git a/lookupDictionary.js b/lookupDictionary.js index de5cbb8..8e69540 100644 --- a/lookupDictionary.js +++ b/lookupDictionary.js @@ -4,11 +4,12 @@ * @description Lookup words from Web dictionaries, and show the results in the bottom of the window * @description-ja Web上の辞書を引いた結果をコマンドライン・バッファへ出力します * @author teramako teramako@gmail.com - * @version 0.2 + * @version 0.3 * ==/VimperatorPlugin== */ (function(){ -[{ + +const SITE_DEFINITION = [{ names: ['eiji[ro]'], url: 'http://eow.alc.co.jp/%s/UTF-8/', shortHelp: 'SPACE ALC (英辞郎 on the Web)', @@ -31,7 +32,91 @@ url: 'http://www.answers.com/%s', shortHelp: 'Answers.com(英英辞書)', xpath: 'id("firstDs")' -}].forEach(function(dictionary){ +}]; + +// class definition +function SpellChecker() { + this.initialize.apply(this, arguments); +} +SpellChecker.prototype = { + initialize: function () { + const MYSPELL = "@mozilla.org/spellchecker/myspell;1"; + const HUNSPELL = "@mozilla.org/spellchecker/hunspell;1"; + const ENGINE = "@mozilla.org/spellchecker/engine;1"; + + var spellclass = MYSPELL; + if (HUNSPELL in Components.classes) + spellclass = HUNSPELL; + if (ENGINE in Components.classes) + spellclass = ENGINE; + + this.engine = Components.classes[spellclass] + .createInstance(Components.interfaces.mozISpellCheckingEngine); + }, + + /** + * @return {Array} + */ + getDictionaryList: function () { + var dictionaries = {}; + this.engine.getDictionaryList(dictionaries, {}); + return dictionaries.value; + }, + + /** + * @return {String} + */ + dictionary: function () { + var dict; + try { dict = this.engine.dictionary; } + catch (e) {} + return dict ? dict : null; + }, + + /** + * @param {String} dict + */ + setDictionary: function (dict) { + this.engine.dictionary = dict; + }, + + /** + * @param {Boolean} isBeginningWith + */ + setBeginningWith: function (isBeginningWith) { + this.isBeginningWith = isBeginningWith; + }, + + /** + * @param {String} spell + * @return {Boolean} + */ + check: function (spell) { + return this.engine.check(spell); + }, + + /** + * @param {String} spell + * @return {Array} + */ + suggest: function (spell) { + var suggestions = {}; + this.engine.suggest(spell, suggestions, {}); + suggestions = suggestions.value; + + if (this.isBeginningWith) { + suggestions = suggestions.filter( function (cand) { + return (cand.toLowerCase().indexOf(spell) === 0); + }); + } + + return suggestions; + }, +}; + +var spellChecker = buildSpellChecker(); + +SITE_DEFINITION.forEach(function(dictionary){ liberator.commands.addUserCommand( dictionary.names, dictionary.shortHelp, @@ -59,9 +144,31 @@ var xs = new XMLSerializer(); liberator.echo('' + xs.serializeToString( result ), true); }, dictionary.encode ? dictionary.encode : 'UTF-8'); - },{} + }, + { + completer: function (arg) { + if (!spellChecker.dictionary()) return [0, []]; + + var suggestions = spellChecker.suggest(arg); + var candidates = []; + for (var i=0, max=suggestions.length ; i