Subscribed unsubscribe Subscribe Subscribe

枕を欹てて聴く

香炉峰の雪は簾を撥げて看る

ある要素がAutoPagerizeのどのページから取得されたものかを判断する.

うたたね - Tombloo+ AutoPagerise のお作法(修正版)

これ関連.
こんなのでどうかな?
AutoPagerizeAPIとして追加する.

window.AutoPagerize.nodeOriginUrl = function(node){
  if (ap == null || typeof(node) == "undefined") return location.href;
  var insertPoint = ap.insertPoint;
  var delimiters = getElementsByXPath('descendant::*[contains(concat(" ",normalize-space(@class)," "), " autopagerize_page_info ")][namespace-uri()="http://www.w3.org/1999/xhtml"]');
  delimiters.push(insertPoint);
  var base = [];
  delimiters.forEach(function(p, index){
    if(!(typeof(delimiters[index+1]) == 'undefined'))
      base.push([p, delimiters[index+1]]);
  });
  var href = location.href;
  var range = document.createRange();
  var bsearch = function(sets, start, last){
    var len = (last - start);
    if(len < 5){
      var set = null;
      for(;start < last;++start){
        set = sets[start];
        range.setStartAfter(set[0]);
        range.setEndBefore(set[1]);
        if(range.isPointInRange(node, 1)){
          href = set[0].getElementsByTagName('a')[0].href;
          break;
        }
      }
      range.detach();
      return href;
    } else {
      var center = start + (len >> 1);
      var set = sets[center];
      range.setStartAfter(set[0]);
      range.setEndBefore(set[1]);
      var result = range.comparePoint(node, 1);
      if(result == 0){
        href = set[0].getElementsByTagName('a')[0].href;
        range.detach();
        return href;
      } else if(result == -1){
        return bsearch(sets, start, center);
      } else{
        return bsearch(sets, center+1, last);
      }
    }
  }
  return bsearch(base, 0, base.length);
}

comparePointがありがたい感じで返してくれるので適当な長さでもって2分探索
nodeを渡すと, どのURLからとられたかを返す.
そんなにRangeを熟知してるわけでもなく, 間違ってるかも.
間違ってたらはずい.

見つからんかったときはとりあえず今のURL返すよ! null返したほうがいいかも...

range使いまわしできるっぽいので修正
面倒でchildren使ってたけど, Fx3.1以降なのでgetElementsByTagNameに変更