/*** BEGIN LICENSE BLOCK {{{ Copyright (c) 2009 hogelog Released under the GPL license http://www.gnu.org/copyleft/gpl.html }}} END LICENSE BLOCK ***/ // PLUGIN_INFO//{{{ var PLUGIN_INFO = {NAME} marker PageDown/PageUp. hogelog 0.0.15 GPL 2.2pre 2.2pre https://github.com/vimpr/vimperator-plugins/raw/master/marker_reader.js || let g:marker_reader_scroll_ratio = "0.7" ||< mnext, mprev scroll 0.7 * . >|| let g:marker_reader_onload = 0 ||< prevent PageLoad insert markers action. >|| javascript <|| let g:marker_reader_mapping = "J,K" ||< adds mapping J = mnext, K = mprev. ]]> ; //}}} plugins.marker_reader = (function() { const HTML_NAMESPACE = "http://www.w3.org/1999/xhtml"; var libly = liberator.plugins.libly; var $U = libly.$U; var logger = $U.getLogger("marker"); let ignorePages = liberator.globalVariables.marker_reader_ignore || [/^https?:\/\/mail\.google\.com\//, /^http:\/\/(?:reader\.livedoor|fastladder)\.com\/(?:reader|public)\//]; function near(p1, p2, e) p1-e <= p2 && p2 <= p1+e; function focusDocument(win) { let frames = win.frames; if (!frames) return win.document; for (let i=0,len=win.frames.length;i, // insertMarkers have to act synchronized function insertMarkers: function(doc) { // this operation have to atomic { if (doc.markers) return false; doc.markers = []; // } let win = doc.defaultView; if (win.scrollMaxY == 0) return false; if (win.innerHeight == 0) return false; if (!win.scrollbars.visible) return false; let css = $U.xmlToDom(reader.pageNaviCss, doc); let node = doc.importNode(css, true); doc.body.insertBefore(node, doc.body.firstChild); let scroll_ratio = parseFloat(liberator.globalVariables.marker_reader_scroll_ratio) || 0.9; let scroll = win.innerHeight * scroll_ratio; let count = Math.ceil(win.scrollMaxY / scroll); let div = doc.createElementNS(HTML_NAMESPACE, "div"); div.id = "vimperator-marker_reader-markers"; for (let pageNum=2;pageNum<=count+1;++pageNum) { let p = doc.createElementNS(HTML_NAMESPACE, "p"); let id = "vimperator-marker_reader-" + pageNum; p.id = id; if (liberator.globalVariables.marker_reader_pagelink) { p.innerHTML = '' + pageNum + ""; } else { p.setAttribute("mousethrough", "always"); //p.innerHTML = ""; } p.className = "vimperator-marker_reader-marker"; p.style.left = "0px"; p.style.top = Math.ceil((pageNum-1)*scroll)+"px"; div.appendChild(p); doc.markers.push(p); } doc.body.appendChild(div); return doc.markers; }, // removeMarkers have to act synchronized function removeMarkers: function(doc) { // this operation have to atomic { if (!doc.markers) return false; doc.markers = null; // } doc.body.removeChild(doc.getElementById("vimperator-marker_reader-markers")); let win = doc.defaultView; let frames = win.frames; if (frames) { for (let i=0,len=frames.length;i= win.scrollMaxY) { if (markers.length > 0) { let lastMarker = markers[markers.length-1].offsetTop; if (curPos <= lastMarker) return markers.length; } return markers.length + 0.5; } // return n.5 if between n and n+1 let page = 2.0; for (let i=0,len=markers.length;i1 ? count : 1); }, {count: true}); mappings.addUserMap([config.browserModes], [up], "marker PageUp", function (count) { reader.focusNavi(focusDocument(content), -(count>1 ? count : 1)); }, {count: true}); } commands.addUserCommand(["markersinsert", "minsert"], "insert markers", function () { reader.insertMarkers(focusDocument(content)); }); commands.addUserCommand(["markersremove", "mremove"], "remove markers", function () { reader.removeMarkers(focusDocument(content)); }); commands.addUserCommand(["markernext", "mnext"], "marker PageDown", function () { reader.focusNavi(focusDocument(content), 1); }); commands.addUserCommand(["markerprev", "mprev"], "marker PageUp", function () { reader.focusNavi(focusDocument(content), -1); }); if (liberator.globalVariables.marker_reader_onload) { reader.setAutoInsert(true); } return reader; })(); // vim: fdm=marker sw=4 ts=4 et: