diff options
author | teramako | 2008-06-20 17:48:03 +0000 |
---|---|---|
committer | teramako | 2008-06-20 17:48:03 +0000 |
commit | 5f4a91f21955ca69f5107dc6d1726b51c3b7c542 (patch) | |
tree | 0a059f21fa1008ef87e8a178a289111865133795 | |
parent | 79c6d7ca22c1b85897f78db0171836ff999f896e (diff) | |
download | vimperator-plugins-5f4a91f21955ca69f5107dc6d1726b51c3b7c542.tar.bz2 |
custom function のサポート
mapのサポート
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@14325 d0d07461-0603-4401-acd4-de1884942a52
-rw-r--r-- | copy.js | 139 |
1 files changed, 92 insertions, 47 deletions
@@ -3,9 +3,9 @@ * @name copy.js * @description enable to copy strings from a template (like CopyURL+) * @description-ja テンプレートから文字列のコピーを可能にします(CopyURL+みたなもの) - * @minVersion 0.6pre + * @minVersion 1.1 * @author teramako teramako@gmail.com - * @version 0.3 + * @version 0.5a * ==/VimperatorPlugin== * * Usage: @@ -19,19 +19,27 @@ * * If non-argument, used `default' * - * Change the value by `set' command. (only the current session) - * :set copy_{label}=.... - * or - * :set {label}=... - * * label: template name which is command argument - * copy: copy string + * value: copy string * the certian string is replace to ... * %TITTLE% -> to the title of the current page * %URL% -> to the URL of the current page * %SEL% -> to the string of selection * %HTMLSEL% -> to the html string of selection * + * 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. + * and replace words matched {Array}[0] in the replaced string to {Array}[1]. + * {Array}[0] is string or regexp + * {Array}[1] is string or function + * see http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:String:replace + * * The copy_templates is a string variable which can set on * vimperatorrc as following. * @@ -42,14 +50,15 @@ * javascript <<EOM * liberator.globalVariables.copy_templates = [ * { label: 'titleAndURL', value: '%TITLE%\n%URL%' }, - * { label: 'title', value: '%TITLE%' }, + * { label: 'title', value: '%TITLE%', map: ',y' }, * { label: 'anchor', value: '<a href="%URL%">%TITLE%</a>' }, * { label: 'selanchor', value: '<a href="%URL%" title="%TITLE%">%SEL%</a>' }, * { label: 'htmlblockquote', value: '<blockquote cite="%URL%" title="%TITLE%">%HTMLSEL%</blockquote>' } + * { label: 'ASIN', value: 'copy ASIN code from Amazon', custom: function() content.document.getElementById('ASIN').value}, * ]; * EOM */ -(function(){ +liberator.plugins.exCopy = (function(){ if (!liberator.globalVariables.copy_templates){ liberator.globalVariables.copy_templates = [ { label: 'titleAndURL', value: '%TITLE%\n%URL%' }, @@ -59,45 +68,19 @@ if (!liberator.globalVariables.copy_templates){ { label: 'htmlblockquote', value: '<blockquote cite="%URL%" title="%TITLE%">%HTMLSEL%</blockquote>' } ]; } + +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; liberator.commands.addUserCommand(['copy'],'Copy to clipboard', function(arg, special){ - var copyString = ''; - var isError = false; - if (special && arg){ - try { - copyString = window.eval('with(liberator){' + arg + '}'); - switch (typeof copyString){ - case 'object': - copyString = copyString === null ? 'null' : copyString.toSource(); - break; - case 'function': - copyString = copyString.toString(); - break; - case 'number': - case 'boolean': - copyString = '' + copyString; - break; - case 'undefined': - copyString = 'undefined'; - break; - } - } catch (e){ - isError = true; - copyString = e.toString(); - } - } else { - if (!arg){ arg = liberator.globalVariables.copy_templates[0].label; } - var str = getCopyTemplate(arg) || arg; - copyString = replaceVariable(str); - } - liberator.util.copyToClipboard(copyString); - if (isError){ - liberator.echoerr('CopiedErrorString: `' + copyString + "'"); - } else { - liberator.echo('CopiedString: `' + liberator.util.escapeHTML(copyString) + "'"); - } + liberator.plugins.exCopy.copy(arg, special); },{ completer: function(filter, special){ if (special){ @@ -117,14 +100,20 @@ liberator.commands.addUserCommand(['copy'],'Copy to clipboard', } } ); + +function addUserMap(label, map){ + liberator.mappings.addUserMap([liberator.modes.NORMAL,liberator.modes.VISUAL], map, + label, function(){ liberator.plugins.exCopy.copy(label); } + ); +} function getCopyTemplate(label){ var ret = null; liberator.globalVariables.copy_templates.some(function(template) - template.label == label ? (ret = template.value) && true : false); + template.label == label ? (ret = template) && true : false); return ret; } function replaceVariable(str){ - if (!str) return; + if (!str) return ''; var win = new XPCNativeWrapper(window.content.window); var sel = '',htmlsel = ''; if (str.indexOf('%SEL%') >= 0 || str.indexOf('%HTMLSEL%') >= 0){ @@ -140,6 +129,62 @@ function replaceVariable(str){ .replace(/%HTMLSEL%/g,htmlsel); } +var exCopyManager = { + add: function(label, value, custom, map){ + var template = {label: label, value: value, custom: custom, map: map}; + liberator.globalVariables.copy_templates.unshift(template); + if (map) addUserMap(label, map); + + return template; + }, + get: function(label){ + return getCopyTemplate(label); + }, + copy: function(arg, special){ + var copyString = ''; + var isError = false; + if (special && arg){ + try { + copyString = window.eval('with(liberator){' + arg + '}'); + switch (typeof copyString){ + case 'object': + copyString = copyString === null ? 'null' : copyString.toSource(); + break; + case 'function': + copyString = copyString.toString(); + break; + case 'number': + case 'boolean': + copyString = '' + copyString; + break; + case 'undefined': + copyString = 'undefined'; + break; + } + } catch (e){ + isError = true; + copyString = e.toString(); + } + } else { + if (!arg) arg = liberator.globalVariables.copy_templates[0]; + var template = getCopyTemplate(arg) || arg; + if (typeof template.custom == 'function'){ + copyString = template.custom.call(this, template.value); + } else if (template.custom instanceof Array){ + copyString = replaceVariable(template.value).replace(tempalte.custom[0], template.custom[1]); + } else { + copyString = replaceVariable(template.value); + } + } + liberator.util.copyToClipboard(copyString); + if (isError){ + liberator.echoerr('CopiedErrorString: `' + copyString + "'"); + } else { + liberator.echo('CopiedString: `' + liberator.util.escapeHTML(copyString) + "'"); + } + } +}; +return exCopyManager; })(); // vim: set fdm=marker sw=4 ts=4 et: |