| 1 | var 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 | |
|---|
| 14 | const Cc = Components.classes; |
|---|
| 15 | const Ci = Components.interfaces; |
|---|
| 16 | const StarXPath = './/img[contains(concat(" ", @class, " "), " hatena-star-add-button ")]'; |
|---|
| 17 | var flasher = null; |
|---|
| 18 | |
|---|
| 19 | var nmap = (liberator.globalVariables.hatena_star_mappings || ',?s').split(/\s+/); |
|---|
| 20 | var hmap = liberator.globalVariables.hatena_star_hint_mapping || 'h'; |
|---|
| 21 | var hmax = function () parseInt(liberator.globalVariables.hatena_star_hint_max || '10', 10); |
|---|
| 22 | var hinterval = function () parseInt(liberator.globalVariables.hatena_star_interval || '100', 10); |
|---|
| 23 | |
|---|
| 24 | function 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 | |
|---|
| 33 | function 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 | |
|---|
| 50 | function 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 | |
|---|
| 59 | liberator.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 | |
|---|
| 78 | liberator.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 | |
|---|
| 89 | liberator.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 : |
|---|