pylonshqのWikiのソースを表示するGreasemonkey

pylonshqの文書を翻訳する時にソースをコピーする手間を軽減する、極めて狭い範囲の人にしか役に立たないGreasemonkeyスクリプト

// ==UserScript==
// @name           Pylonsdoc View Source
// @namespace      http://d.hatena.ne.jp/nozom/
// @include        http://wiki.pylonshq.com/display/*
// @include        http://wiki.pylonshq.com/pages/viewpage.action*
// ==/UserScript==

(function(){
    function getElementsByXPath(xpath, doc, context) {
        if (doc == null) doc = document;
        if (context == null) context = doc;
        var it = doc.evaluate(xpath, context, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

	var nodes = new Array();

        var node;
        while ((node = it.iterateNext()) != null) {
            nodes.push(node);
        }
        return nodes;
    }

    function onViewSourceClicked(ev) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: ev.target.href,
            onload: function(req) {
                if (req.responseText.match('<div class="padded">[ \n\r]*((?:.|[\r\n])*?)[ \n\r]*</div>')) {
                    var text = RegExp.$1;
                    var win = window.open('', null);
                    win.document.open();
                    win.document.write('<pre>');
                    win.document.write(text.replace(/[\r\n]<br>/g, "\n"));
                    win.document.write('</pre>');
                    win.document.close();
                }
            },
        });

        ev.preventDefault();
        return;
    }

    var info = getElementsByXPath("//a[@accesskey='i']")[0];
    if (info && info.href.match(/\?pageId=(\d+)/)) {
        var pageId = RegExp.$1;
        var a = document.createElement("a");
        a.href = 'http://wiki.pylonshq.com/pages/viewpagesrc.action?pageId=' + pageId;
        // a.target = '_blank';
        a.addEventListener('click', onViewSourceClicked, false);
        a.appendChild(document.createTextNode("View source"));
        var form = getElementsByXPath("//td[@class='pagecontent']/table//tr[position()=1]//td[position()=1]//form")[0];
        if (form != null) {
            form.parentNode.insertBefore(a, form);
        }
    }
})()

これまでに翻訳した文書一覧

ちなみに、Pylons 日本語で翻訳を公開している人のほとんどは同じ会社の人だったりする。