var PLUGIN_INFO = {NAME} enable to copy strings from a template (like CopyURL+) テンプレートから文字列のコピーを可能にします(CopyURL+みたいなもの) 1.1 2.0pre http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/copy.js teramako MPL 1.1/GPL 2.0/LGPL 2.1 0.5 || javascript <%TITLE%' }, { label: 'selanchor', value: '%SEL%' }, { label: 'htmlblockquote', value: '
%HTMLSEL%
' } { label: 'ASIN', value: 'copy ASIN code from Amazon', custom: function(){return content.document.getElementById('ASIN').value;} }, ]; EOM ||< label: template name which is command argument value: copy string the certain string is replace to ... map: key map (optional) custom: {function} or {Array} (optional) {function}: execute the function and copy return value, if specified. {Array}: replaced to the {value} by normal way at first. then replace words matched {Array}[0] in the replaced string to {Array}[1]. {Array}[0]: String or RegExp {Array}[1]: String or Function see http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:String:replace ]]>
; liberator.plugins.exCopy = (function(){ if (!liberator.globalVariables.copy_templates){ liberator.globalVariables.copy_templates = [ { label: 'titleAndURL', value: '%TITLE%\n%URL%' }, { label: 'title', value: '%TITLE%' }, { label: 'anchor', value: '%TITLE%' }, { label: 'selanchor', value: '%SEL%' }, { label: 'htmlblockquote', value: '
%HTMLSEL%
' } ]; } liberator.globalVariables.copy_templates.forEach(function(template){ if (typeof template.map == 'string') addUserMap(template.label, [template.map]); else if (template.map instanceof Array) addUserMap(template.label, template.map); }); // used when argument is none //const defaultValue = templates[0].label; commands.addUserCommand(['copy'],'Copy to clipboard', function(args){ liberator.plugins.exCopy.copy(args.string, args.bang); },{ completer: function(context, args){ if (args.bang){ completion.javascript(context); return; } context.title = ['Template','Value']; var templates = liberator.globalVariables.copy_templates.map(function(template) [template.label, liberator.modules.util.escapeString(template.value, '"')] ); if (!context.filter){ context.completions = templates; return; } var candidates = []; var filter = context.filter.toLowerCase(); context.completions = templates.filter(function(template) template[0].toLowerCase().indexOf(filter) == 0); }, bang: true } ); function addUserMap(label, map){ mappings.addUserMap([modes.NORMAL,modes.VISUAL], map, label, function(){ liberator.plugins.exCopy.copy(label); }, { rhs: label } ); } function getCopyTemplate(label){ var ret = null; liberator.globalVariables.copy_templates.some(function(template) template.label == label ? (ret = template) && true : false); return ret; } function replaceVariable(str){ if (!str) return ''; var win = new XPCNativeWrapper(window.content.window); var sel = '',htmlsel = ''; var selection = win.getSelection(); function replacer(value){ //{{{ switch(value){ case '%TITLE%': return buffer.title; case '%URL%': return buffer.URL; case '%SEL%': if (sel) return sel; else if (selection.rangeCount < 1) return ''; for (var i=0, c=selection.rangeCount; i146 147
/**
 * ==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: