Fw: document.evaluateの最後の引数

3:14 - document.evaluateの最後の引数

var l = 10000, xp = null;
console.time("reuse");
for (var i=0; i<l; i++) {
    xp = document.evaluate('//a', document, null, 0, xp);
}
console.timeEnd("reuse");
console.time("null")
for(var i=0; i<l; i++){
    xp = document.evaluate('//a', document, null, 0, null);
}
console.timeEnd("null");
reuse: 4625ms
null: 5687ms

$gと、nisefastforward5修正しておいた。


ちなみに、Mozilla1.8だとこのへん。

http://mxr.mozilla.org/mozilla1.8/source/extensions/transformiix/source/xpath/nsXPathEvaluator.cpp#131

http://mxr.mozilla.org/mozilla1.8/source/extensions/transformiix/source/xpath/nsXPathExpression.cpp#72

aInResultってのが第5引数で、do_QueryInterfaceした後、なければ作るみたいな処理をしてる。

XPath式の内容や、コンテキストノードの指定などとは関係ないみたい。

JavaScript: use

var use = function(src, F){
    var s = document.createElement("script");
    s.type = "text/javascript";
    s.src = src;
    if (typeof(F) === "function") s.onload = F;
    document.getElementsByTagName("head")[0].appendChild(s);
};
use("http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js", init);

新しいところは何もない。

Bookmarklet: makeTOC

javascript:(function(){
var resolver = function(){
    return (document.contentType == "text/html") ? "" : "http://www.w3.org/1999/xhtml";
};
var xp = document.evaluate('/descendant::*[self::x:h1 or self::x:h2 or self::x:h3 or self::x:h4 or self::x:h5 or self::x:h6]', document, resolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var ul = document.createElement("ul");
ul.style.textAlign = "left";
for (var i=0,l=xp.snapshotLength; i<l; i++) {
    (function(node){
        var li = document.createElement("li");
        li.style.marginLeft = (20 * (node.nodeName[1]-1)) + "px";
        li.style.listStyleType = (node.nodeName[1]%2 == 1) ? "disc" : "circle";
        li.innerHTML = '<a href="javascript:void(0);">' + node.textContent + '</a>';
        li.addEventListener("click", function(e){ node.scrollIntoView(true); }, false);
        ul.appendChild(li);
    })(xp.snapshotItem(i));
}
document.body.insertBefore(ul, document.body.firstChild);
})();

makeTOC


h[1-6]要素を集めて目次を作るブックマークレット - mayokara note

以前作ったこれをXPath仕様に直したもの。

言うまでもなくIEでは動きません。

Bookmarklet: Parent Folder

javascript:(function(){
if (location.hash) location.hash = "";
else if (location.search) location.search = "";
else if (location.pathname !== "/") location.href = /\/$/.test(location.pathname) ? "../" : "./";
else {
    var ary = location.hostname.split("."), last2 = ary.slice(-2);
    if (last2[0].length === 2 && last2[1].length === 2) ary.splice(-2, 2, last2.join("."));
    if (ary.length === 3 && ary[0] !== "www") location.hostname = "www." + ary.slice(1).join(".");
    else if (ary.length > 2) location.hostname = ary.slice(1).join(".");
}
})();

Up


今まで「Parent Folder」っていう拡張機能を使ってたんだけど、良く考えればブックマークツールバーにこれ入れるだけで十分だということに気づいた。

1つ上に移動するしかできないけど、それ以上の複雑な指定がしたい場合はminibuffer-m-extends.user.jscdでやればいい。

「HSVGalaxy」をIEでも見れるようにした

HSVGalaxy

IE6でもembed使わなくていいみたい。

object/param[@name="movie"]/@valueにswfのURL与えるだけで動いた。

JavaScript: createTable

var createTable = function(array, caption){
    var table = document.createElement("table");
    if (caption) table.createCaption().innerHTML = caption;
    array.forEach(function(v){
        var row = table.insertRow(-1);
        v.forEach(function(v){
            row.insertCell(-1).innerHTML = v;
        });
    });
    return table;
};
dirxml(createTable([[1,2,3],[4,5,6]], "example"))
/* ->
<table>
    <caption>example</caption>
    <tbody>
        <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
        </tr>
        <tr>
            <td>4</td>
            <td>5</td>
            <td>6</td>
        </tr>
    </tbody>
</table>
*/
  • table.rows[index]
  • row.cells[index]
  • table.insertRow(index)
  • table.deleteRow(index)
  • row.insertCell(index)
  • row.deleteCell(index)

あたりで操作する。

insertするときindexに-1を入れると最後にinsertされる。

JavaScript: DOMParserほか

Fw: jAutoPagerize、Fast Look up Alc

jAutoPagerize – Userscripts.org

本家から乗り換えた。

Firefox2でも動いてる。

コードがきれい。

何となく軽量版作ろうかと思ってたけど、特に革新的なアイデアがあるわけでもなし、もういいやって感じになった。

任意の位置をダブルクリックでON/OFFが切り替えられるのがグッド。


Fast Look up Alc – Userscripts.org

あと、これがすごい便利。

英単語ダブルクリック(あるいは普通に選択)で英和辞書がひける。

マウスオーバーと違って、指示したときだけ動くというあたりが良い。

Greasemonkey: draggable_textarea.user.js

draggable_textarea.user.js

任意textarea右下16px平方、ドラッグ→リサイズ。


textarea の大きさの呪縛から逃れるための GM スクリプト < 22 < March < 2006 < nulog, NULL::something : out of the headphone

の再発明(というか複製)。

document.getBoxObjectForを使ったり、XPathを使わなかったり。

便利便利。

JavaScript: 2つの文字列の共通部分を取る

var findDupSubstring = function(a, b){
    if (a.length < b.length) {var t=a;a=b;b=t;}
    var ary = b.split("").map(function(c){return (/^\W$/).test(c) ? "\\"+c : c;});
    var reStr = ary.pop();
    var buf = [reStr, reStr = ary.pop() + reStr + "?"];
    for (var i=ary.length; i-->0; ) {
        buf.push(reStr = ary[i] + "(?:" + reStr + ")?");
    }
    var matches = a.match(new RegExp(buf.reverse().join("|"), "g"));
    return matches ? matches.sort(function(a,b){return b.length-a.length;})[0]
                   : "";
};

/a(?:b(?:cd?)?)?|b(?:cd?)?|cd?|d/gを作ってmatch、最長のものを返す。