そのへんにぺろっと貼ってあるgreasemonkeyスクリプトにインストールボタンを付けるgreasemonkeyスクリプト改

つぎはコレautopagerize対応したいっす。でもそのまえにコレが何をやっているのかを知りたいっす。

追記:
とおもったら、もう改訂版があった。GJ! id:flagmeister

そのへんにぺろっと貼ってあるgreasemonkeyスクリプトにインストールボタンを付けるgreasemonkeyスクリプト

// ==UserScript==
// @name           pasted script installer
// @namespace      http://d.hatena.ne.jp/kusigahama/
// @include        http://*.g.hatena.ne.jp/*
// @include        http://d.hatena.ne.jp/*
// @include        http://anond.hatelabo.jp/*
// ==/UserScript==

var f = function(context){
  var a = $x("descendant-or-self::pre", context);
  for (var i=0 ; i<a.length ; ++i) {
    var s = a[i].textContent;
    if ( !/^\s*\/\/ ==UserScript==/.test(s) ) continue;

    var div = document.createElement('div');
    div.style.marginBottom = "1em";
    var l = document.createElement('a');
    l.href = "data:text/html;charset=utf-8," + encodeURI(s) + "//.user.js";
    l.setAttribute("style", "border: 1px solid #666; text-decoration:none; padding: 3px 6px;font-family: Arial; font-size: 10px; background: white; color: black;");
    l.setAttribute("onmousedown", "this.firstChild.style.left = '1px'; this.firstChild.style.top = '1px'");
    l.setAttribute("onmouseup", "this.firstChild.style.left = '0px'; this.firstChild.style.top = '0px'");
    l.innerHTML =
      '<span style="position: relative; left: 0px; top: 0px;">' +
      //'<img src="data:image/gif," width=10 height=8> ' +
      '<span style="font-size: 1.3em; padding-right: 5px; color: #2c2;">&raquo;</span>' +
      '<span style="font-weight: bold;">Install this script</span></span>';
    div.appendChild(l);
    a[i].insertBefore(div, a[i].firstChild);
  }
}
f();

// For Autopagerize 0.0.12
(function(filter, i) {
  i = i || 4;
  if (window.AutoPagerize && window.AutoPagerize.addFilter){
    window.AutoPagerize.addFilter(filter);
  } else if (i > 1) {
    setTimeout(arguments.callee, 1000, filter, i - 1);
  }
})(function(e) { e.forEach(f) })

function $x(exp, context) {
  var results = arguments.callee.results || null;
  results = document.evaluate(
    exp, context || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, results);
  var arr = [];
  for (var i = 0, l = results.snapshotLength; i < l; i++) {
    arr[i] = results.snapshotItem(i);
  }
  return arr;
}

このスクリプトではシンタックスハイライトされた pre に対応するためにまず stripTags 関数でタグを除去して、それから見えない div の innerHTML にそれを代入して、div.childNodes[0].nodeValue でそれを取り出すことでアンエスケープ (& を & とかに) してるんだけど、Firefox では 4096 バイト以上のテキストを innerHTML に入れた場合に 4096 バイトごとに複数のテキストノードに分割される (参考) ため、スクリプトが途中で切れてしまっているらしい。


いろいろやったけど単に pre の textContent を取るだけで充分だった。

http://d.hatena.ne.jp/flagmeister/20080108/1199779649


オリジナル版:http://yagi.xrea.jp/2007/06/pastedscriptinstaller.user.js

// ==UserScript==
// @name           pasted script installer
// @namespace      http://d.hatena.ne.jp/kusigahama/
// @include        http://*.g.hatena.ne.jp/*
// @include        http://d.hatena.ne.jp/*
// @include        http://anond.hatelabo.jp/*
// ==/UserScript==

(function(){

	var a = document.getElementsByTagName('pre');
	for (var i=0 ; i<a.length ; ++i) {
		//if ( a[i].className != "syntax-highlight" ) continue;
		
		var stripTags = function(s) { return s.replace(/<\/?[^>]+>/gi, ''); }
		var s = stripTags(a[i].innerHTML)
		if ( !s.match(/^\/\/ ==UserScript==/) ) continue;

		var unescapeHTML = function(s) {
			var div = document.createElement('div');
			div.innerHTML = stripTags(s);
			return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
		}
		s = unescapeHTML(s);
		
		var div = document.createElement('div');
		div.style.marginBottom = "1em";
		var l = document.createElement('a');
		l.href = "data:text/html;charset=utf-8," + escape(s) + "//.user.js";
		l.setAttribute("style", "border: 1px solid #666; text-decoration:none; padding: 3px 6px;font-family: Arial; font-size: 10px; background: white; color: black;");
		l.setAttribute("onmousedown", "this.firstChild.style.left = '1px'; this.firstChild.style.top = '1px'");
		l.setAttribute("onmouseup", "this.firstChild.style.left = '0px'; this.firstChild.style.top = '0px'");
		l.innerHTML = 
			'<span style="position: relative; left: 0px; top: 0px;">' +
			//'<img src="data:image/gif," width=10 height=8> ' +
			'<span style="font-size: 1.3em; padding-right: 5px; color: #2c2;">&raquo;</span>' +
			'<span style="font-weight: bold;">Install this script</span></span>';
		div.appendChild(l);
		a[i].insertBefore(div, a[i].firstChild);
	}

})();