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