root/lang/javascript/vimperator-plugins/trunk/hatenaStar.js

Revision 35833, 3.1 kB (checked in by anekos, 10 months ago)

Follow HEAD (2.3pre)

Line 
1var PLUGIN_INFO =
2<VimperatorPlugin>
3        <name>{NAME}</name>
4        <description>Add Hatena Star.</description>
5        <description lang="ja">はてなスターをつける。</description>
6        <author mail="mattn.jp@gmail.com">mattn</author>
7        <version>0.1.3</version>
8        <minVersion>2.3pre</minVersion>
9        <maxVersion>2.3pre</maxVersion>
10        <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/hatenaStar.js</updateURL>
11</VimperatorPlugin>;
12(function() {
13
14const Cc = Components.classes;
15const Ci = Components.interfaces;
16const StarXPath = './/img[contains(concat(" ", @class, " "), " hatena-star-add-button ")]';
17var flasher = null;
18
19var nmap = (liberator.globalVariables.hatena_star_mappings || ',?s').split(/\s+/);
20var hmap = liberator.globalVariables.hatena_star_hint_mapping || 'h';
21var hmax = function () parseInt(liberator.globalVariables.hatena_star_hint_max || '10', 10);
22var hinterval = function () parseInt(liberator.globalVariables.hatena_star_interval || '100', 10);
23
24function getFlasher() {
25        if (!flasher) {
26                flasher = Cc['@mozilla.org/inspector/flasher;1'].createInstance(Ci.inIFlasher);
27                flasher.color = '#FF0000';
28                flasher.thickness = 2;
29        }
30        return flasher;
31}
32
33function blink(aNode) {
34        if (!aNode) {
35                liberator.echoerr('Hatena Star not found');
36                return;
37        }
38        if (aNode.nodeType == 3) aNode = aNode.parentNode;
39        var toggle = true;
40        var flasher = getFlasher();
41        for (let i=1; i<7; ++i) {
42                setTimeout(function() {
43                        if (toggle) flasher.drawElementOutline(aNode);
44                        else        flasher.repaintElement(aNode);
45                        toggle = !toggle;
46                }, i * 100);
47        }
48}
49
50function addHatenaStar (elem) {
51        var e = document.createEvent('MouseEvents');
52        // "Hatena.Star.AddButton.selectedText" is initialized on mouseover.
53        e.initMouseEvent('mouseover', true, true, window, 1, 10, 50, 10, 50, 0, 0, 0, 0, 1, elem);
54        elem.dispatchEvent(e);
55        e.initMouseEvent('click', true, true, window, 1, 10, 50, 10, 50, 0, 0, 0, 0, 1, elem);
56        elem.dispatchEvent(e);
57}
58
59liberator.modules.commands.addUserCommand(['hatenastar', 'hatenas'], 'add Hatena Star',
60        function (args) {
61                try {
62                        var arg = args.string;
63                        let result = util.evaluateXPath(StarXPath);
64                        let m      = arg.match(/^(\d+)\?$/);
65                        if (m) {
66                                blink(result.snapshotItem(Number(m[1])-1));
67                                return;
68                        }
69                        for (let i = 0, l = result.snapshotLength; i < l; i++) {
70                                if (arg == '' || arg == 'all' || arg == (i+1)) {
71                                        addHatenaStar(result.snapshotItem(i));
72                                }
73                        }
74                } catch (e) { liberator.echoerr('hatenaStar: ' + e); }
75        }
76);
77
78liberator.modules.mappings.addUserMap([liberator.modules.modes.NORMAL], nmap, 'add Hatena Star',
79        function (count) {
80                try {
81                        for (let n = 0; n++ < count; liberator.modules.commands.get('hatenastar').execute("all", false, count));
82                } catch (e) { liberator.echoerr('hatenaStar: ' + e); }
83        }, {
84                noremap: true,
85                count: true
86        }
87);
88
89liberator.modules.hints.addMode(hmap, 'Add Hatena star',
90        function (elem, _, count) {
91                count = Math.min(hmax(), Math.max(count, 1)) - 1;
92                addHatenaStar(elem);
93                let handle = setInterval(function () {
94                        if (count-- > 0)
95                                addHatenaStar(elem);
96                        else
97                                clearInterval(handle);
98                }, hinterval());
99        },
100        function () StarXPath
101);
102
103})();
104
105// vim: set noet :
Note: See TracBrowser for help on using the browser.