foldrr's weblog

旧ブログ http://d.hatena.ne.jp/foldrr/

Mixi ユーザー名付近にリンクを追加する

ユーザー名の近くに以下のリンクを追加する Firefox Greasemonkey スクリプト

  • 最近の日記
  • 最近のコメント
// ==UserScript==
// @name      mixi_user_link_plus
// @namespace http://example.com
// @include   http://mixi.jp/show_log.pl*
// @include   http://mixi.jp/view_bbs.pl?*
// @include   http://mixi.jp/view_diary.pl?*
// ==/UserScript==

(function(){
    const URL_COMMENT = "http://mixi.jp/list_comment.pl?id=";
    const URL_DIARY = "http://mixi.jp/list_diary.pl?id=";
    
    var settings = [
        // 日記
        {
            site: 'view_diary',
            xpath: "//span[@class='commentTitleName']/a[1]",
            text: "日記",
            before: ' | ',
            after: null,
            id_pattern: "id=([0-9]+)$",
            url: URL_DIARY,
            target: "_blank",
        },
        {
            site: 'view_diary',
            xpath: "//span[@class='commentTitleName']/a[1]",
            text: "最近のコメント",
            before: ' | ',
            after: null,
            id_pattern: "id=([0-9]+)$",
            url: URL_COMMENT,
            target: "_blank",
        },
        
        // コミュニティ
        {
            site: 'view_bbs',
            xpath: "//dl[@class='commentContent01']/dt/a[1]",
            text: "<div>日記</div>",
            before: null,
            after: null,
            id_pattern: "id=([0-9]+)$",
            url: URL_DIARY,
            target: "_blank",
        },
        {
            site: 'view_bbs',
            xpath: "//dl[@class='commentContent01']/dt/a[1]",
            text: "<div>最近のコメント</div>",
            before: null,
            after: null,
            id_pattern: "id=([0-9]+)$",
            url: URL_COMMENT,
            target: "_blank",
        },
        
        // 足あと
        {
            site: 'show_log',
            xpath: "//span[@class='name']/a[1]",
            text: "【日記】",
            before: " ",
            after: null,
            id_pattern: "id=([0-9]+)$",
            url: URL_DIARY,
            target: "_blank",
        },
        {
            site: 'show_log',
            xpath: "//span[@class='name']/a[1]",
            text: "【コメント】",
            before: null,
            after: null,
            id_pattern: "id=([0-9]+)$",
            url: URL_COMMENT,
            target: "_blank",
        },
        
        /*
        {
            site: "",
            xpath: "//xxxx/a[1]",
            text: "",
            before: null,
            after: null,
            id_pattern: "id=([0-9]+)$",
            url: "",
            target: "_blank",
        }
        /**/
    ];
    
    
    for(var si = 0, sn = settings.length; si < sn; si++){
        if(0 <= location.href.indexOf(settings[si].site)){
            var nodes = xpath(settings[si].xpath);
            for(var i = 0, n = nodes.length; i < n; i++){
                appendListCommentLink(nodes[i],
                    settings[si].text, settings[si].before, settings[si].after,
                    settings[si].id_pattern,
                    settings[si].url,
                    settings[si].target);
            }
        }
    }
    
    
    function xpath(query) {
        var r = new Array();
        var ns = document.evaluate(query, document, null,
            XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
        for(var i = 0, n = ns.snapshotLength; i < n; i++){
            r.push(ns.snapshotItem(i));
        }
        return r;
    }
    
    
    function appendListCommentLink(node, text, before, after, id_pattern, url, target){
        //var re = new RegExp("id=([0-9]+)$");
        var re = new RegExp(id_pattern);
        var id = (re.exec(node.href) || [])[1];
        if(id){
            if(before){
                node.parentNode.appendChild(document.createTextNode(before));
            }
            
            var link = document.createElement("a");
            link.setAttribute("href", url + id);
            if(target){
                link.target = target;
            }
            link.innerHTML = text;
            node.parentNode.appendChild(link);
            
            if(after){
                node.parentNode.appendChild(document.createTextNode(after));
            }
        }
    }
})();