AutoPagerize 対応の filter 管理GM

いちいち個別の filter スクリプトAutoPagerize 対応入れるのもなんかなと思ったから、ちょっと書いてみた。
こういうの userscripts.org に上げた方がいいのかな?

// ==UserScript==
// @name           Filterize
// @namespace      http://d.hatena.ne.jp/send/
// @description    apply filter on any site.
// @include        *
// ==/UserScript==
(function () {

var FilterContainer = function() {
  this.__container = {};
  this.addFilter = function(name,func) {
    this.__container[name] = func;
    return this;
  }
  this.batch = function(nodes) {
    for each (var node in nodes) 
      for each (var filter in this.__container) filter(node);
  }
};

if(window.Filterize == undefined)
  window.Filterize = {
    onAutoPagerized : new FilterContainer(),
    onLoaded : new FilterContainer(),
  };

// for AutoPagerize
if(window.AutoPagerize != undefined) 
  window.AutoPagerize.addFilter(function (context){
    return Filterize.onAutoPagerized.batch.call(Filterize.onAutoPagerized, context);
  });

// for loaded
// XXX: 調査してないけど、0 sec でも setTimeoutしたらうまく行った
window.Filterize.timer = setTimeout(function() {
  for each(var filter in window.Filterize) 
    if(filter.batch) filter.batch([document]);
  clearTimeout(window.Filterize.timer);
},0);


})();

AutoPagarize 対応が要らない場合のスクリプト

twitter の status 入力エリアを大きくする。

// ==UserScript==
// @name           AdjustStatusForTwitter
// @namespace      http://d.hatena.ne.jp/send/
// @description    adjust status text area for Filterize
// @include        http://twitter.com/home
// @include        http://twitter.com/replies
// @include        http://twitter.com/account/archive
// ==/UserScript==
if(window.Filterize != undefined) 
  Filterize.onLoaded.addFilter('adjustTextArea', function (context) {
    var textarea = context.getElementById('status');
    if (textarea) textarea.style['height'] = '3.5em';
  });

AutoPagerize 対応がいる場合のスクリプト

twitter半角文字とかで、デザイン崩れるのを矯正する。

// ==UserScript==
// @name           StatusBreakerForTwitter
// @namespace      http://d.hatena.ne.jp/send/
// @description    apply status break on twitter
// @include        http://twitter.com/*
// ==/UserScript==

/**
 * Original Script:
 *    url breaker+
 *    http://piro.sakura.ne.jp/latest/2005/06/url_breaker_plus.user.js
 * XXX: とりあえずUTF-8
 */
if(window.Filterize != undefined)
Filterize.onAutoPagerized.addFilter('applyWordBreak', function (context){
  var path = '//td[@class="content"]/span[@class="entry-title entry-content"]//child::text()';
  var elems = document.evaluate(path, context, null,7 ,null );
  var regex = /([@!-%'-/:=\\?@\\[-`\\{-~\w]|&[\w]{1,6};)/;
  var range = document.createRange();
  var wbr = document.createElement('wbr');
  
  var last;
  var elem;
  var started;
  for(var e = 0 ; e < elems.snapshotLength; e++) {
    elem = elems.snapshotItem(e);
    range.selectNode(elem);
    while(elem && (last = range.toString().search(regex)) !== -1) {
      range.setStart(elem, last + RegExp.$1.length);
      range.insertNode(wbr.cloneNode(true));
      elem = elem.nextSibling.nextSibling;
      range.selectNode(elem);
    }
  }
  range.detach();
});