/* * ==VimperatorPlugin== * @name spellchecker.js * @description provide the object for spell check. * @description-ja スペルチェック用のオブジェクトを提供する。 * @author janus_wel * @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 id='n12' href='#n12'>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
let PLUGIN_INFO =
<VimperatorPlugin>
<name>{NAME}</name>
<description>DOM Inspector command</description>
<require type="extension" id="inspector@mozilla.org">DOM Inspector</require>
<author mail="teramako@gmail.com" homepage="http://vimperator.g.hatena.ne.jp/teramako/">teramako</author>
<version>0.3</version>
<minVersion>2.3pre</minVersion>
<maxVersion>2.3pre</maxVersion>
<detail><![CDATA[
== Usage ==
:inspect #{id}:
  inspect the element of the {id} in browser content
:inspect! #{id}:
  inspect the element of the {id} in firefox
:inspect[!] -f[rame] #{id}:
  inspect the document in the frame element of the {id}
:inspect {str}:
  inspect the return value of evaluated the {str}
]]></detail>
</VimperatorPlugin>;

(function(){

const inspectorID = "inspector@mozilla.org";
if (!Application.extensions.has(inspectorID) || !Application.extensions.get(inspectorID).enabled) return;

/* これやるとFirefox終了時に実行されるんだけど...なぜ? -> Ubiquityが悪さしているみたい
Object.prototype.inspect = function(){
	runInspector(this);
};
*/

function runInspector(node){
	if (node instanceof Document){
		inspectDOMDocument(node);
	} else if (node instanceof Node){
		inspectDOMNode(node);
	} else if (node !== null && typeof node != "undefined"){
		inspectObject(node);
	}
}

function getIDList(filter, isChrome){
	var doc = isChrome ? document : content.document;
	var iter = util.evaluateXPath('//*[@id and contains(@id,"' + filter + '")]',doc);
	return [["#" + e.id, "TagName: "+ e.tagName] for (e in iter)];
}

var options = [
	[["-frame","-f"], commands.OPTION_NOARG]
];
commands.addUserCommand(["inspect","dominspect"],"run DOM Inspector",
	function(args){
		var arg = args[0];
		var doc = args.bang ? document : content.document;
		var node;
		if (!arg){
			node = doc;
		} else if (arg.charAt(0) == "#"){
			let id = arg.substr(1);
			node = doc.getElementById(id);
			if (!node){
				liberator.echoerr("No such id: " + id );
				return;
			}
		} else {
			try {
				node = liberator.eval(args.string);
			} catch (e){
				liberator.echoerr(e);
			}
		}
		if (args["-frame"] && node.contentDocument) node = node.contentDocument;
		runInspector(node);
	},{
		bang: true,
		argCount: "*",
		options: options,
		completer: function(context, args){
			if (args[0] && args[0].charAt(0) == "#"){
				var arg = args[0];
				var list = getIDList(arg.substr(1), args.bang);
				context.completions = list.filter(function(elem) elem[0].indexOf(arg) == 0);
			} else {
				completion.javascript(context);
			}
		}
	}
);

})();