プロジェクト:ウィキ技術部/スクリプト開発/trunk/PageMerger.js

/************************************************************************/

// このスクリプトは <<開発途中>> です! 動作しませんので、使用しないでください!

/************************************************************************/

// ページを統合するスクリプト。
// 甲→乙 の統合、および 甲・乙→丙 の新設統合に対応(予定)

/************************************************************************/

jQuery(function($) {
	// 名前空間番号を取得
	var currentNs = mw.config.get('wgNamespaceNumber');
	// 名前空間番号の列記
	var nsList = [
		0, // 標準
		4, // Wikipedia
		12, // Help
		100, // Portal
		102, // プロジェクト
	];
	/*
	・本スクリプトを悪用した荒らしを防ぐため、利用できる名前空間は少なめにしている。
	・ノートページは除外している。
	*/
	
	// 名前空間の条件を満たすか?
	if (nsList.includes(currentNs)) {
		// jQueryUIを使用
		mw.loader.load('jquery.ui');
		
		// 今いるページの存在の有無
		var pageExist = (mw.config.get('wgArticleId') != 0);
		
		// メッセージを定義
		mw.messages.set({
			'pagemerger-tab-label':	'統合',
			'pagemerger-tab-tooltip': '既存のページから統合',
			'pagemerger-mergePage': 'ページの統合',
			'pagemerger-caution-readManuals': '※ 統合に関する方針文書を、必ず事前にご確認ください。',
			'pagemerger-targetPageName': '統合元のページ $1'
		});
		
		// 複製タブを追加。クリックされたら:
		$(mw.util.addPortletLink(
			'p-cactions',
			'#',
			mw.msg('pagemerger-tab-label'),
			'ca-merge',
			mw.msg('pagemerger-tab-tooltip'),
			null, '#ca-info'
		)).click(function(e) {
			// イベントキャンセル
			e.preventDefault();
			
			// css 定義
			mw.util.addCSS(
				'#pagemergerDialog_background {'
					+ 'position: fixed;'
					+ 'height: 100vh;'
					+ 'width: 100vw;'
					+ 'top: 0;'
					+ 'left: 0;'
					+ 'text-align: center;'
					+ 'vertical-align: middle;'
					+ 'background-color: white;'
					+ 'opacity: 0.1;'
				+ '}'
				+ '#pagemergerDialog {'
					+ 'display: inline-block;'
					+ 'margin: 0 auto;'
					+ 'margin-top: 25vh;'
					+ 'min-height: 150px;'
					+ 'width: 70vw;'
					+ 'background-color: whitesmoke;'
					+ 'border-radius: 5px;'
				+ '}'
				+ '.pagemergerDialog_title {'
					+ 'background-color: lightsteelblue;'
					+ 'font-weight: bolder;'
					+ 'font-size: 120%;'
				+ '}'
				+ '.pagemergerDialog_label {'
					+ 'font-weight: bolder;'
				+ '}'
			);
			
			// ダイアログの HTML テキスト
			var dialogHTML_1;
			if (pageExist) {
				dialogHTML_1
					= '<p id="pagemerger-label-page" class="pagemergerDialog_label">' + mw.msg('pagemerger-targetPageName', '') + '</p>'
					+ '<input id="pagemerger-tb-page" class="pagemergerDialog_tb pagemergerDialog_pageName" type="text"'
						+ 'onkeydown="targetPageExist(\'pagemerger-tb-page\');" onkeyup="targetPageExist(\'pagemerger-tb-page\');"'
						+ 'onkeypress="targetPageExist(\'pagemerger-tb-page\');"></input>';
			} else {
				dialogHTML_1
					= '<p id="pagemerger-label-page1" class="pagemergerDialog_label">' + mw.msg('pagemerger-targetPageName', '1') + '</p>'
					+ '<input id="pagemerger-tb-page1" class="pagemergerDialog_tb pagemergerDialog_pageName" type="text"'
						+ 'onkeydown="targetPageExist(\'pagemerger-tb-page\');" onkeyup="targetPageExist(\'pagemerger-tb-page\');"'
						+ 'onkeypress="targetPageExist(\'pagemerger-tb-page\');"></input>'
					+ '<p id="pagemerger-label-page2" class="pagemergerDialog_label">' + mw.msg('pagemerger-targetPageName', '2') + '</p>'
					+ '<input id="pagemerger-tb-page2" class="pagemergerDialog_tb pagemergerDialog_pageName" type="text"'
						+ 'onkeydown="targetPageExist(\'pagemerger-tb-page\');" onkeyup="targetPageExist(\'pagemerger-tb-page\');"'
						+ 'onkeypress="targetPageExist(\'pagemerger-tb-page\');"></input>';
			}
			var dialogHTML
				= '<div id="pagemergerDialog_background">'
					+ '<div id="pagemergerDialog">'
						+ '<p id="pagemergerDialog_title_merge" class="pagemergerDialog_title">'
							+ mw.msg('pagemerger-mergePage')
						+ '</p>'
						+ '<p id="pagemergerDialog_caution1">' + '<u>' + mw.msg('pagemerger-caution-readManuals') + '</u>' + '</p>'
						+ dialogHTML_1
						// 要素を書いていく(作業中)
					+ '</div>'
				+ '</div>'; // 今ここ! (1)
		});
	}
});

function targetPageExist(elId) {
	/*
	elId: 文字列。type="text" の input を指定する
	*/
	el = document.getElementById(elId);
	val = el.value;
	// 今ここ! (2)
}

/************************************************************************/