AutoPagerize darekagakaku

    
      
  • /*
     * @title endless summer on dsbd
     * @description promotion version (Exponential Endless Summer)
     * @include http://www.tumblr.com/dashboard*
     * @include http://www.tumblr.com/show*
     * @include http://www.tumblr.com/blog*
     * @license reblog commons license ( cc by 3.0 )
     */
    
    // bookmark
    // autopager part from "twitter.AutoPager" : http://userscripts.org/scripts/review/47998
    // random choice part from ReblogMachine : http://reblog.machine.mamemomonga.com/
    //   -> ReblogMachine.endless_summer#choice : http://reblog.machine.mamemomonga.com/js/ReblogMachine.js
    // history.pushState/history.replaceState : http://d.hatena.ne.jp/javascripter/20100404/1270411268
    // show page regexp from "Tumblr Dashboard Filter by Post Type" : http://userscripts.org/scripts/review/40794
    // Exponential Endless Summer version 2013.08 by saitamanodoruji : http://tumblr.g.hatena.ne.jp/saitamanodoruji/20130831/1377961157
    
    (function () {
    
      var num = 2;
      var start_url = location.href;
      var oldest_id = 264102; // http://ku.tumblr.com/post/264102
      var latest_id = get_latest_id(document);
      var latest_id_n =50000000000;
      latest_id = (latest_id > latest_id_n) ? latest_id : latest_id_n;
      console.log('latest_id: ' + latest_id);
    
      var State = true;
      var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
      var BASE_REMAIN_HEIGHT = 10000;
      var loading = false;
    
      var last_element = get_next_elements(document).pop();
      if (!last_element) {
        return error();
      }
      var insert_point = last_element.nextSibling;
      var insert_parent = last_element.parentNode;
    
      // Exponential Endless Summer 2013.08
    
      var ees = {};
    
      ees.draw = function (oldestID, newestID) {
        var oldestUTime = this.getUnixTimeFromPostID(oldestID);
        var newestUTime = this.getUnixTimeFromPostID(newestID);
        var drawnUTime = oldestUTime + Math.floor((newestUTime - oldestUTime) * Math.random());
        return this.getPostIDFromUnixTime(drawnUTime);
      }
    
      ees.getPostIDFromUnixTime = function (utime) {
        if (utime < 1149465600000) {
          return;
        } else if (utime === Number.POSITIVE_INFINITY) {
          return Number.POSITIVE_INFINITY;
        }
        for (var i = 0; i < this.params.length; i++) {
          if (utime <= this.params[i].upperBound) {
            return Math.ceil(this.params[i].coefAlpha * Math.exp(this.params[i].coefBeta * (utime - 1136073600000)));
          }
        }
      }
    
      ees.getUnixTimeFromPostID = function (postID) {
        if (postID < 1) {
          return;
        }
        for (var i = 0; i < this.params.length; i++) {
          if (postID <= this.getPostIDFromUnixTime(this.params[i].upperBound)) {
            return Math.floor(Math.log(postID / this.params[i].coefAlpha) / this.params[i].coefBeta) + 1136073600000;
          }
        }
      }
    
      ees.params = [
        // f_i(t) = Alpha_i * exp[Beta_i * (t - t_0)]
        // t: Unix time [msec]
        // t_0 = 1136073600000 [msec] (2006-01-01T00:00:00+09:00)
        {
          coefAlpha: 1.211 * Math.pow(10, -1),
          coefBeta: 1.571 * Math.pow(10, -10),
          upperBound: 1160012789359
        }, {
          coefAlpha: 3.619 * Math.pow(10, -13),
          coefBeta: 1.266 * Math.pow(10, -9),
          upperBound: 1163269541924
        }, {
          coefAlpha: 2.120 * Math.pow(10, 0),
          coefBeta: 1.846 * Math.pow(10, -10),
          upperBound: 1172120791893
        }, {
          coefAlpha: 1.179 * Math.pow(10, -49),
          coefBeta: 3.331 * Math.pow(10, -9),
          upperBound: 1173392561265
        }, {
          coefAlpha: 4.702 * Math.pow(10, -7),
          coefBeta: 7.024 * Math.pow(10, -10),
          upperBound: 1176405323219
        }, {
          coefAlpha: 5.338 * Math.pow(10, 1),
          coefBeta: 2.425 * Math.pow(10, -10),
          upperBound: 1182930300850
        }, {
          coefAlpha: 8.255 * Math.pow(10, 3),
          coefBeta: 1.349 * Math.pow(10, -10),
          upperBound: 1193299359828
        }, {
          coefAlpha: 2.496 * Math.pow(10, 6),
          coefBeta: 3.509 * Math.pow(10, -11),
          upperBound: 1241622616806
        }, {
          coefAlpha: 2.907 * Math.pow(10, 5),
          coefBeta: 5.546 * Math.pow(10, -11),
          upperBound: 1283088065116
        }, {
          coefAlpha: 5.206 * Math.pow(10, 4),
          coefBeta: 6.716 * Math.pow(10, -11),
          upperBound: 1291075200000
        }, {
          coefAlpha: 8.329 * Math.pow(10, 4),
          coefBeta: 6.521 * Math.pow(10, -11),
          upperBound: 1292241600000
        }, {
          coefAlpha: 8.396 * Math.pow(10, 4),
          coefBeta: 6.541 * Math.pow(10, -11),
          upperBound: 1307576237376
        }, {
          coefAlpha: 7.746 * Math.pow(10, 4),
          coefBeta: 6.588 * Math.pow(10, -11),
          upperBound: 1313586050187
        }, {
          coefAlpha: 8.798 * Math.pow(10, 6),
          coefBeta: 3.922 * Math.pow(10, -11),
          upperBound: 1340572542928
        }, {
          coefAlpha: 2.693 * Math.pow(10, 8),
          coefBeta: 2.249 * Math.pow(10, -11),
          upperBound: Number.POSITIVE_INFINITY
        },
      ]
    
      next_page_load();
    
      window.addEventListener('scroll', function () {
        if (loading) return;
        var remain = document.documentElement.scrollHeight - window.innerHeight - window.pageYOffset;
        if (State && remain < BASE_REMAIN_HEIGHT) {
          next_page_load();
        }
      }, false);
    
      function next_page_load() {
        loading = true;
        var next = get_next(start_url);
        history.pushState("", "", next);
        console.log('next: ' + next);
        var x = new XMLHttpRequest();
        x.onload = function () {
          if (x.status <= 200 && x.status < 300) {
            load(x);
          } else {
            error();
            next_page_load();
          }
        };
        x.open('GET', next, true);
        x.send(null);
      }
    
      function load(x) {
        var html = x.responseText.replace(/<script(?:[ \t\r\n][^>]*)?>[\S\s]*?<\/script[ \t\r\n]*>|<\/?(?:i?frame|html|script|object)(?:[ \t\r\n][^<>]*)?>/gi, ' ');
        var htmlDoc;
        if (document.implementation.createHTMLDocument) {
          htmlDoc = document.implementation.createHTMLDocument('hogehoge')
        } else {
          htmlDoc = document.cloneNode(false);
          if (htmlDoc) {
            htmlDoc.appendChild(htmlDoc.importNode(document.documentElement, false));
          } else {
            htmlDoc = document.implementation.createDocument(null, 'html', null);
          }
        }
        var range = document.createRange();
        range.selectNodeContents(document.documentElement);
        htmlDoc.documentElement.appendChild(range.createContextualFragment(html));
        var docs = get_next_elements(htmlDoc);
        if (!docs.length) {
          error();
          return next_page_load();
        }
        target_rewrite(docs);
        img_cache(docs);
        docs = docs.map(function (doc) {
          return insert_parent.insertBefore(document.importNode(doc, true), insert_point);
        });
        loading = false;
      }
    
      function get_next_elements(doc) {
        var r = doc.evaluate('id("posts")/li[div[starts-with(@id, "post_")]]', doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
        for (var i = 0, l = r.snapshotLength, res = new Array(l); i < l; i++) res[i] = r.snapshotItem(i);
        return res;
      }
    
      function target_rewrite(docs) {
        docs.forEach(function (doc) {
          var as = doc.getElementsByTagName('a');
          for (var i = 0, l = as.length; i < l; i++) {
            var a = as[i],
              _a = a.getAttribute('href');
            if (_a && !/^javascript:/.test(_a) && !/^#/.test(_a)) a.setAttribute('target', '_blank');
          }
        });
      }
    
      function img_cache(docs) {
        docs.forEach(function (doc) {
          var is = doc.getElementsByTagName('img');
          for (var i = 0, l = is.length; i < l; i++) {
            img = new Image();
            img.src = is[i].src;
          }
        });
      }
    
      function error() {
        return console.log('error');
        State = false;
      }
    
      function terminate() {
        return console.log('terminate');
        State = false;
      }
    
      function get_latest_id(doc) {
        return doc.evaluate('number(substring-after(id("posts")/li/div[starts-with(@id, "post_")]/@id,"post_"))', doc, null, XPathResult.NUMBER_TYPE, null).numberValue;
      }
    
      function get_next(url) {
        var ramdom_id = ees.draw(oldest_id, latest_id);
        var x = /(?:\/dashboard|(?:\/blog\/[-\w]+)?\/show\/\w+|\/blog\/[-\w]+)/.exec(url)[0] + '/' + num + '?offset=' + ramdom_id;
        num += 1;
        return x;
      }
    
    })()
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2014/05/14 18:52:03 - 2014-05-14
  2. 2014/05/13 14:48:18 - 2014-05-13
  3. 2014/05/12 12:25:00 - 2014-05-12
  4. 2014/05/11 03:37:20 - 2014-05-11
  5. 2014/05/11 03:22:46 - 2014-05-11
  6. 2014/05/11 03:20:28 - 2014-05-11
  7. 2014/05/11 03:20:05 - 2014-05-11