diff options
| author | anekos | 2014-12-14 16:47:03 +0900 | 
|---|---|---|
| committer | anekos | 2014-12-14 16:47:03 +0900 | 
| commit | 875ba15b1cd4b9498bf30118e2a24e78f49b86e0 (patch) | |
| tree | f180db7a5c18e1b6b7c55d5e85e1d83bb7a5fdaf | |
| parent | 575223a51be0adbcd5e8d391dbfb6e755eb2caf8 (diff) | |
| parent | 4c20fd12fe9a286ff8e4b5423c694d79dac45b0c (diff) | |
| download | vimperator-plugins-875ba15b1cd4b9498bf30118e2a24e78f49b86e0.tar.bz2 | |
Merge branch 'zoresvit-patch-1'
| -rw-r--r-- | _smooziee.js | 68 | 
1 files changed, 40 insertions, 28 deletions
| diff --git a/_smooziee.js b/_smooziee.js index ae4915c..42eb9e3 100644 --- a/_smooziee.js +++ b/_smooziee.js @@ -80,68 +80,80 @@ var INFO = xml`  let self = liberator.plugins.smooziee = (function(){ -  // Mappings  {{{    mappings.addUserMap(      [modes.NORMAL],      ["j"],      "Smooth scroll down",      function(count){ -      self.smoothScrollBy(getScrollAmount() * (count || 1)); +      self.smoothScrollBy(getScrollAmount());      },      {        count: true      } -  ); +    );    mappings.addUserMap(      [modes.NORMAL],      ["k"],      "Smooth scroll up",      function(count){ -      self.smoothScrollBy(getScrollAmount() * -(count || 1)); +      self.smoothScrollBy(getScrollAmount() * -1);      },      {        count: true      } -  ); -  // }}} -  // PUBLIC {{{ +    ); + +  var next; +  var win; +  var interval; +    var PUBLICS = {      smoothScrollBy: function(moment) {        win = Buffer.findScrollableWindow(); -      interval = window.eval(liberator.globalVariables.smooziee_scroll_interval || '20'); -      destY = win.scrollY + moment; +      interval = window.eval(liberator.globalVariables.smooth_scroll_interval || '30');        clearTimeout(next);        smoothScroll(moment);      }    } -  // }}} -  // PRIVATE {{{ -  var next; -  var destY; -  var win; -  var interval; +  function logBase(x, y) { +    // Logarithm of arbitrary base `x` +    return Math.log(y) / Math.log(x); +  } -  function getScrollAmount() window.eval(liberator.globalVariables.smooziee_scroll_amount || '400'); +  function getScrollAmount() { +    // see recognition of Fibonacci Numbers (here approximation is used) +    // http://en.wikipedia.org/wiki/Fibonacci_number#Recognizing_Fibonacci_numbers +    phi = 1.618033; +    sqrt5 = 2.236067; +    fn = liberator.globalVariables.smooth_scroll_amount || '150' +      n = Math.ceil(logBase(phi, (fn * sqrt5 + Math.sqrt(5 * Math.pow(fn, 2) + 4)) / 2)) +      return window.eval(n); +  } -  function smoothScroll(moment) { -    if (moment > 0) -      moment = Math.floor(moment / 2); -    else -      moment = Math.ceil(moment / 2); +  function fib(n){ +    // see optimized Binet's formula for Fibonacci sequence +    // http://en.wikipedia.org/wiki/Fibonacci_number#Closed_form_expression +    phi = 1.618033; +    sqrt5 = 2.236067; +    return Math.floor((Math.pow(phi, n) / sqrt5) + 0.5) +  } -    win.scrollBy(0, moment); +  function smoothScroll(moment) { +    if (moment > 0) { +      moment = moment - 1; +      win.scrollBy(0, fib(Math.abs(moment))); +    } else { +      moment = moment + 1; +      win.scrollBy(0, -fib(Math.abs(moment))); +    } -    if (Math.abs(moment) < 1) { -      setTimeout(makeScrollTo(win.scrollX, destY), interval); -      destY = null; +    if (moment == 0)        return; -    } +      next = setTimeout(function() smoothScroll(moment), interval);    } -  function makeScrollTo(x, y) function() win.scrollTo(x, y); -  // }}}    return PUBLICS;  })();  // vim: sw=2 ts=2 et si fdm=marker: | 
