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

Revision 28870, 3.5 kB (checked in by drry, 20 months ago)
  • fixed a typo. (control_l_)
  • et cetera.
Line 
1// PLUGIN_INFO//{{{
2var PLUGIN_INFO =
3<VimperatorPlugin>
4  <name>{NAME}</name>
5  <description>controls autopagerize</description>
6  <author mail="konbu.komuro@gmail.com" homepage="http://d.hatena.ne.jp/hogelog/">hogelog</author>
7  <version>0.0.1</version>
8  <maxVersion>2.0pre</maxVersion>
9  <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/autopagerize_controll.js</updateURL>
10  <detail><![CDATA[
11== Options ==
12enable mapping key like
13>||
14  let g:autopagerize_prevmap = "J"
15  let g:autopagerize_nextmap = "K"
16||<
17
18== Commands ==
19autopagerize_next:
20    paging next page
21autopagerize_prev:
22    paging prev page
23
24== TODO ==
25
26  ]]></detail>
27</VimperatorPlugin>;
28//}}}
29(function() {
30
31var libly = liberator.plugins.libly;
32var $U = libly.$U;
33var prevMap = liberator.globalVariables.autopagerize_prevmap;
34var nextMap = liberator.globalVariables.autopagerize_nextmap;
35
36var pager = {
37    modes: [modes.NORMAL, modes.VISUAL],
38    next: function(doc, count) {
39        var curPage = pager.getCurrentPage(doc);
40        liberator.reportError(curPage);
41        pager.paging(doc, Math.floor(curPage+count));
42    },
43    prev: function(doc, count) {
44        var curPage = pager.getCurrentPage(doc);
45        liberator.reportError(curPage);
46        pager.paging(doc, Math.round(curPage-count));
47    },
48    paging: function(doc, page) {
49        liberator.reportError(page);
50        var win = doc.defaultView;
51        if (page <= 1) {
52            win.scrollTo(0, 0);
53        } else if (!pager.focusPageNav(doc, page)) {
54            win.scrollTo(0, win.scrollMaxY);
55        }
56    },
57    focusPageNav: function(doc, page) {
58        var xpath = '//*[@class="autopagerize_page_info" and child::a[contains(text(), "'+page+'")]]';
59        var [ elem ] = $U.getNodesFromXPath(xpath, doc);
60        var win = doc.defaultView;
61        if (elem) {
62            let p = $U.getElementPosition(elem);
63            win.scrollTo(0, p.top);
64            return true;
65        }
66        return false;
67    },
68    getCurrentPage: function(doc) {
69        var xpath = '//*[@class="autopagerize_page_info"]';
70        var markers = $U.getNodesFromXPath(xpath, doc);
71        var win = doc.defaultView;
72        var curPos = win.scrollY;
73
74        // top of page
75        if (curPos <= 0) return 1.0;
76
77        // bottom of page
78        if (curPos >= win.scrollMaxY) return 1.0 + markers.length;
79
80        // return n.5 if between n and n+1
81        var page = 1.0;
82        for (let i = 0, len = markers.length; i < len; i++) {
83            let p = $U.getElementPosition(markers[i]);
84            if (curPos == p.top) return page+1;
85            if (curPos < p.top) return page+0.5;
86            ++page;
87        }
88        return page+0.5;
89    },
90};
91commands.addUserCommand(["nextpage"], "Autopagerize next page",
92    function(args)
93        pager.next(window.content.document, args.length>0 ? args[0] : 1));
94commands.addUserCommand(["prevpage"], "Autopagerize prev page",
95    function(args)
96        pager.prev(window.content.document, args.length>0 ? args[0] : 1));
97
98if (nextMap) {
99    mappings.addUserMap(pager.modes, [nextMap], "Autopagerize next page",
100            function(count)
101                pager.next(window.content.document, count>0 ? count : 1),
102            {flags: Mappings.flags.COUNT});
103}
104if (prevMap) {
105    mappings.addUserMap(pager.modes, [prevMap], "Autopagerize prev page",
106            function(count)
107                pager.prev(window.content.document, count>0 ? count : 1),
108            {flags: Mappings.flags.COUNT});
109}
110
111})();
112// vim: set fdm=marker sw=4 ts=4 et:
Note: See TracBrowser for help on using the browser.