素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

pageElement、nextLinkの推測

Class、$XはAutoPageLoaderで定義してある。

  var Search = new Class();
  Search.prototype = {
    getNextLink: function (doc) {
      var xpath = '(descendant::link|descendant::a)[@rel="next" or @rel="prev"]|descendant::a[contains(text()," 次") or contains(text(),"Next") or contains(text(),"next") or contains(text(),"NEXT") or contains(text(),">") or contains(text(),">>") or contains(text(),"≫") or contains(text(),"前") or contains(text(),"Prev") or contains(text(),"prev") or contains(text(),"PREV") or contains(text(),"<") or contains(text(),"<<") or contains(text(),"≪")]';
      return $X(xpath, doc).pop();
    },
    getPageElement: function (doc) {
      function getElemSize (elem) elem.offsetWidth * elem.offsetHeight;
      return function (parentElem) {
        var big = $X('./*', parentElem).reduce(function(a, b) {
         var s = getElemSize(b);
         return a.size > s? a: {elem:b, size: s};
        }, {elem:{offsetWidth: 0, offsetHeight: 0}, size: 0});
        return getElemSize(parentElem) > big.size * 2? parentElem:
                                                arguments.callee(big.elem);
       }(doc.body);
    },
    initalize: function (doc) {
      var nextLink = this.getNextLink(doc);
      var pageElement = this.getPageElement(doc);
      return {nextLink: nextLink, pageElement: pageElement};
    }
  };

AutoPageLoaderはSITEINFOを使うことを前提に作っているので、このコードを組み込むにはだいぶコードを変えなければならない。いつか試す予定。

pageElementの推測ロジックはを参考に、nextLinkの推測はPagerization for Greasemonkeyを参考にさせてもらいました。