aboutsummaryrefslogtreecommitdiffstats
path: root/multi_requester.js
AgeCommit message (Collapse)Author
2010-04-15vesion 更新しようね!anekos
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@37212 d0d07461-0603-4401-acd4-de1884942a52
2010-04-12fix changed alc's xpathteramako
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@37195 d0d07461-0603-4401-acd4-de1884942a52
2009-06-14delete executablesuVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@33973 d0d07461-0603-4401-acd4-de1884942a52
2009-04-15クォート(")を使用しない複数ワードの検索に対応anekos
':mr alc "cat ear"' == ':mr alc cat ear' git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@32441 d0d07461-0603-4401-acd4-de1884942a52
2009-04-15検索語の箇所でも補完が起動するのを修正anekos
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@32440 d0d07461-0603-4401-acd4-de1884942a52
2009-04-04multi_requester ver.0.4.13 goo辞書が utf8 になった?suVene
とりあえず、source 内の SITEINFO を削除。 wedata から取得するように変更。 ついでに、vimp 2.1a1pre での動作確認。 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@31891 d0d07461-0603-4401-acd4-de1884942a52
2009-01-18* 変なもんがくっついてた![28624]suVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@28625 d0d07461-0603-4401-acd4-de1884942a52
2009-01-18* complete の補完順を選択できるように変更(default date desc)suVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@28624 d0d07461-0603-4401-acd4-de1884942a52
2009-01-18インデント下げました.suVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@28619 d0d07461-0603-4401-acd4-de1884942a52
2009-01-06* XPath の結果判定 miss.suVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@28014 d0d07461-0603-4401-acd4-de1884942a52
2008-12-28複数 %s に対応。suVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@27521 d0d07461-0603-4401-acd4-de1884942a52
2008-12-26wedata local cache.suVene
etc. git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@27459 d0d07461-0603-4401-acd4-de1884942a52
2008-12-26wedata local cache.suVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@27456 d0d07461-0603-4401-acd4-de1884942a52
2008-12-25デフォルトのサイト設定を追加anekos
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@27408 d0d07461-0603-4401-acd4-de1884942a52
2008-12-22licensesuVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@27241 d0d07461-0603-4401-acd4-de1884942a52
2008-12-20add <updateURL> for pluginManager.js [27131]suVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@27132 d0d07461-0603-4401-acd4-de1884942a52
2008-12-19* get absolute path of <a>, <img>.suVene
* mod $U.pathToURL git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@27108 d0d07461-0603-4401-acd4-de1884942a52
2008-12-17 * Libraries.drry
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26980 d0d07461-0603-4401-acd4-de1884942a52
2008-12-17* follow PluginManager(pre)suVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26947 d0d07461-0603-4401-acd4-de1884942a52
2008-12-17:%s/&lt;/</ganekos
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26941 d0d07461-0603-4401-acd4-de1884942a52
2008-12-13 * fixed the CSS.drry
* et cetera. git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26607 d0d07461-0603-4401-acd4-de1884942a52
2008-12-09* _libly.js ver.0.1.4にあわせた修正 [26222]suVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26225 d0d07461-0603-4401-acd4-de1884942a52
2008-12-09 * [26161].drry
* そして小文字化の前に除去する。 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26162 d0d07461-0603-4401-acd4-de1884942a52
2008-12-08*PLUGIN_INFO対応(@see ↵suVene
http://coderepos.org/share/browser/lang/javascript/vimperator-plugins/trunk/pluginManager.js) git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26143 d0d07461-0603-4401-acd4-de1884942a52
2008-12-07*libty.js bug fix.suVene
*それに伴うmulti_requester.jsの修正 *subject_test.js rename to subject_hatelabo_bottle.js(途中) *etc. git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26085 d0d07461-0603-4401-acd4-de1884942a52
2008-12-06library is moved to a libly.jssuVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26020 d0d07461-0603-4401-acd4-de1884942a52
2008-12-02 * ↵drry
正規表現を修正しました。仕様では「`--`」禁止ですが、お好みの方をお選びください。 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@25723 d0d07461-0603-4401-acd4-de1884942a52
2008-12-02*SITEINFOと共にkeymap指定suVene
*複数リクエスト時定義順に出力 *property名変更とか。 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@25714 d0d07461-0603-4401-acd4-de1884942a52
2008-12-01 * fixed a regex.drry
* fixed a missing `var` for `extractLink`. * et cetera. git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@25647 d0d07461-0603-4401-acd4-de1884942a52
2008-12-011度目のレスポンスから次のリクエストを取り出す仕組みsuVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@25643 d0d07461-0603-4401-acd4-de1884942a52
2008-11-30*複数リクエスト時のechoが2.0preでうまく出力できないの ↵suVene
bufferして1度で出力。 *XPathがうまく取れないことがあるので、DocumentFragmentを通すのをやめ。 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@25491 d0d07461-0603-4401-acd4-de1884942a52
2008-11-30XPathのcontextNodeとして利用するにはDocumentFragment.firstChildを ↵suVene
returnすればよい?たぶん。うまくいってるし。ex.)wedata-multi-requester git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@25485 d0d07461-0603-4401-acd4-de1884942a52
2008-11-29bugfix: fail parsing DOM when DOCTYPE is not setjanus_wel
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@25338 d0d07461-0603-4401-acd4-de1884942a52
2008-11-28*引数のサイトをカンマ区切りで同時に指定できるように ↵suVene
対応 ex.) :mr alc,goo ANY_TEXT → 英辞朗とgoo辞書を同時に検索 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@25308 d0d07461-0603-4401-acd4-de1884942a52
2008-11-26url に %s がない場合は引数なしで実行可能にsuVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@25005 d0d07461-0603-4401-acd4-de1884942a52
2008-11-26Follow CVS Headanekos
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@24966 d0d07461-0603-4401-acd4-de1884942a52
2008-11-23follow the new completer.anekos
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@24676 d0d07461-0603-4401-acd4-de1884942a52
2008-11-19for 2.0preanekos
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@24377 d0d07461-0603-4401-acd4-de1884942a52
2008-11-19modify siteinfo attribute 'resultXPath' to 'xpath'suVene
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@24371 d0d07461-0603-4401-acd4-de1884942a52
2008-11-192.0pre 対応anekos
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@24361 d0d07461-0603-4401-acd4-de1884942a52
lti_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 <<EOM liberator.globalVariables.multi_requester_siteinfo = [ { map: ',me', // optional: keymap for this siteinfo call bang: true, // optional: args: 'any' // optional: name: 'ex', // required: subcommand name description: 'example', // required: commandline short help url: 'http://example.com/?%s', // required: %s <-- replace string xpath: '//*', // optional: default all srcEncode: 'SHIFT_JIS', // optional: default UTF-8 urlEncode: 'SHIFT_JIS', // optional: default srcEncode ignoreTags: 'img', // optional: default script, syntax 'tag1,tag2,……' extractLink: '//xpath' // optional: extract permalink }, ]; EOM ||< === other siteinfo by wedata. === @see http://wedata.net/databases/Multi%20Requester/items === Mappings === e.g.) >|| javascript <<EOM liberator.globalVariables.multi_requester_mappings = [ [',ml', 'ex'], // == :mr ex [',mg', 'goo', '!'], // == :mr! goo [',ma', 'alc', , 'args'], // == :mr alc args ]; EOM ||< === Other Options === >|| let g:multi_requester_use_wedata = "false" // true by default ||< ]]></detail> </VimperatorPlugin>; //}}} (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) 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 = '<a href="' + escapedUrl + '" class="hl-Title" target="_self">' + escapedUrl + '</a>' + $U.xmlSerialize(doc); MultiRequester.echoHash[res.req.options.siteinfo.name] = html; } catch (e) { logger.log('error!!: ' + e); MultiRequester.echoHash[res.req.options.siteinfo.name] = '<span style="color: red;">error!!: ' + e + '</span>'; } if (MultiRequester.requestCount == 0) { let echoList = []; MultiRequester.requestNames.split(',').forEach(function(name) { echoList.push(MultiRequester.echoHash[name]); }); html = '<div style="white-space:normal;"><base href="' + escapedUrl + '"/>' + echoList.join('') + '</div>'; 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: