aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--copy.js91
1 files changed, 59 insertions, 32 deletions
diff --git a/copy.js b/copy.js
index e4d1910..da5693d 100644
--- a/copy.js
+++ b/copy.js
@@ -3,12 +3,12 @@ var PLUGIN_INFO =
<name>{NAME}</name>
<description>enable to copy strings from a template (like CopyURL+)</description>
<description lang="ja">テンプレートから文字列のコピーを可能にします(CopyURL+みたいなもの)</description>
-<minVersion>2.0</minVersion>
+<minVersion>2.0pre</minVersion>
<maxVersion>2.0pre</maxVersion>
<updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/copy.js</updateURL>
<author mail="teramako@gmail.com" homepage="http://vimperator.g.hatena.ne.jp/teramako/">teramako</author>
<license>MPL 1.1/GPL 2.0/LGPL 2.1</license>
-<version>0.6</version>
+<version>0.7</version>
<detail><![CDATA[
== Command ==
:copy {copyString}:
@@ -33,6 +33,20 @@ var PLUGIN_INFO =
to the string of selection
%HTMLSEL%:
to the html string of selection
+%HOSTNAME%:
+ to the hostname of the current location
+%PATHNAME%:
+ to the pathname of the current location
+%HOST%:
+ to the host of the current location
+%PORT%:
+ to the port of the current location
+%PROTOCOL%:
+ to the protocol of the current location
+%SEARCH%:
+ to the search(?..) of the current location
+%HASH%:
+ to the hash(anchor #..) of the current location
== How to create template ==
you can set your own template using inline JavaScript.
@@ -113,6 +127,37 @@ copy_templates.forEach(function(template){
addUserMap(template.label, template.map);
});
+const REPLACE_TABLE = {
+ get TITLE () buffer.title,
+ get URL () buffer.URL,
+ get SEL () {
+ if (sel)
+ return sel;
+ else if (selection.rangeCount < 1)
+ return '';
+
+ for (var i=0, c=selection.rangeCount; i<c; i++){
+ sel += selection.getRangeAt(i).toString();
+ }
+ return sel;
+ },
+ get HTMLSEL () {
+ if (htmlsel)
+ return sel;
+ else if (selection.rangeCount < 1)
+ return '';
+
+ var serializer = new XMLSerializer();
+ for (var i=0, c=selection.rangeCount; i<c; i++){
+ htmlsel += serializer.serializeToString(selection.getRangeAt(i).cloneContents());
+ }
+ return htmlsel;
+ }
+};
+'hostname pathname host port protocol search hash'.split(' ').forEach(function (name){
+ REPLACE_TABLE[name.toUpperCase()] = function () content.location && content.location[name];
+});
+
// used when argument is none
//const defaultValue = templates[0].label;
commands.addUserCommand(['copy'],'Copy to clipboard',
@@ -156,37 +201,19 @@ function replaceVariable(str){
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; i<c; i++){
- sel += selection.getRangeAt(i).toString();
- }
- return sel;
- case '%HTMLSEL%':
- if (htmlsel)
- return sel;
- else if (selection.rangeCount < 1)
- return '';
-
- var serializer = new XMLSerializer();
- for (var i=0, c=selection.rangeCount; i<c; i++){
- htmlsel += serializer.serializeToString(selection.getRangeAt(i).cloneContents());
- }
- return htmlsel;
- }
- return '';
+ function replacer(orig, name){ //{{{
+ if (name == '')
+ return '%';
+ if (!REPLACE_TABLE.hasOwnProperty(name))
+ return orig;
+ let value = REPLACE_TABLE[name];
+ if (typeof value == 'function')
+ return value();
+ else
+ return value.toString();
+ return orig;
} //}}}
- return str.replace(/%(TITLE|URL|SEL|HTMLSEL)%/g, replacer);
+ return str.replace(/%([A-Z]*)%/g, replacer);
}
function wedataRegister(item){