diff options
author | anekos | 2010-03-09 14:31:20 +0000 |
---|---|---|
committer | anekos | 2010-03-09 14:31:20 +0000 |
commit | f087f3d759aab5a7ce40da89147dd192e8f52ff8 (patch) | |
tree | 5e0f0ae34e8f9a22cf727dc5ce3bda9a45e77da9 | |
parent | b5cf7dc45de12673060a99f3ecb9da472a8e6fc6 (diff) | |
download | vimperator-plugins-f087f3d759aab5a7ce40da89147dd192e8f52ff8.tar.bz2 |
おぷーな
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@36976 d0d07461-0603-4401-acd4-de1884942a52
-rwxr-xr-x | opener-ex.js | 137 | ||||
-rwxr-xr-x | opener.js | 116 |
2 files changed, 253 insertions, 0 deletions
diff --git a/opener-ex.js b/opener-ex.js new file mode 100755 index 0000000..60feaf1 --- /dev/null +++ b/opener-ex.js @@ -0,0 +1,137 @@ +/** + * Vimperator-Plugin + * @see http://vimperator.g.hatena.ne.jp/voidy21/20100119/1263907211 + * @see http://vimperator.g.hatena.ne.jp/nokturnalmortum/20100120/1263927707 + * @see http://vimperator.g.hatena.ne.jp/teramako/20100221/1266774716 + * @require _libly.js + */ + +let U = liberator.plugins.libly.$U; + +/** + * create a function for replacing + * tabbrowser.addTab or browser.loadURIWithFlags method + * to the function. + * @param {Boolean} isAddTab either for tabbrowser.addTab or not + * @return {Function} + */ +function createAround(isAddTab){ + /** + * replaced function + * @param {Function} wrappedOriginalFunction + * @param {arguments} args the arguments for original function + */ + return function openerAround(wrappedOriginalFunction, args){ + let url = args[0], uri; + try { + uri = getRedirectedURL(util.createURI(url)); + args[0] = uri.spec; + } catch(e){ + liberator.echoerr(e); + } + if (!(uri && jump(uri))){ + if (isAddTab){ + let tab = wrappedOriginalFunction(); + if (!("_around" in tab)) + tab.linkedBrowser._around = U.around(tab.linkedBrowser, + "loadURIWithFlags", + createAround(false)); + return tab; + } + return wrappedOriginalFunction(); + } + return tabs.getTab(); + }; +} + +/** + * @param {String} msg + */ +function echomsg(msg){ + liberator.echomsg(NAME + ": " + msg, 2); +} + +/** + * if already the aURI is opened in the tabs, + * selected the tab and return true + * or else + * return false + * @param {nsIURI} aURI + * @param {Boolean} + */ +function jump(aURI){ + if (aURI.schemeIs("about")) + return false; + for (let [i, browser] in tabs.browsers){ + if (browser.currentURI.equals(aURI)){ + echomsg("jumping to " + i + ": " + aURI.spec); + tabs.select(i); + return true; + } + } + return false; +} + +/** + * if aURI is "URL Shortener" host, + * returns true or else returns false + * @param {nsIURI} aURI + * @return {Boolean} + */ +function isShortenURLHost(aURI){ + switch(aURI.host){ + case "bit.ly": + case "j.mp": + case "goo.gl": + case "ff.im": + case "ow.ly": + case "tinyurl.com": + case "tumblr.com": + return true; + default: + return false; + } +} +/** + * @param {nsIURI} aURI + * @return {nsIURI} either a redirected URI or an URI of the arugments + */ +function getRedirectedURL(aURI){ + if ((aURI.schemeIs("http") || aURI.schemeIs("https")) && isShortenURLHost(aURI)){ + let x = new XMLHttpRequest; + x.open("HEAD", aURI.spec, false); + x.send(null); + echomsg(aURI.spec + " -> " + x.channel.URI.spec); + return x.channel.URI; + } + return aURI; +} + +function init(){ + onUnload(); + let tabbrowser = getBrowser(); + tabbrowser._around = U.around(tabbrowser, "addTab", createAround(true)); + for (let [,browser] in tabs.browsers){ + browser._around = U.around(browser, "loadURIWithFlags", createAround(false)); + } +} +init(); + +/** + * called before the script is reloaded + */ +function onUnload(){ + let tabbrowser = getBrowser(); + if ("_around" in tabbrowser){ + tabbrowser._around.restore(); + delete tabbrowser_around + } + for (let [,browser] in tabs.browsers){ + if ("_around" in browser){ + browser._around.restore(); + delete browser_around + } + } +} + +// vim: sw=2 ts=2 et:
\ No newline at end of file diff --git a/opener.js b/opener.js new file mode 100755 index 0000000..6584c1f --- /dev/null +++ b/opener.js @@ -0,0 +1,116 @@ +// PLUGIN_INFO {{{ +let PLUGIN_INFO = +<VimperatorPlugin> + <name>opener</name> + <name lang="ja">opener</name> + <description> --- </description> + <description lang="ja">URL 移動時にそのURLが既に開かれていたら、そのタブに移動する</description> + <version>1.0.0</version> + <author homepage="http://vimperator.g.hatena.ne.jp/voidy21/">voidy21</author> + <author mail="anekos@snca.net" homepage="http://d.hatena.ne.jp/nokturnalmortum/">anekos</author> + <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/opener.js</updateURL> + <minVersion>2.3</minVersion> + <maxVersion>2.3</maxVersion> + <detail><![CDATA[ + URL 移動時にそのURLが既に開かれていたら、そのタブに移動する + ]]></detail> + <detail lang="ja"><![CDATA[ + URL 移動時にそのURLが既に開かれていたら、そのタブに移動する + ]]></detail> +</VimperatorPlugin>; +// }}} +// INFO {{{ +let INFO = +<> + <plugin name="opener" version="1.0.0" + href="http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/opener.js" + summary="URL 移動時にそのURLが既に開かれていたら、そのタブに移動する" + xmlns="http://vimperator.org/namespaces/liberator"> + <author>voidy21</author> + <author email="anekos@snca.net">anekos</author> + <project name="Vimperator" minVersion="2.3"/> + <p>URL 移動時にそのURLが既に開かれていたら、そのタブに移動する</p> + </plugin> +</>; +// }}} + +/* + * Original version by voidy21: + * http://vimperator.g.hatena.ne.jp/voidy21/20100119/1263907211 + * http://vimperator.g.hatena.ne.jp/voidy21/20100127/1264542669 + */ + +(function () { + let U = liberator.plugins.libly.$U; + + function jump (url) { + let index = 0; + let url = util.stringToURLArray(url).toString(); + for each ( [,tab] in tabs.browsers ) { + if(url == tab.currentURI.spec){ + tabs.select(index); + return true; + } + ++index; + } + return false; + } + + "open tabopen edit".split(/\s/).forEach( + function (name) { + let command = commands.get(name); + if (!command) + return; + U.around( + command, + "action", + function (next, args) { + let url = args[0].string; + if (!(url && jump(url))) + return next(); + } + ); + } + ); + + //buffer.followLink()を変更 + //hint-a-hint時[f,F]に対象のタブが既に開いてあったらjump + let (ignore = false) { + let ignoreBlock = function (block) { + ignore = true; + let result = block(); + ignore = false; + return result; + }; + + U.around( + buffer, + "followLink", + function (next, args) { + return ignoreBlock(function () { + let [elem,] = args; + let url = elem.href; + if (!(url && jump(url))){ + liberator.echo("Now Loading... " + url); + return next(); + } + }); + } + ); + + document.addEventListener( + 'click', + function (event) { + if (ignore) + return; + let e = event.target; + if (e && e.tagName.match(/^a$/i) && e.href && jump(e.href)) { + event.preventDefault(); + event.stopPropagation(); + } + }, + true + ); + } + +})(); |