利用者:Sakoppi/Gadget-char-convert0.js

提供: Wikisource
ナビゲーションに移動 検索に移動

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

  • Firefox / Safari: Shift を押しながら 再読み込み をクリックするか、Ctrl-F5 または Ctrl-R を押してください (Mac では ⌘-R)
  • Google Chrome: Ctrl-Shift-R を押してください (Mac では ⌘-Shift-R)
  • Internet Explorer: Ctrl を押しながら 最新の情報に更新 をクリックするか、Ctrl-F5 を押してください
  • Opera: メニュー → 設定 (Mac では Opera → 環境設定) に移動し、プライバシーとセキュリティ → 閲覧データを消去 → キャッシュされた画像およびファイル からキャッシュをクリアしてください。
// _________________________________________________________________________________________
// |                                                                                         |
// |                    === WARNING: GLOBAL GADGET FILE ===                                  |
// |                  Changes to this page affect many users.                                |
// | Please discuss changes on the talk page or on [[Wikipedia_talk:Gadget]] before editing. |
// |_________________________________________________________________________________________|
//
// Imported from [[User:Hiro3600/char-convert0.js]]
// SHORT_DESCRIPTION, see [[User:Hiro3600/char-convert0.js]]
//  _________________________________________________________________________________________
// |                                                                                         |
// |                    === 注意 サイト全体に影響するファイルです ===                             |
// |                  このページを変更すると多数の利用者にその影響が及びます                         |
// | 変更する前に[[MediaWiki・トーク:Gadgets-definition]] でよく議論し、動作テストを行ってください。|
// |_________________________________________________________________________________________|
//
// このガジェットは [[User:Hiro3600/char-convert0.js]] から 2015-10-24に取り込んだものです。
// [[利用者:CES1596/char-convert0.js]]による修正(2016-02-29取り込み)を含む
// 簡単な説明、詳細は[[User:Hiro3600/char-convert0.js]]を参照してください。

// ボタン操作により、
// 辞書ファイル及びclassがk-ancient1(「テンプレート:異体字使用」)の定義を元に変換テーブルを作成し
// classがmw-body-contentのDIVに対し、旧漢字を代用の漢字に置換 
$(function() {
	var namespaceNumber = mw.config.get('wgNamespaceNumber');
	if (namespaceNumber !== 0 && namespaceNumber != 2) return; //標準とユーザページに適用
	$("#p-namespaces>ul").append($("<li><span><a>常用</a></span></li>").attr({'id': 'cnv_btn1','title':'常用漢字に変換'}).css({'color':'#0000ff','cursor':'pointer'}));
	var dicData;
	var dfd = new $.Deferred();
	$(document).on('click','#cnv_btn1:not(.cnv_now)',function(){
		getDic();
		dfd.promise().then(function() {

			var rp_data0 = arrangeData(dicData);
			if ( $('.k-ancient1').length  !== 0) { 
				var rp_data1 = setReplaceData(); //html内の置換定義を取得
				$.extend(rp_data0, rp_data1);  //置換定義をマージ
			}
			
			var txt=  $('.mw-body-content').html();

			$.each(rp_data0, function(key, value){
				txt = txt.replace(new RegExp(key, 'g'),value);
			});
			
			//異体字セレクタ(U+E0100からU+E01EF)の一括削除
			txt = txt.replace(/\uDB40[\uDD00-\uDDEF]/g, "");
			
			$('.mw-body-content').html(txt);
			// 画像フォントをAlt文字に置換 (width<20は一般画像との区分け)
			$('.mw-body-content img[alt]').each(function(i, image) {
				if ($(image).width() < 20) $(image).replaceWith(document.createTextNode(image.alt));
			});

			//原文に戻すボタンに置き換え
			$('#cnv_btn1, #cnv_btn1 span a').html("<span><a>原文</a></span>").addClass("cnv_now").attr({'title':'原文表示に戻る'});
			$(this).off();
		});
	});
	
	//原文に戻るボタン(リロード処理)
	$(document).on("click", "#cnv_btn1.cnv_now",function(){
		$(this).off();
		window.location.reload();
	});
	//ページ内の置換文字定義を取得(区切り文字「は」→「:」、「、」→「,」に置換)
	function setReplaceData(){
		var str0 = $('.k-ancient1').text().replace(/は/g,"\":\"").replace(/、/g,"\", \"");
		var strj = $.parseJSON("{\"" + str0 + "\"}");
		return strj;
	}

	//辞書データの取得
	function getDic() {
		var pageids = "16658"; //辞書ページのPAGEIDS:"16658"
		var dAstr = "*"; //データの中のマーカー
		$.ajax({
			type: "GET",
			scriptCharset: "utf-8",
			dataType: "jsonp",
			url: "https://ja.wikisource.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&pageids="+pageids,
		})
		.done(function(json) {
			dicData = json.query.pages[pageids].revisions[0][dAstr];
			dfd.resolve();			
		})
		.fail(function() {
				alert( "辞書読取エラー" );
		});		
	}
	
	// データの整形、ユニコード文字化
	function arrangeData(ddata) {
		var lines = ddata.split( '\n' );
		var strD =[];
		for ( var i = 1; i < lines.length-1; i++ ) {
			if (lines[i].match(/\*\s*([\S]*)\s*[::→]\s*([\S]*)/)) {
				if (strD.length !==0) strD = strD + ", "; 
				strD = strD + "\""+RegExp.$1+"\":\""+RegExp.$2+"\"";
				}
		}
		strD=strD.replace(/&#x([0-9A-F]{4,5});/gi, function(){
			if (arguments[1].length === 4) {
				return unescape("%u" + arguments[1]);
				} 
			else {
				var uni = parseInt(arguments[1], 16) - 0x10000;
				var hi = Math.floor(uni / 0x400) + 0xD800;
				var lo = uni % 0x400 + 0xDC00;
				return unescape("%u" + hi.toString(16) + "%u" + lo.toString(16)); // サロゲートペアに変換
				}
		});

		var strK = $.parseJSON("{" + strD + "}");
		return strK; 
	}
});