ForkAPage
ナビゲーションに移動
検索に移動
ForkAPageとは、MediaWikiサイト用ガジェットである。
概要[編集]
あるページを別のページに複製するガジェット。自動で複製元のページへリンクを張ってくれる。
作成者は青子守歌氏で、CC BY-SA 3.0での配布が許可されている。
ソース[編集]
以下のコードをあなたの利用者ページのcommon.jsにコピペしてください。
//************************************************************************/
// >Fork A Page
// >ページを別のページへ複製する
// >作者:Wikipediaの青子守歌氏
// >URL: https://ja.wikipedia.org/wiki/User:aokomoriuta
// >詳しい使い方は、[[jawp:ヘルプ:ページ複製ガジェット]]を参照。
// >
// >==変更内容==
// >・タグ「ページ複製ガジェットによる編集」の適用を解除(Enpediaに存在せず、エラーになるため)
// >
// >== ライセンス ==
// >* CC BY-SA 3.0 非移植として公開可能
/************************************************************************/
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]]の[[特別:固定リンク/$3|$2版]]より複製 ([[H:FAP|スクリプト]]による) $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();
// 複製先ページ指定ダイアログを作成して
$("<div />")
.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($("<div />")
.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($("<div />")
.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"));
}
// 結果が違ったら
else
{
// 不明なエラー表示
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");
}}
]
});
}
// 存在してなかったら
else
{
// ページ編集
editPage();
}
}
}
// 取得出来なかったら
else
{
// エラー表示
alert(mw.msg("forkapage-dialog-error"));
// ダイアログを閉じる
$dialog.dialog("close");
}
}
);
}
}]
});
});
}
});