From 65ffcdcd3ed95cfb202a3b68b280dc4b6342c22d Mon Sep 17 00:00:00 2001 From: suVene Date: Wed, 19 Nov 2008 12:37:58 +0000 Subject: *Wedataからデータ読込み。 *選択テキストからリクエスト実行オプション追加。 *初期データ取得を切出し。 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/branches/1.2@24329 d0d07461-0603-4401-acd4-de1884942a52 --- multi_requester.js | 348 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 220 insertions(+), 128 deletions(-) diff --git a/multi_requester.js b/multi_requester.js index bcf6c53..6035cdf 100644 --- a/multi_requester.js +++ b/multi_requester.js @@ -1,55 +1,75 @@ /** * ==VimperatorPlugin== * @name multi_requester.js - * @description request, and the result is displayed in the buffer. + * @description request, and the result is displayed to the buffer. * @description-ja リクエストの結果をバッファに出力する。 * @author suVene suvene@zeromemory.info - * @version 0.1.2 + * @version 0.2.0 * @minVersion 1.2 * @maxVersion 1.2 * ==/VimperatorPlugin== * * Usage: - * :mr alc {ANY_TEXT or SELECTED_TEXT} -> show the buffer. - * :mr goo! {ANY_TEXT or SELECTED_TEXT} -> show the new tab. + * command[!] subcommand [ANY_TEXT | -s] + * + * ! create new tab. + * ANY_TEXT your input text + * FLAGS: + * -s use selected text + * + * :mr alc ANY_TEXT -> request by the input text, and display to the buffer. + * :mr! goo -s -> request by the selected text, and display to the new tab. + * + * + * CUSTOMIZE .vimperatorrc: * - * custom: * [COMMAND](default [mr]) - * let g:multi_requester_command = "ANY1, ANY2, ……"; + * let g:multi_requester_command = "ANY1, ANY2, ……" * or * liberator.globalVariables.multi_requester_command = [ANY1, ANY2, ……]; * * [SITEINFO] - * ex.) - * javascript <= 200 && status < 300); }, respondToReadyState: function(readyState) { - var state = Requester.EVENTS[readyState]; + var state = Request.EVENTS[readyState]; var response = new Response(this); if (state == 'Complete') { - Requester.requestCount--; + Request.requestCount--; try { this._complete = true; - this.fireEvent('on' + (this.isSuccess() ? 'Success' : 'Failure'), response); + this.fireEvent('on' + (this.isSuccess() ? 'Success' : 'Failure'), response, this.options.asynchronous); } catch (e) { - if (!this.fireEvent('onException', e)) throw e; + if (!this.fireEvent('onException', e, this.options.asynchronous)) throw e; } } }, @@ -315,7 +333,7 @@ Response.prototype = { }, status: 0, statusText: '', - getStatus: Requester.prototype.getStatus, + getStatus: Request.prototype.getStatus, getStatusText: function() { try { return this.transport.statusText || ''; @@ -351,6 +369,7 @@ Response.prototype = { range.detach(); var dom = fragment.lastChild; if (dom.tagName == 'parserError' || dom.namespaceURI == 'http://www.mozilla.org/newlayout/xml/parsererror.xml') { + $U.log('retry parsing.'); return this._createHTMLDocument2(str); } else { return fragment.childNodes.length > 1 ? fragment : fragment.firstChild; @@ -367,40 +386,105 @@ Response.prototype = { if (!xpath || !doc) return doc; var node = doc || document; var nodesSnapshot = (node.ownerDocument || node).evaluate(xpath, node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + + if (nodesSnapshot.snapshotLength == 0) return parentNode; parentNode = parentNode || document.createElementNS(null, 'div'); for (let i = 0, l = nodesSnapshot.snapshotLength; i < l; parentNode.appendChild(nodesSnapshot.snapshotItem(i++))); return parentNode; } }; -// main controller -var MultiRequester = { - name: $U.getCommand(), - description: 'request, and show the result in the buffer', - action: function(args, special, count) { +// initial data access. +var DataAccess = { + getCommand: function() { + var c = liberator.globalVariables.multi_requester_command; + var ret; + if (typeof c == 'string') { + ret = [c]; + } else if (typeof c == 'Array') { + ret = check; + } else { + ret = DEFAULT_COMMAND; + } + return ret; + }, + getSiteInfo: function() { + var ret = {}; - var arg = this.parseArgs(args); - if (!arg.str) { return; } // do nothing + var useWedata = liberator.globalVariables.multi_requester_use_wedata ? + $U.eval(liberator.globalVariables.multi_requester_use_wedata) : true; + if (useWedata) { + $U.log('use Wedata'); + this.getWeData(function(site) { + if (!ret[site.name]) ret[site.name] = {}; + $U.extend(ret[site.name], site); + }); + } + + if (liberator.globalVariables.multi_requester_siteinfo) { + liberator.globalVariables.multi_requester_siteinfo.forEach(function(site) { + if (!ret[site.name]) ret[site.name] = {}; + $U.extend(ret[site.name], site); + }); + } - var site = arg.site; + SITEINFO.forEach(function(site) { + if (!ret[site.name]) ret[site.name] = {}; + $U.extend(ret[site.name], site); + }); - var url = site.url; + var result = []; + for (let v in ret) + result.push(ret[v]); + + return result; + }, + getWeData: function(func) { + var req = new Request( + 'http://wedata.net/databases/Multi%20Requester/items.json', + null, { asynchronous: false } + ); + req.addEventListener('onSuccess', function(res) { + var text = res.responseText; + if (!text) return; + var json = $U.evalJson(text); + if (!json) return; + + json.forEach(function(item) { func(item.data); } ); + }); + req.get(); + } +}; + +// main controller. +var MultiRequester = { + name: DataAccess.getCommand(), + description: 'request, and display to the buffer', + cmdOptions: [ + [['-s'], liberator.OPTION_NOARG] + ], + cmdAction: function(args, special, count) { + + var parsedArgs = this.parseArgs(args); + if (!parsedArgs || !parsedArgs.siteinfo || !parsedArgs.str) { return; } // do nothing + + var siteinfo = parsedArgs.siteinfo; + var url = siteinfo.url; // see: http://fifnel.com/2008/11/14/1980/ - var srcEncode = site.srcEncode || 'UTF-8'; - var urlEncode = site.urlEncode || srcEncode; + var srcEncode = siteinfo.srcEncode || 'UTF-8'; + var urlEncode = siteinfo.urlEncode || srcEncode; // via. lookupDictionary.js var ttbu = Components.classes['@mozilla.org/intl/texttosuburi;1'] .getService(Components.interfaces.nsITextToSubURI); - url = url.replace(/%s/g, ttbu.ConvertAndEscape(urlEncode, arg.str)); - $U.debug(url); + url = url.replace(/%s/g, ttbu.ConvertAndEscape(urlEncode, parsedArgs.str)); if (special) { liberator.open(url, liberator.NEW_TAB); } else { - let req = new Requester(url, null, { + let req = new Request(url, null, { encoding: srcEncode, - siteinfo: site, + siteinfo: siteinfo, args: { args: args, special: special, @@ -410,24 +494,24 @@ var MultiRequester = { req.addEventListener('onException', $U.bind(this, this.onException)); req.addEventListener('onSuccess', $U.bind(this, this.onSuccess)); req.addEventListener('onFailure', $U.bind(this, this.onFailure)); - req.get(); + + $U.echo('Loading ' + parsedArgs.name + ' ...', liberator.commandline.FORCE_SINGLELINE); } }, - // return {name: '', site: {}, str: ''} or null + // return {name: '', siteinfo: {}, str: ''} or null parseArgs: function(args) { - var ret = null; - if (!args) return ret; - ret = {}; - var ary = args.split(/ +/); - ret.name = ary.shift(); - if (ary.length >= 1) { - ret.site = this.getSite(ret.name); - } - ret.str = ary.join(' '); + if (!args) return null; - return ret; + var isOptS = args.hasOwnProperty('-s'); + if ((isOptS && args.arguments.length < 1) && args.arguments.length < 2) return null; + + var siteName = args.arguments.shift(); + var str = (isOptS ? $U.getSelectedString() : args.arguments.join()).replace(/[\n\r]/g, ''); + var siteinfo = this.getSite(siteName); + + return {name: siteName, siteinfo: siteinfo, str: str}; }, getSite: function(name) { if (!name) this.siteinfo[0]; @@ -435,32 +519,40 @@ var MultiRequester = { this.siteinfo.forEach(function(s) { if (s.name == name) ret = s; }); - return ret || this.siteinfo[0]; + return ret; }, onSuccess: function(res) { - if (!res.isSuccess || res.responseText == '') { - return $U.echoerr('request error.'); - } - var doc, args, xs; + try { - doc = res.getHTMLDocument(res.request.options.siteinfo.resultXpath); - args = res.request.options.args; - xs = new XMLSerializer(); - $U.echo('' + xs.serializeToString(doc)); + + if (!res.isSuccess || res.responseText == '') throw 'response is fail or null'; + + var url = res.request.url; + var escapedUrl = liberator.util.escapeHTML(url); + var xpath = res.request.options.siteinfo.resultXpath; + var doc = res.getHTMLDocument(xpath); + if (!doc) throw 'xpath result is undefined or null.: xpath -> ' + xpath; + + var html = '
' + + '' + escapedUrl + '' + + (new XMLSerializer()).serializeToString(doc).replace(/<[^>]+>/g, function(all) all.toLowerCase()) + + '
'; + $U.echo(new XMLList(html)); + } catch (e) { - $U.echoerr('parse error'); + $U.echoerr('error!!: ' + e); } }, onFailure: function(res) { - $U.echoerr('request error!!: ' + res.statusText); + $U.echoerr('request failure!!: ' + res.statusText); }, onException: function(e) { - $U.echoerr('error!!: ' + e); - }, + $U.echoerr('exception!!: ' + e); + } }; -CommandRegister.register(MultiRequester, $U.getSiteInfo()); +CommandRegister.register(MultiRequester, DataAccess.getSiteInfo()); return MultiRequester; })(); -// vim: set fdm=marker sw=4 ts=4 sts=0 et: +// vim: set fdm=marker sw=4 ts=4 sts=0 et: \ No newline at end of file -- cgit v1.2.3