| 1 | // PLUGIN_INFO//{{{ |
|---|
| 2 | var 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 == |
|---|
| 12 | enable mapping key like |
|---|
| 13 | >|| |
|---|
| 14 | let g:autopagerize_prevmap = "J" |
|---|
| 15 | let g:autopagerize_nextmap = "K" |
|---|
| 16 | ||< |
|---|
| 17 | |
|---|
| 18 | == Commands == |
|---|
| 19 | autopagerize_next: |
|---|
| 20 | paging next page |
|---|
| 21 | autopagerize_prev: |
|---|
| 22 | paging prev page |
|---|
| 23 | |
|---|
| 24 | == TODO == |
|---|
| 25 | |
|---|
| 26 | ]]></detail> |
|---|
| 27 | </VimperatorPlugin>; |
|---|
| 28 | //}}} |
|---|
| 29 | (function() { |
|---|
| 30 | |
|---|
| 31 | var libly = liberator.plugins.libly; |
|---|
| 32 | var $U = libly.$U; |
|---|
| 33 | var prevMap = liberator.globalVariables.autopagerize_prevmap; |
|---|
| 34 | var nextMap = liberator.globalVariables.autopagerize_nextmap; |
|---|
| 35 | |
|---|
| 36 | var 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 | }; |
|---|
| 91 | commands.addUserCommand(["nextpage"], "Autopagerize next page", |
|---|
| 92 | function(args) |
|---|
| 93 | pager.next(window.content.document, args.length>0 ? args[0] : 1)); |
|---|
| 94 | commands.addUserCommand(["prevpage"], "Autopagerize prev page", |
|---|
| 95 | function(args) |
|---|
| 96 | pager.prev(window.content.document, args.length>0 ? args[0] : 1)); |
|---|
| 97 | |
|---|
| 98 | if (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 | } |
|---|
| 104 | if (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: |
|---|