MediaWiki:Gadget-ForkAPage.js
//************************************************************************/
// ja> = Fork A Page =
//   > ウィキペディア内のページを別のページへ複製する
//   > ;作者: 青子守歌
//   > ;URL: https://ja.wikipedia.org/wiki/User:aokomoriuta
//   >
//   > 詳しい使い方は、ヘルプ:ページ複製ガジェットを参照してください。
//   >
//   > == ライセンス ==
//   > このスクリプトは、複数ライセンスで利用可能です。
//   > 選択可能なライセンスは次の通り:
//   > * クリエイティブ・コモンズ 表示-継承 3.0 非移植
//   > * クリエイティブ・コモンズ 表示-非営利 3.0 非移植
//   > * GNU一般公衆利用許諾書 バージョン3.0以降
/************************************************************************/
// en> = Fork A Page =
//   > This script copies a page to another page
//   > ;author: 青子守歌
//   > ;URL: https://ja.wikipedia.org/wiki/User:aokomoriuta
//   >
//   > Documentation is available at Help:ページ複製ガジェット
//   >
//   > == License ==
//   > This script is multi-licensed.
//   > You can select the license of your choice from as following:
//   > * Creative Commons Attribution-ShareAlike 3.0 Unported
//   > * Creative Commons Attribution-Noncommercial 3.0 Unported
//   > * GNU General Public License v3.0 or later
/************************************************************************/
jQuery(function($)
{
// 特別ページでなければ
if(mw.config.get("wgNamespaceNumber") != -1)
{
// jQueryUIを使用
mw.loader.load("jquery.ui");
// メッセージを追加
mw.messages.set({
"forkapage-tab-label"        : "複製",
"forkapage-tab-tooltip"      : "このページを複製する",
"forkapage-dialog-title"     : "ページを複製",
"forkapage-dialog-helplink"  : "https://ja.wikipedia.org/wiki/H:FAP",
"forkapage-dialog-helplabel" : "使用方法の解説",
"forkapage-dialog-header"    : "複製先の設定",
"forkapage-dialog-forkto"    : "複製先のページ名:",
"forkapage-dialog-reason"    : "複製する理由:",
"forkapage-dialog-fork"      : "複製する",
"forkapage-dialog-error"     : "不明なエラーが発生しました。",
"forkapage-override-header"  : "上書き確認",
"forkapage-override-exists"  : "複製先ページ「$1」は存在します。",
"forkapage-override-time"    : "最終更新日時",
"forkapage-override-user"    : "最終更新利用者",
"forkapage-override-ask"     : "上書きしますか?",
"forkapage-override-yes"     : "はい",
"forkapage-override-no"      : "いいえ",
"forkapage-edit-header"      : "編集中",
"forkapage-edit-move"        : "編集が完了すると自動的に複製先「$1」を開きます。",
"forkapage-edit-summary"     : "$1の$2版より複製 (スクリプトによる) $4",
"forkapage-edit-error"       : "編集中にエラーが発生しました。\n(エラーコード: $1、エラーの詳細: $2)",
"forkapage-edit-captcha"     : "編集中にエラーが発生しました。\n(エラーの詳細: キャプチャの手動入力が必要)",
"forkapage-edit-unknown"     : "編集中に不明なエラーが発生しました。"
});
// 複製タブを追加
$(mw.util.addPortletLink("p-cactions", "#", mw.msg("forkapage-tab-label"), "ca-fork", mw.msg("forkapage-tab-tooltip"), null, "#ca-move"))
// このタブがクリックされたら
.click(function(e)
{
// イベントキャンセル
e.preventDefault();
// 複製先ページ指定ダイアログを作成して
$("")
.attr({
"id": "forkapage-dialog",
"title": mw.msg("forkapage-dialog-title")
})
.append($("<a />")
.attr({
"href": mw.msg("forkapage-dialog-helplink"),
"style": "display: block; text-align: right"
})
.text(mw.msg("forkapage-dialog-helplabel"))
)
.append($("<h2 />")
.text(mw.msg("forkapage-dialog-header"))
)
.append($("<form />")
.append($("")
.append($("<label />")
.attr("for", "forkapage-forkto")
.text(mw.msg("forkapage-dialog-forkto"))
)
.append($("<input />")
.attr({
"id": "forkapage-forkto",
"type" : "text"
})
// 複製先のページ名に今のページ名を入力済
.val(mw.config.get("wgPageName"))
)
)
.append($("")
.append($("<label />")
.attr("for", "forkapage-reason")
.text(mw.msg("forkapage-dialog-reason"))
)
.append($("<input />")
.attr({
"id": "forkapage-reason",
"type" : "text"
})
)
)
)
// ダイアログ表示
.dialog({
"minHeight": 50,
"width": "auto",
"modal": true,
// ボタンが
"buttons": [{
"text": mw.msg("forkapage-dialog-fork"),
// クリックされたら
"click": function()
{
// ダイアログ本体を保存
var $dialog = $(this);
// 複製先タイトルを取得
var forkToTitle = $dialog.find("#forkapage-forkto").val();
// ページを編集するメソッド
var editPage = function()
{
// ダイアログのボタンを隠す
$dialog.dialog({"buttons": []});
// 複製元の最新版を取得
$.getJSON(mw.util.wikiScript("api"),{
"format": "json",
"action": "query",
"titles": mw.config.get("wgPageName"),
"prop": "revisions",
"rvprop": "timestamp|content|ids"
}, function(result)
{
for(var key in result.query.pages)
{
// 複製元の最終版の中身を取得
var lastRevision = result.query.pages[key].revisions[0];
// ダイアログに編集中を追加
$dialog
.append($("<h2 />").text(mw.msg("forkapage-edit-header")))
.append($("<p />").text(mw.msg("forkapage-edit-move", forkToTitle)));
// 複製先を編集
var reason = $dialog.find("#forkapage-reason").val();
reason = reason ? ": " + reason : "";
$.ajax({
url: mw.util.wikiScript("api"),
data: {
format: 'json',
action: 'edit',
title: forkToTitle,
summary: mw.msg("forkapage-edit-summary",
mw.config.get("wgPageName"),
lastRevision.timestamp,
lastRevision.revid,
reason),
text: lastRevision["*"],
token: mw.user.tokens.get("csrfToken")
},
dataType: 'json',
type: 'POST',
success: function(result)
{
// 編集に成功したら
if(result && result.edit && result.edit.result == "Success" )
{
// 複製先に移動
location.href = mw.util.getUrl(forkToTitle);
}
// エラーが返ってきたら
else if(result && result.error)
{
// エラー表示
alert(mw.msg("forkapage-edit-error", result.error.code, result.error.info));
}
// キャプチャの手動入力を求められ編集に失敗したら
else if(result && result.edit && result.edit.captcha)
{
alert(mw.msg("forkapage-edit-captcha"));
}
// 結果が違ったら
{
// 不明なエラー表示
alert(mw.msg("forkapage-edit-unknown"));
}
// ダイアログを閉じる
$dialog.dialog("close");
}
});
}
}
);
};
// 複製先の最新版を取得
$.getJSON(mw.util.wikiScript("api"),{
"format": "json",
"action": "query",
"titles": forkToTitle,
"prop": "revisions",
"rvprop": "timestamp|user"
}, function(result)
{
// ページが取得できていれば
if(result && result.query && result.query.pages)
{
for(var key in result.query.pages)
{
// 複製先が存在していれば
if(key != -1)
{
// 複製先の最終更新版を取得
var lastRevision = result.query.pages[key].revisions[0];
// ダイアログに上書き確認を追加
$dialog
.append($("<h2 />").text(mw.msg("forkapage-override-header")))
.append($("<p />").text(mw.msg("forkapage-override-exists", forkToTitle)))
.append($("<dl />")
.append($("<dt />").text(mw.msg("forkapage-override-time")))
.append($("<dd />").text(lastRevision.timestamp))
.append($("<dt />").text(mw.msg("forkapage-override-user")))
.append($("<dd />").text(lastRevision.user))
.append($("<p />").text(mw.msg("forkapage-override-ask")))
);
// ボタンをはい/いいえに変更
$dialog.dialog({"buttons": [{
"text": mw.msg("forkapage-override-yes"),
// 上書き可なら
"click": function()
{
// ページ編集
editPage();
},{
"text": mw.msg("forkapage-override-no"),
// 上書き不可なら
"click": function()
{
// ダイアログを閉じる
$dialog.dialog("close");
}
]
});
}
// 存在してなかったら
{
// ページ編集
editPage();
}
}
}
// 取得出来なかったら
{
// エラー表示
alert(mw.msg("forkapage-dialog-error"));
// ダイアログを閉じる
$dialog.dialog("close");
}
}
);
}
}]
});
});
}
});