はてなダイアリーのカテゴリー一括変更レット

  • /*
     * @title はてなダイアリーのカテゴリー一括変更レット
     * @description 過去の記事一覧画面をカテゴリーで絞った状態でブックマークレットとして使うと起動します。(2011/06/24 動作確認)
     * @include http://d.hatena.ne.jp/*
     * @license MIT License
     * @require jQuery
     */
    
    if (location.href.indexOf('archive?mode=edit&word=') == -1) {
        alert('はてなダイアリーの過去の記事画面で実行してください。');
        return;
    }
    
    if ($('select[name=word]').val() == '') {
        alert('カテゴリーを指定してください。');
        return;
    }
    
    var readme = '\
    -=== 注意事項 ===-\n\
    必ずデータのバックアップを事前に取った上で実行してください。\n\
    動作確認は行っていますが万一データの破損・消去が行われた場合の責任は負いかねます。\n\
    以上をご了承頂いた上でご利用ください。\n\
    ';
    
    if (!confirm(readme)) return;
    
    var oldCat = $('div#main-inner select[name=word] option:selected').text();
    var newCat = prompt('新しいカテゴリー名を入力してください。', oldCat);
    
    var isValid = false;
    (function () {
        if (newCat == null) return alert('空文字は指定できません。');
        if (newCat == oldCat) return alert('同じ値は指定できません。');
        if (newCat.match(/[\[\]]/)) return alert('[]を含めないでください。');
        if (!confirm(oldCat + ' -> ' + newCat + ' にカテゴリーを更新します。\よろしいですか?')) return;
        isValid = true;
    })();
    if (!isValid) { alert('終了します。再度実行してください。'); return; }
    
    alert('処理を開始します。完了メッセージが出るまでお待ちください。');
    
    var editLinks = $('table.table-list td.line-right a:contains("編集")'); // 記事編集リンクの取得
    
    // iframe の準備
    var ifr = document.createElement('iframe');
    //ifr.style.display = 'none'; // 非表示だとfirefoxがsubmitしてくれない・・・
    ifr.width = ifr.height = 0; // コソーリ
    document.body.appendChild(ifr);
    
    // busyフラグ
    var isBusy = false;
    
    // 更新処理
    var updateCat = function(link) {
        ifr.src = link.href;
        ifr.onload = function () {
            var iDoc = ifr.contentDocument;
            var entryBody = $('textarea[name=body]', iDoc);
            var b = entryBody.val();
            var b = b.replace(/^\*.*?\*(\[.+?\])+/mg, function (p) {
                return p.replace(/\[(.+?)\]/g, function(cat, catName) {
                    if (catName == oldCat) cat = '[' + newCat + ']';
    	        return cat;
                });
            });
            entryBody.val(b);
            $('div#main-inner form[name=edit] input[name=trivial]', iDoc)
                .attr('checked', true); // ちょっとした更新
         $($('div#main-inner form[name=edit] input[type=submit][name=edit]',
                iDoc).get(0)).trigger('click'); 
            ifr.onload = function () { isBusy = false; };
        };
    };
    
    // 終了時
    var finished = function() {
        alert('カテゴリーの更新が完了しました。ページを更新して確認してください。\n\
    複数ページにわたっている場合は再度実行してください。\n\
    また設定>編集設定のカテゴリー情報は更新しませんので、必要に応じて手動で編集してください。\n');
    };
    
    // ループ処理
    var i = 0;
    var timer = setInterval(function() {
        if (!isBusy) {
            isBusy = true;
    
            // 終了チェック
            if (i == editLinks.length) { clearInterval(timer); finished(); return; }
            updateCat(editLinks[i++]);
        }
    }, 500);
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2012/07/16 20:54:47 - 2012-07-16