root/lang/javascript/vimperator-plugins/branches/2.1/browser_object.js

Revision 33855, 12.5 kB (checked in by trapezoid, 15 months ago)

browser_object.js: quickmark.

Line 
1// PLUGIN_INFO {{{
2let 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})();
Note: See TracBrowser for help on using the browser.