From 2bc4cc225c6743938746e1536bb81452e0e9e807 Mon Sep 17 00:00:00 2001 From: teramako Date: Sat, 7 Jun 2008 18:56:02 +0000 Subject: vimperator 1.0 以上に対応 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@13434 d0d07461-0603-4401-acd4-de1884942a52 --- splitBrowser.js | 509 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 273 insertions(+), 236 deletions(-) (limited to 'splitBrowser.js') diff --git a/splitBrowser.js b/splitBrowser.js index c361a9d..cb7d502 100644 --- a/splitBrowser.js +++ b/splitBrowser.js @@ -1,261 +1,229 @@ /** - * Vimperator Plugin For "Split Browser" - * For vimperator 0.5.3 - * @author teramako + * ==VimperatorPlugin== + * @name Split Browser for Vimperator + * @author teramako + * @version 1.1a + * @depend "Split Browser" {29c4afe1-db19-4298-8785-fcc94d1d6c1d} + * ==/VimperatorPlugin== + * + * Usage: + * + * ---------------------------- + * Commands + * ---------------------------- + * :sp[lit] [arg1], [arg2], ... [destination] + * split horizontal and open [arg1] + * opens [arg2] ... to background tab, if [arg2] ... is applied + * [destination] is -top, if omitted + * + * :vs[plit] [arg1], [arg2], ... [destination] + * like sp[lit] command + * but [destination] is -right, if omitted + * + * available [destination] + * -l or -left + * -r or -right + * -t or -top + * -b or -bottom + * + * :on[ly] [-g] + * Close all subbrowsers + * or + * Gather all subbrowsers to main browser if `-g' option is applied + * + * -------------------------- + * Mappings + * -------------------------- + * -> focus next browser + * 0 -> focus main browser + * $ -> focus the last opened subbrowser + * -> virtical split + * -> horizontal split + * d -> close tab or subbrowser + * + * s[maps] -> [maps] is some nomral map names + * e.g.) + * sd -> remove current tab + * sgt -> switch focus to the next tab + * sgT -> switch focus to the previous tab */ (function(){ -vimperator.commands.add(new vimperator.Command(['sp[lit]'], - function(args){ - var position = null; - if (args) { - args = args.split(/ -/); - switch (args[args.length-1].toLowerCase()) { - case 'l': - case 'left': position = SplitBrowser.POSITION_LEFT; break; - case 'r': - case 'right': position = SplitBrowser.POSITION_RIGHT; break; - case 't': - case 'top': position = SplitBrowser.POSITION_TOP; break; - case 'bottom': - case 'b': position = SplitBrowser.POSITION_BOTTOM; break; - } - if (position) { - args.pop(); - } - var urls = args.join(' -'); - if (urls){ - urls = vimperator.util.stringToURLArray(urls); - var url = typeof urls[0] == 'string' ? urls[0] : urls[0][0]; - openSubBrowser(url, position); - return; - } - } - vimperator.echo('Split and load current URL.'); - openSubBrowser(vimperator.buffer.URL, position); - },{ - usage: ['sp[lit] [URL] [-POSITION]'], - shortHelp: 'split browser', - help: 'Split browser and load the [URL].
' + - 'If you don\'t specify the [URL] argument, browser loads the current URL.
' + - '
You need to install Split Browser.', - completer: function(filter) vimperator.completion.get_url_completions(filter) - } -)); -vimperator.commands.add(new vimperator.Command(['on[ly]'], - function(){ - if (SplitBrowser.browsers.length > 0) { - SplitBrowser.removeAllSubBrowsers(); // 分割したブラウザをすべて閉じる - // 好みで↑↓選ぼう - // SplitBrowser.gatherSubBrowsers(); // すべての分割したブラウザをタブに集める - } else { - vimperator.echoerr('SubBrowser is none'); - } - },{ - usage: ['on[ly]'], - shortHelp: 'close split browsers', - help: 'Close all split browsers' - } -)); -/** - * Close active browser - */ -vimperator.mappings.add(new vimperator.Map(vimperator.modes.NORMAL, ['sd'], //{{{ - function(){ - var b = SplitBrowser.activeBrowser; - if (b.mTabs.length > 1){ - b.removeTab(b.mCurrentTab); - } else { - if (b === gBrowser){ - vimperator.open('about:blank', vimperator.NEW_BACKGROUND_TAB); - gBrowser.removeTab(gBrowser.mCurrentTab); - } else { - SplitBrowser.activeBrowserCloseWindow(); - } - } - },{ - shortHelp: 'Close active browser' - } -)); //}}} -/** - * Switch browser focus - */ -vimperator.mappings.add(new vimperator.Map(vimperator.modes.NORMAL, [''], //{{{ - function(){ - var browsers = SplitBrowser.browsers; - if (SplitBrowser.activeBrowser === gBrowser) { - SplitBrowser.getSubBrowserById(browsers[0].id).browser.contentWindow.focus(); - } else { - var id = SplitBrowser.activeSubBrowser.id; - for (var i=0; i 1){ - for (var i=1, l=urls.length; i < l; subBrowser.browser.addTab(urls[i++],null,null,null)) - ; - } -} //}}} -/** - * create new subBrowser and load url - * @param {String} url - * @param {Number} aPosition split direction - */ -function openSubBrowser(url, aPosition){ // {{{ - var subBrowser = SplitBrowser.addSubBrowser(url, null, aPosition || SplitBrowser.POSITION_TOP); - subBrowser.addEventListener('load',function(){ - subBrowser.removeEventListener('load',arguments.callee,true); - subBrowser.browser.contentWindow.focus(); - },true); - return subBrowser; +liberator.plugins.splitBrowser = (function(){ + +/* +var origGetBrowser = getBrowser; + +getBrowser = function(){ + return SplitBrowser.activeBrowser; +}; +*/ +function getPositionForOpen(args){ + var p = null; + if (!args || args.length == 0) return p; + for (var i=0; i 0){ + bs[count-1].browser.contentWindow.focus(); + } else if (count < 0){ + bs[length + count].browser.contentWindow.focus(); + } else { + return; + } + } else { + var id = SplitBrowser.activeSubBrowser.id; + for (var i=0; i 0){ + bs[count-1].browser.contentWindow.focus(); + } else if (count < 0){ + bs[length + count].browser.contentWindow.focus(); + } else { + getBrowser().contentWindow.focus(); + } + return true; + } + } + } + } } //}}} +/* ---------------------------------------------- + * Commands + * --------------------------------------------*/ +liberator.commands.addUserCommand(['sp[lit]'], 'split browser', //{{{ + function(args){ liberator.plugins.splitBrowser.openSubBrowser(args, SplitBrowser.POSITION_TOP); }, + { completer: function(filter) liberator.completion.url(filter) } +); //}}} +liberator.commands.addUserCommand(['vs[plit]'], 'split browser', //{{{ + function(args){ liberator.plugins.splitBrowser.openSubBrowser(args, SplitBrowser.POSITION_RIGHT); }, + { completer: function(filter) liberator.completion.url(filter) } +); //}}} +liberator.commands.addUserCommand(['on[ly]'], 'Close or gather all subbrowsers', //{{{ + function(args){ + if (SplitBrowser.browsers.length == 0) { + liberator.echoerr('SubBrowser is none'); + return; + } + if (args == '-g') { + SplitBrowser.gatherSubBrowsers(); + } else { + SplitBrowser.removeAllSubBrowsers(); + } + } +); //}}} + +/* ---------------------------------------------- + * Mappings + * --------------------------------------------*/ +liberator.mappings.addUserMap([liberator.modes.NORMAL],['s'], 'SplitBrowser motion Map', //{{{ + function(key, count){ + gBrowser = SplitBrowser.activeBrowser; + try { + var map = liberator.mappings.get(liberator.modes.NORMAL, key) + map.execute(null, count); + } catch(e) { + liberator.log(e); + } finally { + gBrowser = document.getElementById('content'); + } + },{ + flags: liberator.Mappings.flags.MOTION + liberator.Mappings.flags.COUNT + } +); +//}}} +liberator.mappings.addUserMap([liberator.modes.NORMAL], [''], 'select subbrowser', //{{{ + function(count, key){ + if (/[1-9]/.test(key)){ + focusSwitch(parseInt(key), true); + return; + } + switch (key){ + case '0': + case '$': + focusSwitch(key); + break; + case 'h': //FIXME: How to get subbrowser of relative position ? + case 'j': + case '': + case 'w': + focusSwitch(count > 0 ? count : 1); + break; + case 'k': + case 'l': + case 'W': + forcusSwitch('-' + (count > 0 ? count : 1)); + break; + case 'd': + liberator.plugins.splitBrowser.closeSubBrowser(); + break; + case '': + liberator.plugins.splitBrowser.openSubBrowser(liberator.buffer.URL,SplitBrowser.POSITION_RIGHT); + break; + case '': + liberator.plugins.splitBrowser.openSubBrowser(liberator.buffer.URL,SplitBrowser.POSITION_TOP); + break; + } + },{ flags: liberator.Mappings.flags.COUNT + liberator.Mappings.flags.ARGUMENT } +); //}}} + /** - * Overwrite vimperator.open for SplitBrowser - * @see vimperator.js::vimperaotr.open + * Overwrite liberator.open for SplitBrowser + * @see liberator.js::vimperaotr.open */ -vimperator.open = function(urls, where, callback){ //{{{ - if (typeof urls == 'string') { urls = vimperator.util.stringToURLArray(urls); } - if (urls.length == 0) { return false; } - if (!where) { where = vimperator.CURRENT_TAB; } - +liberator.open = function(urls, where){ //{{{ + if (typeof urls == 'string') urls = liberator.util.stringToURLArray(urls); + if (urls.length == 0) return false; + if (liberator.forceNewTab && liberator.has("tabs")){ + where = liberator.NEW_TAB; + } else if (!where || !liberator.has("tabs")){ + where = liberator.CURRENT_TAB; + } var url = typeof urls[0] == 'string' ? urls[0] : urls[0][0]; var postdata = typeof urls[0] == 'string' ? null : urls[0][1]; var whichwindow = window; var activeBrowser = SplitBrowser.activeBrowser; switch (where) { - case vimperator.CURRENT_TAB: - activeBrowser.loadURI(url, null, postdata); + case liberator.CURRENT_TAB: + activeBrowser.loadURIWithFlags(url, null, null, null, postdata); break; - case vimperator.NEW_TAB: + case liberator.NEW_TAB: var firsttab = activeBrowser.addTab(url, null, null, postdata); activeBrowser.selectedTab = firsttab; break; - case vimperator.NEW_BACKGROUND_TAB: + case liberator.NEW_BACKGROUND_TAB: activeBrowser.addTab(url, null, null, postdata); break; - case vimperator.NEW_WINDOW: + case liberator.NEW_WINDOW: window.open(); var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); @@ -263,15 +231,84 @@ vimperator.open = function(urls, where, callback){ //{{{ whichwindow.loadURI(url, null, postdata); break; default: - vimperator.echoerr("Exxx: Invalid 'where' directive in vimperator.open(...)"); + liberator.echoerr("Exxx: Invalid 'where' directive in liberator.open(...)"); return false; } + if (!liberator.has("tabs")) return true; + for (var i=1, l=urls.length; i < l; i++){ url = typeof urls[i] == 'string' ? urls[i] : urls[i][0]; postdata = typeof urls[i] == 'string' ? null : urls[i][1]; whichwindow.SplitBrowser.activeBrowser.addTab(url, null, null, postdata); } + return true; }; //}}} + +var manager = { + splitBrowserId: SplitBrowserAppID, + args: [ [['-l','-left'], liberator.commands.OPTION_NOARG], + [['-r','-right'], liberator.commands.OPTION_NOARG], + [['-t','-top'], liberator.commands.OPTION_NOARG], + [['-b','-bottom'], liberator.commands.OPTION_NOARG] ], + get gBrowser(){ + return origGetBrowser(); + }, + /** + * create new subBrowser and load url + * @param {String} args command aruguments + * @param {Number} defPosition default split direction + */ + openSubBrowser: function(args, defPosition){ + var url; + var urls = []; + var position = defPosition || SplitBrowser.POSITION_TOP; + if (args){ + var res = liberator.commands.parseArgs(args, this.args); + position = getPositionForOpen(res.opts) || position; + if (res.args.length > 0){ + liberator.log(res.args); + urls = liberator.util.stringToURLArray(res.args.join(' ')); + liberator.log(urls); + if (urls.length == 0) { + url = liberator.buffer.URL; + } else { + url = urls[0]; + urls.shift(); + } + } else { + url = liberator.buffer.URL; + } + } else { + url = liberator.buffer.URL; + } + var subBrowser = SplitBrowser.addSubBrowser(url, null, position); + subBrowser.addEventListener('load',function(){ + subBrowser.removeEventListener('load',arguments.callee,true); + subBrowser.browser.contentWindow.focus(); + },true); + urls.forEach(function(url){ + subBrowser.browser.addTab(url, null, null, null); + }); + return subBrowser; + }, + closeSubBrowser: function(){ + var b = SplitBrowser.activeBrowser; + if (b.mTabs.length > 1){ + b.removeTab(b.mCurrentTab); + } else { + if (b === getBrowser()){ + liberator.open('about:blank', liberator.NEW_BACKGROUND_TAB); + getBrowser().removeTab(gBrowser.mCurrentTab); + } else { + SplitBrowser.activeBrowserCloseWindow(); + } + } + } +}; +return manager; +})(); + + })(); // vim: set fdm=marker sw=4 ts=4 et: -- cgit v1.2.3