1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/*
* ==VimperatorPlugin==
* @name imageextender.js
* @description extend image operation.
* @description-ja 画像操作特集。
* @author janus_wel <janus_wel@fb3.so-net.ne.jp>
* @version 0.10
* @minversion 2.0pre
* @maxversion 2.0pre
* ==/VimperatorPlugin==
*
* LICENSE
* New BSD License
*
* USAGE
* extended-hints mode ':m' to yank image URL and
* ';i' to save image are available.
* there are default setting.
* you can change there by below settings.
*
* command ':downimageall' is also available.
* it is to download all images of current page,
* but it effects heavy load to the server,
* you must use carefully.
* we are NOT RESPONSIBLE for result of this command.
*
* SETTING
* image_extender_yank_key: key name to yank image URL.
* default is 'm'.
* image_extender_save_key: key name to save image.
* default is 'i'.
* image_extender_skip_prompt: if set 'true', skip prompt to locate and name.
* the reflection of this setting is dynamic.
* ':downimageall' command ignore this setting.
* default is 'false'
*
* EXAMPLE
* in .vimperatorrc
*
* image_extender_yank_key='g'
* image_extender_save_key='e'
* image_skip_prompt='true'
*
* in this settings, ';g' start extended-hints mode to yank image URL.
* ';e' start it to save image. prompt is not displayed at save operation.
*
* */
( function () {
// default settings
const yankKey = liberator.globalVariables.image_extender_yank_key || 'm';
const saveKey = liberator.globalVariables.image_extender_save_key || 'i';
// common settings
const query = '//img[@src and not(starts-with(@src, "data:"))]';
const interval = 200; // 5 images per second
// extended-hints mode
// to yank image URL
hints.addMode(
yankKey,
'Yank image URL',
function (element) util.copyToClipboard(element.src, true),
function () query
);
// to save image
hints.addMode(
saveKey,
'Save image',
function (element) {
let skipPrompt = stringToBoolean(liberator.globalVariables.image_extender_skip_prompt, false);
try { saveImage(element, skipPrompt); }
catch (e) { liberator.echoerr(e); }
},
function () query
);
commands.addUserCommand(
['downimageall'],
'download all images of current page',
function () {
// refer: http://d.hatena.ne.jp/amachang/20071108/1194501306
let images = buffer.evaluateXPath(query);
let l = images.snapshotLength;
let i = 0;
setTimeout ( function a() {
if (!(i < l)) return;
try { saveImage(images.snapshotItem(i), true); }
catch (e) { liberator.echoerr(e); }
++i;
setTimeout(a, interval);
}, interval);
},
{}
);
// stuff function
function stringToBoolean(str, defaultValue) {
return !str ? (defaultValue ? true : false)
: str.toLowerCase() === 'false' ? false
: /^\d+$/.test(str) ? (parseInt(str) ? true : false)
: true;
}
function saveImage(imgElement, skipPrompt) {
let doc = imgElement.ownerDocument;
let url = imgElement.src;
let filename = url.split(/\//g);
filename = filename[filename.length - 1];
urlSecurityCheck(url, doc.nodePrincipal);
// we always want to save that link relative to the current working directory
options.setPref("browser.download.lastDir", io.getCurrentDirectory().path);
saveImageURL(url, filename, null, true, skipPrompt, makeURI(url, doc.characterSet));
}
} )();
// vim: sw=4 sts=4 ts=4 et
|