MediaWiki:Common.js/NormalizeCharWidth.js

提供: ひつじ小屋別館2代目
< MediaWiki:Common.js
2013年8月4日 (日) 19:32時点におけるしが (トーク | 投稿記録)による版 (1版)

(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

注意: 保存後、変更を確認するにはブラウザーのキャッシュを消去する必要がある場合があります。

  • Firefox / Safari: Shift を押しながら 再読み込み をクリックするか、Ctrl-F5 または Ctrl-R を押してください (Mac では ⌘-R)
  • Google Chrome: Ctrl-Shift-R を押してください (Mac では ⌘-Shift-R)
  • Internet Explorer: Ctrl を押しながら 最新の情報に更新 をクリックするか、Ctrl-F5 を押してください
  • Opera: ツール → 設定 からキャッシュをクリアしてください。
/*
	全角・半角正規化スクリプト

	「表示」ボタンを押したときに、テキストボックス内の
	全角 / 半角文字を[[WP:NC]]に沿ったものに変換します。
 */

(function () {
var NORMALIZATION_TABLE = {
	//全角記号
	'!': '!', '$': '$', '%': '%', '*': '*', '+': '+',
	',': ',', '-': '-', '.': '.', '/': '/', '^': '^',
	/* ':': ':', */ ';': ';', '?': '?', '@': '@',
	//全角数字
	'0': '0', '1': '1', '2': '2', '3': '3', '4': '4',
	'5': '5', '6': '6', '7': '7', '8': '8', '9': '9',
	//全角アルファベット
	'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e', 'f': 'f', 'g': 'g',
	'h': 'h', 'i': 'i', 'j': 'j', 'k': 'k', 'l': 'l', 'm': 'm', 'n': 'n',
	'o': 'o', 'p': 'p', 'q': 'q', 'r': 'r', 's': 's', 't': 't', 'u': 'u',
	'v': 'v', 'w': 'w', 'x': 'x', 'y': 'y', 'z': 'z',
	'A': 'A', 'B': 'B', 'C': 'C', 'D': 'D', 'E': 'E', 'F': 'F', 'G': 'G',
	'H': 'H', 'I': 'I', 'J': 'J', 'K': 'K', 'L': 'L', 'M': 'M', 'N': 'N',
	'O': 'O', 'P': 'P', 'Q': 'Q', 'R': 'R', 'S': 'S', 'T': 'T', 'U': 'U',
	'V': 'V', 'W': 'W', 'X': 'X', 'Y': 'Y', 'Z': 'Z',
	//半角カナ記号
	'。': '。', '「': '「', '」': '」', '・': '・', '、': '、',
	'゙': '゛', '゚': '゜', 'ー': 'ー',
	//半角カナ
	'ア': 'ア', 'イ': 'イ', 'ウ': 'ウ', 'エ': 'エ', 'オ': 'オ',
	'ァ': 'ァ', 'ィ': 'ィ', 'ゥ': 'ゥ', 'ェ': 'ェ', 'ォ': 'ォ',
	'カ': 'カ', 'キ': 'キ', 'ク': 'ク', 'ケ': 'ケ', 'コ': 'コ',
	'サ': 'サ', 'シ': 'シ', 'ス': 'ス', 'セ': 'セ', 'ソ': 'ソ',
	'タ': 'タ', 'チ': 'チ', 'ツ': 'ツ', 'テ': 'テ', 'ト': 'ト', 'ッ': 'ッ',
	'ナ': 'ナ', 'ニ': 'ニ', 'ヌ': 'ヌ', 'ネ': 'ネ', 'ノ': 'ノ',
	'ハ': 'ハ', 'ヒ': 'ヒ', 'フ': 'フ', 'ヘ': 'ヘ', 'ホ': 'ホ',
	'マ': 'マ', 'ミ': 'ミ', 'ム': 'ム', 'メ': 'メ', 'モ': 'モ',
	'ヤ': 'ヤ', 'ユ': 'ユ', 'ヨ': 'ヨ', 'ャ': 'ャ', 'ュ': 'ュ', 'ョ': 'ョ',
	'ラ': 'ラ', 'リ': 'リ', 'ル': 'ル', 'レ': 'レ', 'ロ': 'ロ',
	'ワ': 'ワ', 'ヲ': 'ヲ', 'ン': 'ン',
	//その他
	'~': '〜', '~': '〜', ' ': ' '
};
var NORMALIZATION_TABLE_DAKUTEN = {
	'ウ゛': 'ヴ',
	'カ゛': 'ガ', 'キ゛': 'ギ', 'ク゛': 'グ', 'ケ゛': 'ゲ', 'コ゛': 'ゴ',
	'サ゛': 'ザ', 'シ゛': 'ジ', 'ス゛': 'ズ', 'セ゛': 'ゼ', 'ソ゛': 'ゾ',
	'タ゛': 'ダ', 'チ゛': 'ヂ', 'ツ゛': 'ヅ', 'テ゛': 'デ', 'ト゛': 'ド',
	'ハ゛': 'バ', 'ヒ゛': 'ビ', 'フ゛': 'ブ', 'ヘ゛': 'ベ', 'ホ゛': 'ボ',
	'ハ゜': 'パ', 'ヒ゜': 'ピ', 'フ゜': 'プ', 'ヘ゜': 'ペ', 'ホ゜': 'ポ'
};
function normalizeCharWidth(src) {
	//利用者(会話)名前空間と特別ページは除外
	if(src.search(/^\s*(利用者(‐会話)?|User( talk)?|特別|Special):/i) != -1)
		return src;
	
	src = src.replace(/./g, function(m) { return NORMALIZATION_TABLE[m] || m; });
	var reg = /([ウカキクケコサシスセソタチツテト]゛|[ハヒフヘホ][゛゜])/g;
	return src.replace(reg, function(m) { return NORMALIZATION_TABLE_DAKUTEN[m] || m; });
}

addOnloadHook(function() {
	var is_msie = window.attachEvent && !window.opera;
	var boxButtonPairs = [];
	function appendPair(text, submit) {
		if (text && submit) {
			boxButtonPairs.push([text, submit]);
		}
	}
	
	appendPair(
		document.getElementById('searchInput'),
		document.getElementById('searchGoButton')
	);
	
	// <inputbox> で追加される検索フォーム
	var additionalSearchBox = document.getElementById('searchbox');
	if(additionalSearchBox) {
		appendPair(
			additionalSearchBox.elements.namedItem('search'),
			additionalSearchBox.elements.namedItem('go')
		);
	}

	for(var i = 0; i < boxButtonPairs.length; i++) (function(inputBox, goButton) {
		if (!goButton) return;

		addClickHandler(goButton, function(e) {
			inputBox.value = normalizeCharWidth(inputBox.value);
		});
		if(is_msie) { //MSIEでもEnterキーによる送信時にイベントを発生させる
			addHandler(inputBox, 'keydown', function(e) {
				if(window.event.keyCode == 13) //13: Enter
					inputBox.value = normalizeCharWidth(inputBox.value);
			});
		}
	})(boxButtonPairs[i][0], boxButtonPairs[i][1]);
});

})();