| 1 | // PLUGIN_INFO {{{
|
|---|
| 2 | let PLUGIN_INFO =
|
|---|
| 3 | <VimperatorPlugin>
|
|---|
| 4 | <name>{NAME}</name>
|
|---|
| 5 | <description>Map behave like text-object</description>
|
|---|
| 6 | <version>0.6</version>
|
|---|
| 7 | <author mail="trapezoid.g@gmail.com" homepage="http://unsigned.g.hatena.ne.jp/Trapezoid">Trapezoid</author>
|
|---|
| 8 | <license>New BSD License</license>
|
|---|
| 9 | <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/browser_object.js</updateURL>
|
|---|
| 10 | <minVersion>2.0pre</minVersion>
|
|---|
| 11 | <maxVersion>2.0pre</maxVersion>
|
|---|
| 12 | <detail><![CDATA[
|
|---|
| 13 | == Variables ==
|
|---|
| 14 | g:browser_object_prefix:
|
|---|
| 15 | default: ''
|
|---|
| 16 | usage: let g:browser_object_prefix = ','
|
|---|
| 17 | == Mappings ==
|
|---|
| 18 | dd:
|
|---|
| 19 | Delete current tab (when prefix is '' only)
|
|---|
| 20 | {motion}/:
|
|---|
| 21 | {motion} pattern matched tabs
|
|---|
| 22 | {motion}{scope}{target}:
|
|---|
| 23 | Motions:
|
|---|
| 24 | d:
|
|---|
| 25 | Delete
|
|---|
| 26 | r:
|
|---|
| 27 | Reload
|
|---|
| 28 | m{register}:
|
|---|
| 29 | Quick Mark
|
|---|
| 30 | y:
|
|---|
| 31 | Yank
|
|---|
| 32 | e:
|
|---|
| 33 | Set Pin
|
|---|
| 34 | E:
|
|---|
| 35 | Unset Pin
|
|---|
| 36 | Scopes:
|
|---|
| 37 | l:
|
|---|
| 38 | Left
|
|---|
| 39 | r:
|
|---|
| 40 | Right
|
|---|
| 41 | a:
|
|---|
| 42 | All
|
|---|
| 43 | c:
|
|---|
| 44 | Current
|
|---|
| 45 | o:
|
|---|
| 46 | Other
|
|---|
| 47 | s:
|
|---|
| 48 | Same host
|
|---|
| 49 | p:
|
|---|
| 50 | Pinned
|
|---|
| 51 | Target:
|
|---|
| 52 | t:
|
|---|
| 53 | Tabs
|
|---|
| 54 | ]]></detail>
|
|---|
| 55 | </VimperatorPlugin>;
|
|---|
| 56 | // }}}
|
|---|
| 57 |
|
|---|
| 58 | // Vimperator plugin: 'Map behave like text-object'
|
|---|
| 59 | // Version: 0.5
|
|---|
| 60 | // Last Change: 26-Dec-2008. Jan 2008
|
|---|
| 61 | // License: New BSD License
|
|---|
| 62 | // Maintainer: Trapezoid <trapezoid.g@gmail.com> - http://unsigned.g.hatena.ne.jp/Trapezoid
|
|---|
| 63 |
|
|---|
| 64 | (function(){
|
|---|
| 65 | var XMigemoCore, XMigemoTextUtils;
|
|---|
| 66 | try{
|
|---|
| 67 | XMigemoCore = Components.classes["@piro.sakura.ne.jp/xmigemo/factory;1"]
|
|---|
| 68 | .getService(Components.interfaces.pIXMigemoFactory)
|
|---|
| 69 | .getService("ja");
|
|---|
| 70 | XMigemoTextUtils = Components.classes["@piro.sakura.ne.jp/xmigemo/text-utility;1"]
|
|---|
| 71 | .getService(Components.interfaces.pIXMigemoTextUtils);
|
|---|
| 72 | }catch(ex){}
|
|---|
| 73 | const PINNED_ICON = 'data:image/png;base64,'
|
|---|
| 74 | +'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgI'
|
|---|
| 75 | +'fAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3'
|
|---|
| 76 | +'Lmlua3NjYXBlLm9yZ5vuPBoAAAIlSURBVFiF7Za9a1RBEMB/KwcxipGQBIUo'
|
|---|
| 77 | +'UUGLIEi8StAyBCuDaEBUIgQPBIVgIQiCqa5QvDYo5JCkMRrxo1ALUYkKWoj+'
|
|---|
| 78 | +'B8aPeGg4LQQVdmfH4r13vJPT5O64i8Xbbubtzvx2Pt6sUVWWc61YVu8JQAKQ'
|
|---|
| 79 | +'ACQACcD/AJBqtsOXYjoVMsBx4GpTAZ5ZcwjIo6wMVZtMs8bxk18mDTwFWgEU'
|
|---|
| 80 | +'Cig7mhKBhz9MF8ptoDW8rgeO9K/WhYYDPPhuDDClsAGAgCC7t00fQROK0Apn'
|
|---|
| 81 | +'gIFIVpgFxiK5rhq4883sAdbta9eZSt9vfTW7CBymQjefgb79HVqoC+Bm0fQC'
|
|---|
| 82 | +'OZSB8PTuA536PL7nxoJpB14r9IQqAfqHuvRxfF/VKZj+YtLAC42fVYaBMgDr'
|
|---|
| 83 | +'yQM9Yc5ROH94fblzqOFPaIU2K6ScgBOwAtYzNFUwUW8z+cmccsKgE3AerOe+'
|
|---|
| 84 | +'E7KV7FUN4DyzzjPvfOA8BFnrhEGA/EfT54SLJTjhgxOODndXznXVAMe6Vaxw'
|
|---|
| 85 | +'2Ya3i0CskLnyzqxxwrT1tFhfgsuMbNTi3+zVVITjb00H8F5hVVyvyisgXZJh'
|
|---|
| 86 | +'5uQWPfgvWzVNwxObtWiFibI6CCKSjkXkpxNGF7NV8zh2npz1SCzUcRCcZ2J0'
|
|---|
| 87 | +'q843DOD0Np1zwnUXdAF/gDgrXFqKnboeJFa4EOuEOMj42V6dazjAue36xgn3'
|
|---|
| 88 | +'ovCHINecXzz30ap7GFnPCDCJ0gLkFO5mdy69tX4DuVQpJGsygDkAAAAASUVO'
|
|---|
| 89 | +'RK5CYII=';
|
|---|
| 90 | const PINNED_ICON_STYLE = "margin-top: 1px;"
|
|---|
| 91 | +"margin-start-value: 7px;"
|
|---|
| 92 | +"margin-left-ltr-source: logical;"
|
|---|
| 93 | +"margin-right-rtl-source: logical;"
|
|---|
| 94 | +"margin-end-value: 3px;"
|
|---|
| 95 | +"margin-right-ltr-source: logical;"
|
|---|
| 96 | +"margin-left-rtl-source: logical;"
|
|---|
| 97 | +"width: 16px;"
|
|---|
| 98 | +"height: 16px;"
|
|---|
| 99 | +"-moz-image-region: rect(0px, 16px, 16px, 0px);";
|
|---|
| 100 |
|
|---|
| 101 | function Tab(){}
|
|---|
| 102 | Tab.prototype = {
|
|---|
| 103 | close: function(ary){
|
|---|
| 104 | for (var i = 0 ; i < ary.length; i++){
|
|---|
| 105 | let j = ary[i];
|
|---|
| 106 | window.setTimeout(function(){ j.linkedBrowser.contentWindow.close(); },0);
|
|---|
| 107 | }
|
|---|
| 108 | },
|
|---|
| 109 | yank: function(ary){
|
|---|
| 110 | var copyStrings = [];
|
|---|
| 111 | for (var i = 0 ; i < ary.length; i++)
|
|---|
| 112 | if(typeof ary[i] == "object")
|
|---|
| 113 | copyStrings.push(ary[i].linkedBrowser.contentDocument.location.href);
|
|---|
| 114 | liberator.modules.util.copyToClipboard(copyStrings.join(", "));
|
|---|
| 115 | },
|
|---|
| 116 | mark: function(ary,arg){
|
|---|
| 117 | var markStrings = [];
|
|---|
| 118 | for (var i = 0 ; i < ary.length; i++)
|
|---|
| 119 | if(typeof ary[i] == "object")
|
|---|
| 120 | markStrings.push(ary[i].linkedBrowser.contentDocument.location.href);
|
|---|
| 121 | liberator.modules.quickmarks.add(arg,markStrings.join(", "));
|
|---|
| 122 | },
|
|---|
| 123 | reload: function(ary){
|
|---|
| 124 | for (var i = 0 ; i < ary.length; i++)
|
|---|
| 125 | if(typeof ary[i] == "object")
|
|---|
| 126 | ary[i].linkedBrowser.contentDocument.location.reload();
|
|---|
| 127 | },
|
|---|
| 128 | togglePin: function(ary){
|
|---|
| 129 | for (var i = 0 ; i < ary.length; i++){
|
|---|
| 130 | if(typeof ary[i] == "object")
|
|---|
| 131 | if(ary[i].linkedBrowser.vimperatorBrowserObjectPinIcon == undefined){
|
|---|
| 132 | var image = document.createElement('image');
|
|---|
| 133 | image.setAttribute('src',PINNED_ICON);
|
|---|
| 134 | image.setAttribute('style',PINNED_ICON_STYLE);
|
|---|
| 135 | ary[i].insertBefore(image,ary[i].firstChild);
|
|---|
| 136 | ary[i].linkedBrowser.vimperatorBrowserObjectPinIcon = image;
|
|---|
| 137 | ary[i].linkedBrowser.vimperatorBrowserObjectPin = true;
|
|---|
| 138 | ary[i].linkedBrowser.vimperatorBrowserObjectPinIcon.collapsed = false;
|
|---|
| 139 | }
|
|---|
| 140 | else if(ary[i].linkedBrowser.vimperatorBrowserObjectPin){
|
|---|
| 141 | ary[i].linkedBrowser.vimperatorBrowserObjectPinIcon.collapsed = true;
|
|---|
| 142 | ary[i].linkedBrowser.vimperatorBrowserObjectPin = false;
|
|---|
| 143 | }else{
|
|---|
| 144 | ary[i].linkedBrowser.vimperatorBrowserObjectPinIcon.collapsed = false;
|
|---|
| 145 | ary[i].linkedBrowser.vimperatorBrowserObjectPin = true;
|
|---|
| 146 | }
|
|---|
| 147 | }
|
|---|
| 148 | },
|
|---|
| 149 | setPin: function(ary){
|
|---|
| 150 | for (var i = 0 ; i < ary.length; i++){
|
|---|
| 151 | if(typeof ary[i] == "object"){
|
|---|
| 152 | ary[i].linkedBrowser.vimperatorBrowserObjectPin = true;
|
|---|
| 153 | if(ary[i].linkedBrowser.vimperatorBrowserObjectPinIcon == undefined){
|
|---|
| 154 | var image = document.createElement('image');
|
|---|
| 155 | image.setAttribute('src',PINNED_ICON);
|
|---|
| 156 | image.setAttribute('style',PINNED_ICON_STYLE);
|
|---|
| 157 | ary[i].insertBefore(image,ary[i].firstChild);
|
|---|
| 158 | ary[i].linkedBrowser.vimperatorBrowserObjectPinIcon = image;
|
|---|
| 159 | }
|
|---|
| 160 | ary[i].linkedBrowser.vimperatorBrowserObjectPinIcon.collapsed = false;
|
|---|
| 161 | }
|
|---|
| 162 | }
|
|---|
| 163 | },
|
|---|
| 164 | unsetPin: function(ary){
|
|---|
| 165 | for (var i = 0 ; i < ary.length; i++){
|
|---|
| 166 | if(typeof ary[i] == "object"){
|
|---|
| 167 | if(ary[i].linkedBrowser.vimperatorBrowserObjectPin == true){
|
|---|
| 168 | ary[i].linkedBrowser.vimperatorBrowserObjectPinIcon.collapsed = true;
|
|---|
| 169 | ary[i].linkedBrowser.vimperatorBrowserObjectPin = false;
|
|---|
| 170 | }
|
|---|
| 171 | }
|
|---|
| 172 | }
|
|---|
| 173 | },
|
|---|
| 174 |
|
|---|
| 175 | active: function() gBrowser.mTabContainer.selectedIndex,
|
|---|
| 176 | identify: function(i){try{return i.linkedBrowser.contentDocument.location.host}catch(e){}},
|
|---|
| 177 | href: function(i){try{return i.linkedBrowser.contentDocument.location.href}catch(e){}},
|
|---|
| 178 | title: function(i){try{return i.linkedBrowser.contentDocument.title}catch(e){}},
|
|---|
| 179 | pinned: function(i){
|
|---|
| 180 | if(typeof i == "object"){
|
|---|
| 181 | return i.linkedBrowser.vimperatorBrowserObjectPin
|
|---|
| 182 | }
|
|---|
| 183 | return false;
|
|---|
| 184 | },
|
|---|
| 185 | collection: function() window.gBrowser.mTabContainer.childNodes,
|
|---|
| 186 | };
|
|---|
| 187 |
|
|---|
| 188 | function Container(){
|
|---|
| 189 | var collections = {};
|
|---|
| 190 | function iterator(){
|
|---|
| 191 | for (let i in collections)
|
|---|
| 192 | yield collections[i];
|
|---|
| 193 | throw StopIteration;
|
|---|
| 194 | }
|
|---|
| 195 | return {
|
|---|
| 196 | __iterator__: function(){
|
|---|
| 197 | return iterator();
|
|---|
| 198 | },
|
|---|
| 199 | add: function(id,handler,options){
|
|---|
| 200 | options = options || {};
|
|---|
| 201 | collections[id] = {
|
|---|
| 202 | id: id,
|
|---|
| 203 | handler: handler,
|
|---|
| 204 | options: options,
|
|---|
| 205 | };
|
|---|
| 206 | },
|
|---|
| 207 | get: function(id) collections[id],
|
|---|
| 208 | };
|
|---|
| 209 | }
|
|---|
| 210 |
|
|---|
| 211 | var browserObject = {};
|
|---|
| 212 |
|
|---|
| 213 | browserObject.motions = new Container();
|
|---|
| 214 | browserObject.scopes = new Container();
|
|---|
| 215 | browserObject.targets = new Container();
|
|---|
| 216 |
|
|---|
| 217 | browserObject.motions.add('d','close');
|
|---|
| 218 | browserObject.motions.add('y','yank');
|
|---|
| 219 | browserObject.motions.add('r','reload');
|
|---|
| 220 | browserObject.motions.add('m','mark',{ flags: liberator.modules.Mappings.flags.ARGUMENT });
|
|---|
| 221 | browserObject.motions.add('e','setPin');
|
|---|
| 222 | browserObject.motions.add('E','unsetPin');
|
|---|
| 223 |
|
|---|
| 224 | browserObject.scopes.add('l',function(ary){
|
|---|
| 225 | var active = this.active();
|
|---|
| 226 | return [ary[i] for (i in ary) if(i < active)];
|
|---|
| 227 | });
|
|---|
| 228 | browserObject.scopes.add('r',function(ary){
|
|---|
| 229 | var active = this.active();
|
|---|
| 230 | return [ary[i] for (i in ary) if(i > active)];
|
|---|
| 231 | });
|
|---|
| 232 | browserObject.scopes.add('o',function(ary){
|
|---|
| 233 | var active = this.active();
|
|---|
| 234 | return [ary[i] for (i in ary) if(i != active)];
|
|---|
| 235 | });
|
|---|
| 236 | browserObject.scopes.add('c',function(ary) [ary[this.active()]]);
|
|---|
| 237 | browserObject.scopes.add('a',function(ary) ary);
|
|---|
| 238 | browserObject.scopes.add('s',function(ary){
|
|---|
| 239 | var activeIdentify = this.identify(ary[this.active()]);
|
|---|
| 240 | return [ary[i] for (i in ary) if(this.identify(ary[i]) == activeIdentify)];
|
|---|
| 241 | });
|
|---|
| 242 | browserObject.scopes.add('p',function(ary){
|
|---|
| 243 | return [ary[i] for (i in ary) if(this.pinned(ary[i]) == true)];
|
|---|
| 244 | });
|
|---|
| 245 |
|
|---|
| 246 | browserObject.targets.add('t',new Tab());
|
|---|
| 247 |
|
|---|
| 248 |
|
|---|
| 249 | var prefix = liberator.globalVariables.browser_object_prefix || "";
|
|---|
| 250 | for (let it in browserObject.motions){
|
|---|
| 251 | let motion = it;
|
|---|
| 252 | for (let it in browserObject.scopes){
|
|---|
| 253 | let scope = it;
|
|---|
| 254 | for (let it in browserObject.targets){
|
|---|
| 255 | let target = it;
|
|---|
| 256 | liberator.modules.mappings.addUserMap([liberator.modules.modes.NORMAL], [prefix + motion.id + scope.id + target.id],
|
|---|
| 257 | "Browser Object Mapping",
|
|---|
| 258 | function (arg){
|
|---|
| 259 | var targetCollection;
|
|---|
| 260 | arg = arg || null;
|
|---|
| 261 |
|
|---|
| 262 | if(!target){
|
|---|
| 263 | liberator.echoerr("Browser: target not found");
|
|---|
| 264 | return;
|
|---|
| 265 | }
|
|---|
| 266 |
|
|---|
| 267 | targetCollection = scope.handler.call(target.handler,target.handler.collection());
|
|---|
| 268 | if(target.handler[motion.handler])
|
|---|
| 269 | target.handler[motion.handler].call(target.handler,targetCollection,arg);
|
|---|
| 270 | else
|
|---|
| 271 | liberator.echoerr("Browser: motion handler not found");
|
|---|
| 272 | }, motion.options);
|
|---|
| 273 | }
|
|---|
| 274 | }
|
|---|
| 275 | let map = liberator.modules.mappings.get(null,motion.id);
|
|---|
| 276 | if(!prefix && map){
|
|---|
| 277 | liberator.modules.mappings.addUserMap([liberator.modules.modes.NORMAL],
|
|---|
| 278 | [motion.id + motion.id], map.description, map.action,
|
|---|
| 279 | { flags: map.flags});
|
|---|
| 280 | }
|
|---|
| 281 | liberator.modules.mappings.addUserMap([liberator.modules.modes.NORMAL],
|
|---|
| 282 | [prefix + motion.id + "/"], "Browser Object Mappings",
|
|---|
| 283 | function (){
|
|---|
| 284 | liberator.modules.commandline.input("/",function(s){
|
|---|
| 285 | var target = browserObject.targets.get("t");
|
|---|
| 286 | var targetCollection = (function(ary){
|
|---|
| 287 | var pattern;
|
|---|
| 288 | if(XMigemoCore != undefined){
|
|---|
| 289 | pattern = new RegExp(XMigemoTextUtils.sanitize(s) + "|" + XMigemoCore.getRegExp(s),"i");
|
|---|
| 290 | }else{
|
|---|
| 291 | pattern = new RegExp(s,"i");
|
|---|
| 292 | }
|
|---|
| 293 | return [ary[i] for (i in ary) if(pattern.test(this.title(ary[i]) || pattern.test(this.href(ary[i]))))];
|
|---|
| 294 | }).call(target.handler,target.handler.collection());
|
|---|
| 295 | target.handler[motion.handler].call(target.handler,targetCollection);
|
|---|
| 296 | },{completer: liberator.modules.completion.buffer});
|
|---|
| 297 | },
|
|---|
| 298 | {});
|
|---|
| 299 | }
|
|---|
| 300 | })();
|
|---|