/*** BEGIN LICENSE BLOCK {{{ Copyright (c) 2008 suVene distributable under the terms of an MIT-style license. http://www.opensource.jp/licenses/mit-license.html }}} END LICENSE BLOCK ***/ // PLUGIN_INFO//{{{ var PLUGIN_INFO = {NAME} request, and the result is displayed to the buffer. リクエストの結果をバッファに出力する。 suVene 0.4.11 MIT 2.0pre 2.0pre http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/multi_requester.js || command[!] subcommand [ANY_TEXT] ||< - ! create new tab. - ANY_TEXT your input text e.g.) >|| :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. ||< == Custumize .vimperatorrc == === Command(default [mr]) === >|| let g:multi_requester_command = "ANY1, ANY2, ……" or liberator.globalVariables.multi_requester_command = [ANY1, ANY2, ……]; ||< === Default Sites (default undefined) === >|| liberator.globalVariables.multi_requester_default_sites = "alc,goo" ||< These sites(subcommands) will be used, if this variable has been defined and you do not specify subcommands. === SITEINFO === e.g.) >|| javascript <|| javascript <|| let g:multi_requester_use_wedata = "false" // true by default ||< ]]> ; //}}} (function() { if (!liberator.plugins.libly) { liberator.log('multi_requester: needs _libly.js'); return; } // global variables {{{ var DEFAULT_COMMAND = ['mr']; var SITEINFO = [ { name: 'alc', description: 'SPACE ALC (\u82F1\u8F9E\u6717 on the Web)', url: 'http://eow.alc.co.jp/%s/UTF-8/', xpath: 'id("resultList")' }, { name: 'goo', description: 'goo \u8F9E\u66F8', url: 'http://dictionary.goo.ne.jp/search.php?MT=%s&kind=all&mode=0&IE=UTF-8', xpath: 'id("incontents")/*[@class="ch04" or @class="fs14" or contains(@class, "diclst")]', srcEncode: 'EUC-JP', urlEncode: 'UTF-8' }, ]; var libly = liberator.plugins.libly; var $U = libly.$U; var logger = $U.getLogger('multi_requester'); var mergedSiteinfo = {}; //}}} // Vimperator plugin command register {{{ var CommandRegister = { register: function(cmdClass, siteinfo) { cmdClass.siteinfo = siteinfo; commands.addUserCommand( cmdClass.name, cmdClass.description, $U.bind(cmdClass, cmdClass.cmdAction), { completer: cmdClass.cmdCompleter || function(context, arg) { context.title = ['Name', 'Descprition']; var filters = context.filter.split(','); var prefilters = filters.slice(0, filters.length - 1); var prefilter = !prefilters.length ? '' : prefilters.join(',') + ','; var subfilters = siteinfo.filter(function(s) prefilters.every(function(p) s.name != p)); var allSuggestions = subfilters.map(function(s) [prefilter + s.name, s.description]); context.completions = context.filter ? allSuggestions.filter(function(s) s[0].indexOf(context.filter) == 0) : allSuggestions; }, options: cmdClass.cmdOptions, argCount: cmdClass.argCount || undefined, bang: cmdClass.bang || true, count: cmdClass.count || false }, true // replace ); }, addUserMaps: function(prefix, mapdef) { mapdef.forEach(function([key, command, bang, args]) { var cmd = prefix + (bang ? '! ' : ' ') + command + ' '; mappings.addUserMap( [modes.NORMAL, modes.VISUAL], [key], 'user defined mapping', function() { if (args) { liberator.execute(cmd + args); } else { let sel = $U.getSelectedString(); if (sel.length) { liberator.execute(cmd + sel); } else { commandline.open(':', cmd, modes.EX); } } }, { rhs: ':' + cmd, norremap: true } ); }); } }; //}}} // initial data access class {{{ 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 self = this; var useWedata = typeof liberator.globalVariables.multi_requester_use_wedata == 'undefined' ? true : $U.eval(liberator.globalVariables.multi_requester_use_wedata); if (liberator.globalVariables.multi_requester_siteinfo) { liberator.globalVariables.multi_requester_siteinfo.forEach(function(site) { if (!mergedSiteinfo[site.name]) mergedSiteinfo[site.name] = {}; $U.extend(mergedSiteinfo[site.name], site); if (site.map) { CommandRegister.addUserMaps(MultiRequester.name[0], [[site.map, site.name, site.bang, site.args]]); } }); } SITEINFO.forEach(function(site) { if (!mergedSiteinfo[site.name]) mergedSiteinfo[site.name] = {}; $U.extend(mergedSiteinfo[site.name], site); if (site.map) { CommandRegister.addUserMaps(MultiRequester.name[0], [[site.map, site.name, site.bang, site.args]]); } }); if (useWedata) { logger.log('use wedata'); var wedata = new libly.Wedata('Multi%20Requester'); wedata.getItems(24 * 60 * 60 * 1000, function(item) { var site = item.data; if (mergedSiteinfo[site.name]) return; mergedSiteinfo[site.name] = {}; $U.extend(mergedSiteinfo[site.name], site); }, function(isSuccess, data) { if (!isSuccess) return; CommandRegister.register(MultiRequester, $U.A(mergedSiteinfo)); } ); } return $U.A(mergedSiteinfo); } }; //}}} // main controller {{{ var MultiRequester = { name: DataAccess.getCommand(), description: 'request, and display to the buffer', defaultSites: liberator.globalVariables.multi_requester_default_sites, doProcess: false, requestNames: '', requestCount: 0, echoHash: {}, cmdAction: function(args) { //{{{ if (MultiRequester.doProcess) return; var bang = args.bang; var count = args.count; var parsedArgs = this.parseArgs(args); if (parsedArgs.count == 0) { return; } // do nothing MultiRequester.doProcess = true; MultiRequester.requestNames = parsedArgs.names; MultiRequester.requestCount = 0; MultiRequester.echoHash = {}; var siteinfo = parsedArgs.siteinfo; for (let i = 0, len = parsedArgs.count; i < len; i++) { let info = siteinfo[i]; let url = info.url; // see: http://fifnel.com/2008/11/14/1980/ let srcEncode = info.srcEncode || 'UTF-8'; let urlEncode = info.urlEncode || srcEncode; let idxRepStr = url.indexOf('%s'); if (idxRepStr > -1 && !parsedArgs.strs.length) continue; // via. lookupDictionary.js let ttbu = Components.classes['@mozilla.org/intl/texttosuburi;1'] .getService(Components.interfaces.nsITextToSubURI); let cnt = 0; url = url.replace(/%s/g, function(m, i) ttbu.ConvertAndEscape(urlEncode, (cnt < parsedArgs.strs.length ? parsedArgs.strs[cnt++] : parsedArgs.strs[cnt - 1]))); logger.log(url + '[' + srcEncode + '][' + urlEncode + ']::' + info.xpath); if (bang) { liberator.open(url, liberator.NEW_TAB); } else { let req = new libly.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: '', strs: [''], count: 0, siteinfo: [{}]} parseArgs: function(args) { var self = this; var ret = {}; ret.names = ''; ret.strs = []; ret.count = 0; var sel = $U.getSelectedString(); if (args.length < 1 && !sel.length) return ret; function parse(args, names) { args = Array.concat(args); ret.siteinfo = []; ret.names = names || args.shift() || ''; ret.strs = (args.length < 1 ? [sel.replace(/[\n\r]+/g, '')] : args); ret.names.split(',').forEach(function(name) { var site = self.getSite(name); if (site) { ret.count++; ret.siteinfo.push(site); } }); } parse(args); if (!ret.siteinfo.length && this.defaultSites) parse(args, this.defaultSites); 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 url = $U.pathToURL(el[0], res.req.url); var req = new libly.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, ignoreTags; 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; } ignoreTags = ['script'].concat(libly.$U.A(res.req.options.siteinfo.ignoreTags)); doc = document.createElementNS(null, 'div'); res.getHTMLDocument(xpath, null, ignoreTags, function(node, i) { if (node.tagName.toLowerCase() != 'html') doc.appendChild(node); }); if (!doc || !doc.childNodes.length) throw 'XPath result is undefined or null.: XPath -> ' + xpath; $U.getNodesFromXPath('descendant-or-self::a | descendant-or-self::img', doc, function(node) { var tagName = node.tagName.toLowerCase(); if (tagName == 'a') { node.href = $U.pathToURL(node, url, res.doc); } else if (tagName == 'img') { node.src = $U.pathToURL(node, url, res.doc); } }); html = '' + escapedUrl + '' + $U.xmlSerialize(doc); 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: 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566