aboutsummaryrefslogtreecommitdiffstats
path: root/imageextender.js
blob: 8cf203e3b40cb37b9d6a348cd2e8dc2517be99cc (plain)
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