そのへんにぺろっと貼ってある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;">»</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;">»</span>' + '<span style="font-weight: bold;">Install this script</span></span>'; div.appendChild(l); a[i].insertBefore(div, a[i].firstChild); } })();