はてなダイアリーのカテゴリー一括変更レット
by
md2tak
2011-06-24 [2011/06/24 13:51:39]
過去の記事一覧画面をカテゴリーで絞った状態でブックマークレットとして使うと起動します。(2011/06/24 動作確認)
-
/*
* @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 です。