From 8606eb07a4fd2cf38bbe333bfe971e62f06c3f02 Mon Sep 17 00:00:00 2001
From: drry
Date: Mon, 7 Apr 2008 04:33:24 +0000
Subject: lang/javascript/vimperator-plugins/trunk/lookupDictionary.js: * typo
を修正しました。 * インデントを修整しました。 * ほか。
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@9066 d0d07461-0603-4401-acd4-de1884942a52
---
lookupDictionary.js | 160 +++++++++++++++++++++++++---------------------------
1 file changed, 78 insertions(+), 82 deletions(-)
diff --git a/lookupDictionary.js b/lookupDictionary.js
index fd27d85..4d7c822 100644
--- a/lookupDictionary.js
+++ b/lookupDictionary.js
@@ -1,88 +1,84 @@
/**
- * lookup dictionary (vimperator plugin)
- * For vimperator 0.5.3
+ * lookup dictionary (Vimperator plugin)
+ * For Vimperator 0.6pre
* @author teramako teramako@gmail.com
* @version 0.1
*
- * Lookup web dictionary
- * And show the result in the bottom of the window
+ * Lookup words from Web dictionaries
+ * And show the results in the bottom of the window
*/
(function(){
-const dictionalyList = [
- {
- names: ['eiji[ro]'],
- url: 'http://eow.alc.co.jp/%s/UTF-8/',
- shortHelp: '英辞郎',
- xpath: '//*[@id="resultList"]'
- },{
- names: ['goo'],
- url: 'http://dictionary.goo.ne.jp/search.php?MT=%s&kind=all&mode=0',
- shortHelp: 'goo辞書',
- encode: 'EUC-JP',
- xpath: '//div[@id="incontents"]/*[@class="ch04" or @class="fs14" or contains(@class,"diclst")]',
- multi: true
- }
-];
-for (var i=0; i' + xs.serializeToString( result ), true);
- });
- },{}
- );
-}
+[{
+ names: ['eiji[ro]'],
+ url: 'http://eow.alc.co.jp/%s/UTF-8/',
+ shortHelp: 'SPACE ALC (英辞郎 on the Web)',
+ xpath: '//*[@id="resultList"]'
+},{
+ names: ['goo'],
+ url: 'http://dictionary.goo.ne.jp/search.php?MT=%s&kind=all&mode=0',
+ shortHelp: 'goo 辞書',
+ encode: 'EUC-JP',
+ xpath: '//div[@id="incontents"]/*[@class="ch04" or @class="fs14" or contains(@class,"diclst")]',
+ multi: true
+}].forEach(function(dictionary){
+ liberator.commands.addUserCommand(
+ dictionary.names,
+ dictionary.shortHelp,
+ function(arg,special){
+ var sel = window.content.document.getSelection();
+ if (special && sel) arg = sel;
+ if (!arg) return;
+ var url;
+ if (dictionary.encode){
+ var ttbu = Components.classes['@mozilla.org/intl/texttosuburi;1']
+ .getService( Components.interfaces.nsITextToSubURI);
+ url = dictionary.url.replace(/%s/g, ttbu.ConvertAndEscape(dictionary.encode, arg));
+ } else {
+ url = dictionary.url.replace(/%s/g,encodeURI(arg));
+ }
+ //liberator.log('URL: ' +url);
+ var result;
+ getHTML(url, function(str){
+ var doc = createHTMLDocument(str);
+ var result = getNodeFromXPath(dictionary.xpath, doc, dictionary.multi);
+ if (!result){
+ liberator.echoerr('Nothing to show...');
+ }
+ var xs = new XMLSerializer();
+ liberator.echo('' + xs.serializeToString( result ), true);
+ });
+ },{}
+ );
+});
/**
* @param {String} url
* @param {Function} callback
*/
function getHTML(url, callback){
- var xhr= new XMLHttpRequest();
- xhr.onreadystatechange = function(){
- if (xhr.readyState == 4){
- if (xhr.status == 200){
- callback.call(this,xhr.responseText);
- } else {
- throw new Error(xhr.statusText);
- }
- }
- };
- xhr.open('GET',url,true);
- xhr.send(null);
+ var xhr= new XMLHttpRequest();
+ xhr.onreadystatechange = function(){
+ if (xhr.readyState == 4){
+ if (xhr.status == 200){
+ callback.call(this,xhr.responseText);
+ } else {
+ throw new Error(xhr.statusText);
+ }
+ }
+ };
+ xhr.open('GET',url,true);
+ xhr.send(null);
}
/**
* @param {String} str
* @return {DOMDocument}
*/
function createHTMLDocument(str){
- str = str.replace(/^[\s\S]*?]*>|[\r\n]+|<\/html\s*>[\s\S]*$/ig, '');
- var htmlFragment = document.implementation.createDocument(null,'html',null);
- var range = document.createRange();
- range.setStartAfter(window.content.document.body);
- htmlFragment.documentElement.appendChild(htmlFragment.importNode(range.createContextualFragment(str),true));
- return htmlFragment;
+ str = str.replace(/^[\s\S]*?]+?)?>|[\r\n]+|<\/html\s*>[\S\s]*$/ig, '');
+ var htmlFragment = document.implementation.createDocument(null,'html',null);
+ var range = document.createRange();
+ range.setStartAfter(window.content.document.body);
+ htmlFragment.documentElement.appendChild(htmlFragment.importNode(range.createContextualFragment(str),true));
+ return htmlFragment;
}
/**
* @param {String} xpath XPath Expression
@@ -91,20 +87,20 @@ function createHTMLDocument(str){
* @return {Element}
*/
function getNodeFromXPath(xpath,doc,isMulti){
- if (!xpath || !doc) return;
- var result;
- if (isMulti){
- var nodesSnapshot = doc.evaluate(xpath,doc.documentElement,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
- if (nodesSnapshot.snapshotLength == 0) return;
- result = document.createElementNS(null,'div');
- for (var i=0; i