/** * ==VimperatorPlugin== * @name Ubiquity Glue * @description Vimperator-plugin for Ubiquity * @depend Ubiquity (ubiquity@labs.mozilla.com) * @version 0.1.1a * ==/VimperatorPlugin== * * USAGE: * * :ubi[quity] {ubiquityCommand} * {ubiquityCommand}をUbiquityに渡して実行 * * :ubi[quity] * ランチャを起動 * * - ランチャ起動キーでコマンドラインに":ubiquity "がでます(ランチャはポップアップしない) * 気に入らない場合は、XXX:の辺りのコードをコメントアウトしてください * - Ubiquityコマンド名の補完が効きます。 * - Ubiquityコマンド入力後、引数を入力してのタブ補完をするとUbiquityのプレビューがでる(はず) * * FIXME: * - プレビュー時の選択範囲の取得がイマイチ出来てない * - プレビュー後の操作はマウス必須になってしまう(これはどうしようもない?) * */ liberator.plugins.ubiquity = (function(){ var ubiquityID = 'ubiquity@labs.mozilla.com'; if (!Application.extensions.has(ubiquityID) || !Application.extensions.get(ubiquityID).enabled){ Components.utils.reportError('Vimperator: UbiquityGlue: Ubiquity is not installed'); return null; } function preExec(target, name, func){ var original = target[name]; target[name] = function(){ var result = func.apply(this, arguments); var tmp = null; if (result != false) tmp = original.apply(target, arguments); return tmp; }; } preExec(events, 'onEscape', function(){ if (ubiquityManager.panel.state == 'open') gUbiquity.closeWindow(); }); var focusedWindow = null; var focusedElement = null; preExec(commandline, 'open', function(){ focusedWindow = document.commandDispatcher.focusedWindow; focusedElement = document.commandDispatcher.focusedElement; }); // XXX:選択範囲が必要な操作が現状上手く動かない.不便であればコメントアウトしてください. preExec(gUbiquity, 'openWindow', function(anchor, flag){ if(!flag) { commandline.open(':', 'ubiquity ', modes.EX); return false; } }); // ------------------------------------------------- // Command // ------------------------------------------------- commands.addUserCommand(['ubi[quity]'], 'Vimperator Ubiquity Glue', function(args){ if (!args){ gUbiquity.openWindow(getBrowser(), true); return; } ubiquityManager.execute(args); }, { completer: function(context, arg, special){ ubiquityManager.completer(context, arg.string) } }, true ); // ------------------------------------------------- // Public Section // ------------------------------------------------- var ubiquityManager = { get panel(){ return gUbiquity.__msgPanel; }, get cmdManager(){ return gUbiquity.__cmdManager; }, get nlParser(){ return this.cmdManager.__nlParser; }, get commands(){ return this.cmdManager.__cmdSource.getAllCommands(); }, execute: function(cmds){ var context = this.getContext(); this.nlParser.updateSuggestionList(cmds, context); if (this.nlParser.getNumSuggestions() == 0){ liberator.echoerr('No such command'); return false; } var parsedSentence = this.nlParser.getSentence(0); try { parsedSentence.execute(context); } catch (e) { liberator.echoerr(e); } }, completer: function(context, args){ var matches = args.match(/(\S+)(?:\s+(.+)$)?/); var suggestions = []; for (let cmd in this.commands){ suggestions.push([cmd, this.commands[cmd].description]); } context.title = ['Command','Description']; if (!matches){ context.completions = suggestions; return; } var [cmd, arg] = [matches[1], matches[2]]; if (arg || (cmd && cmd in this.commands) ){ if ( (cmd in this.commands) && this.commands[cmd].preview){ this.getContext(); gUbiquity.__textBox.value = args; if (this.panel.state == 'closed') { gUbiquity.openWindow(getBrowser(), true); } gUbiquity.__updatePreview(); } } else if (cmd){ context.completions = suggestions.filter(function(command){return command[0].indexOf(cmd) == 0;}); return; } return [0, []]; }, getContext: function(){ gUbiquity.__focusedWindow = focusedWindow; gUbiquity.__focusedElement = focusedElement; return gUbiquity.__makeContext(); } }; return ubiquityManager; })(); // vim:ts=4 sw=4 et: '#n37'>37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
/**
 * ==VimperatorPlugin==
 * @name           incuri.js
 * @description    increment the number in the URI
 * @description-ja URIに含まれる数字をインクリメント
 * @author         hogelog
 * @version        0.03
 * ==/VimperatorPlugin==
 *
 * COMMANDS:
 *  :decdomain   -> Decrement the number in the domain name
 *  :decfragment -> Decrement the number in the fragment ID
 *  :decpath     -> Decrement the number in the path name
 *  :decport     -> Decrement the number in the port number
 *  :decquery    -> Decrement the number in the query string
 *  :decuri      -> Decrement the number in the URI
 *  :incdomain   -> Increment the number in the domain name
 *  :incfragment -> Increment the number in the fragment ID
 *  :incpath     -> Increment the number in the path name
 *  :incport     -> Increment the number in the port number
 *  :incquery    -> Increment the number in the query string
 *  :incuri      -> Increment the number in the URI
 *
 */

(function() {
    var numreg = /^(.*\D|)(\d+)(\D*)$/;
    function numstr(num, len) {
        var str = String(num);
        while(str.length<len) {
            str = "0" + str;
        }
        return str;
    }
    function makeinc(f, p)
        function(args) {
            var l = window.content.location;
            var part = l[p];
            if(p == "port" && part == "") {
                part = ({
                    "ftp:" : "21", "http:" : "80", "https:" : "443"
                })[l.protocol] || part;
            }
            if(numreg.test(part)) {
                arg = args[0];
                let num = RegExp.$2;
                let quantity = !arg || isNaN(arg) ? 1 : parseInt(arg);
                let nextnum = numstr(f(parseInt(num, 10), quantity), num.length);
                let newpart = RegExp.$1 + nextnum + RegExp.$3;
                if(p == "href") {
                    window.content.location.href = newpart;
                } else {
                    window.content.location.href = [
                        "protocol", "//", "hostname", ":", "port", "pathname",
                        "search", "hash"
                    ].map(function(part) part.length > 2 ? p == part ? newpart
                                                                     : l[part]
                                                         : part)
                     .join("");
                }
            } else {
                liberator.echoerr("Cannot find a number in the " +
                                  p + " <" + part + ">");
            }
        };
    [
        ["uri",      "href",     "URI"],
        ["path",     "pathname", "path name"],
        ["query",    "search",   "query string"],
        ["fragment", "hash",     "fragment ID"],
        ["port",     "port",     "port number"],
        ["domain",   "hostname", "domain name"]
    ].forEach(function(part) {
        var [suffix, prop, name] = part;
        [
            ["In", 1], ["De", -1]
        ].forEach(function(direction) {
            var [prefix, dir] = direction;
            commands
                     .add([prefix.toLowerCase() + "c" + suffix],
                          prefix + "crement the number in the " + name + ".",
                          makeinc(function(x, q) x + dir * q, prop),
                          { argCount : "?" });
        });
    });
})();
// vim: set sw=4 ts=4 sts=4 et: