/** * ==VimperatorPlugin== * @name multi_requester.js * @description request, and the result is displayed to the buffer. * @description-ja リクエストの結果をバッファに出力する。 * @author suVene suvene@zeromemory.info * @version 0.4.3 * @minVersion 2.0pre * @maxVersion 2.0pre * Last Change: 08-Dec-2008. * ==/VimperatorPlugin== * * HEAD COMMENT {{{ * Usage: * command[!] subcommand [ANY_TEXT] * * ! create new tab. * ANY_TEXT your input text * * :mr alc[,goo,any1,any2…] ANY_TEXT -> request by the input text, and display to the buffer. * :mr! goo[,any1,any2,…] {window.selection} -> request by the selected text, and display to the new tab. * * other siteinfo by wedata. * @see http://wedata.net/databases/Multi%20Requester/items * * CUSTOMIZE .vimperatorrc: * * [COMMAND](default [mr]) * let g:multi_requester_command = "ANY1, ANY2, ……" * or * liberator.globalVariables.multi_requester_command = [ANY1, ANY2, ……]; * * [SITEINFO] * ex.) * javascript < -1 && !parsedArgs.str) continue; // via. lookupDictionary.js let ttbu = Components.classes['@mozilla.org/intl/texttosuburi;1'] .getService(Components.interfaces.nsITextToSubURI); url = url.replace(/%s/g, ttbu.ConvertAndEscape(urlEncode, parsedArgs.str)); logger.log(url + '[' + srcEncode + '][' + urlEncode + ']::' + info.xpath); if (bang) { liberator.open(url, liberator.NEW_TAB); } else { let req = new lib.Request(url, null, { encoding: srcEncode, siteinfo: info, args: { args: args, bang: bang, count: count } }); 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(); MultiRequester.requestCount++; } } if (MultiRequester.requestCount) { logger.echo('Loading ' + parsedArgs.names + ' ...', commandline.FORCE_SINGLELINE); } else { MultiRequester.doProcess = false; } }, // return {names: '', str: '', count: 0, siteinfo: [{}]} parseArgs: function(args) { var self = this; var ret = {}; ret.names = ''; ret.str = ''; ret.count = 0; ret.siteinfo = []; if (!args) return ret; var arguments = args.split(/ +/); var sel = $U.getSelectedString(); if (arguments.length < 1) return ret; ret.names = arguments.shift(); ret.str = (arguments.length < 1 ? sel : arguments.join()).replace(/[\n\r]+/g, ''); ret.names.split(',').forEach(function(name) { var site = self.getSite(name); if (site) { ret.count++; ret.siteinfo.push(site); } }); return ret; }, getSite: function(name) { if (!name) this.siteinfo[0]; var ret = null; this.siteinfo.forEach(function(s) { if (s.name == name) ret = s; }); return ret; },//}}} extractLink: function(res, extractLink) { //{{{ var el = res.getHTMLDocument(extractLink); if (!el) throw 'extract link failed.: extractLink -> ' + extractLink; var a = el.firstChild; var url = $U.pathToURL((a.href || a.action || a.value)); var req = new lib.Request(url, null, $U.extend(res.req.options, {extractLink: true})); 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(); MultiRequester.requestCount++; MultiRequester.doProcess = true; },//}}} onSuccess: function(res) { //{{{ if (!MultiRequester.doProcess) { MultiRequester.requestCount = 0; return; } logger.log('success!!: ' + res.req.url); MultiRequester.requestCount--; if (MultiRequester.requestCount == 0) { MultiRequester.doProcess = false; } var url, escapedUrl, xpath, doc, html, extractLink; try { if (!res.isSuccess() || res.responseText == '') throw 'response is fail or null'; url = res.req.url; escapedUrl = util.escapeHTML(url); xpath = res.req.options.siteinfo.xpath; extractLink = res.req.options.siteinfo.extractLink; if (extractLink && !res.req.options.extractLink) { this.extractLink(res, extractLink); return; } doc = res.getHTMLDocument(xpath, null, res.req.options.siteinfo.ignoreTags); if (!doc) throw 'XPath result is undefined or null.: XPath -> ' + xpath; html = '' + escapedUrl + '' + (new XMLSerializer()).serializeToString(doc) .replace(/<[^>]+>/g, function(all) all.toLowerCase()) .replace(//g, ''); // actually //.replace(//g, ''); // strictly MultiRequester.echoHash[res.req.options.siteinfo.name] = html; } catch (e) { logger.log('error!!: ' + e); MultiRequester.echoHash[res.req.options.siteinfo.name] = 'error!!: ' + e + ''; } if (MultiRequester.requestCount == 0) { let echoList = []; MultiRequester.requestNames.split(',').forEach(function(name) { echoList.push(MultiRequester.echoHash[name]) }); html = '
' + echoList.join('') + '
'; try { logger.echo(new XMLList(html)); } catch (e) { logger.log(e); logger.echo(html); } } }, onFailure: function(res) { MultiRequester.doProcess = false; logger.echoerr('request failure!!: ' + res.statusText); }, onException: function(e) { MultiRequester.doProcess = false; logger.echoerr('exception!!: ' + e); }//}}} }; //}}} // boot strap {{{ CommandRegister.register(MultiRequester, DataAccess.getSiteInfo()); if (liberator.globalVariables.multi_requester_mappings) { CommandRegister.addUserMaps(MultiRequester.name[0], liberator.globalVariables.multi_requester_mappings); } //}}} return MultiRequester; })(); // vim: set fdm=marker sw=4 ts=4 sts=0 et: