1月 2011

  • rel='next'なlink要素を強制的に付加するuser.js

    By mattz, 2011/01/07

    Operaにはfastforwardという素敵な機能があって、真っ当なつくりのページであればこれで事足りるのですが、世の中真っ当なつくりのページというのはなかなかございませんもので、このようなものを作りました。

    もちろん、extreme-fast-forward.jsなんていうものが既にあるこ とは百も承知なのですが、oAutoPagerizeが好みではないもので、SITEINFOとか導入してませんし。

    やってることは、rel='next'なlink要素がない場合は、ページ内のリンクから次っぽいリンクを見つけて(※)、そのリンク先URLをnextページとしてrel='next'なlink要素を付加するというものです。

    ※ちなみにa要素のinnerTextに「次」とか「つぎ」とか「Next」があればそのリンクは次のページへのリンクであろう、とか、a要素のinnerTextがなくて、a要素の中身が画像であってそのalt属性に「次」とか「つぎ」とか「Next」とかあるならそのリンクは次のページへのリンクであろう、みたいなやり方です。

    副作用として次原隆二みたいなリンクに反応しちゃうことがありますが、まぁ大体うまくいっています。よろしければご利用下さい。

    // ==UserScript==
    // ==/UserScript==
    (function (){
      var makeNextrel = function(url) {
        var n = document.createElement('link');
        n.rel = 'Next';
        n.href = url;
        document.querySelector('head').appendChild(n);
        return false;
      }
      var regexpnext = new RegExp(/(次|つぎ)( ?|[のへ])|next|[Nn][Ee][Xx][Tt])/i);
      window.addEventListener(
        'DOMContentLoaded',
        function(){
          var needsNext = true;
          var links = document.querySelectorAll('link');
          var i;
          for(i = 0; i  links.length; i++) {
            if(links[i].rel.match(/next/i)) {
              needsNext = false;
              return false;
            }
          }
          var ancs = document.querySelectorAll('a');
          var len = ancs.length;
          var linkto = '';
          for(i = 0; i  len; i++) {
            if(ancs[i].href) {
              linkto = ancs[i].href;
              if(ancs[i].innerText.match(regexpnext)){
                needsNext = makeNextrel(linkto);
              } else if('IMG' == ancs[i].firstChild.tagName){
                var f = ancs[i].firstChild;
                if(f.getAttribute('alt') && f.getAttribute('alt').match(regexpnext)) {
                  needsNext = makeNextrel(ancs[i].href);
                } else if(f.getAttribute('title') && f.getAttribute('title').match(regexpnext)) {
                  needsNext = makeNextrel(ancs[i].href);
                }
              }
            }
            if(!needsNext) {
              break;
            }
          }
        },false
      );
    })();
    var regexpnext = new RegExp(/(次|つぎ)( ?|[のへ])|next|[Nn][Ee][Xx][Tt])/i);

    のところをお好みの正規表現に変えてあげれば、これでうまく行かないページでもどうにかなるはずですが、正規表現なんか知らんという方はご相談下さい。