利用者:CES1596/aozora2ws.js

提供:Wikisource

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

  • Firefox / Safari: Shift を押しながら 再読み込み をクリックするか、Ctrl-F5 または Ctrl-R を押してください (Mac では ⌘-R)
  • Google Chrome: Ctrl-Shift-R を押してください (Mac では ⌘-Shift-R)
  • Internet Explorer / Microsoft Edge: Ctrl を押しながら 最新の情報に更新 をクリックするか、Ctrl-F5 を押してください
  • Opera: Ctrl-F5を押してください
//
// このスクリプトは[[利用者:Sakoppi/aozora converter.js]](2016-03-15T14:52:29‎)をもとに作成しています。
//
//	License: CC-0
//	2016/02/12 完成
//	2016/03/08 修正
//
mw.loader.load(mw.config.get("wgServer") + mw.config.get("wgScript") + "?action=raw&ctype=text/javascript&title=" + mw.util.wikiUrlencode("利用者:CES1596/jisx0213.js"), "text/javascript");

window.onload = function(){
	var namespaceNumber = mw.config.get('wgNamespaceNumber');
	if (namespaceNumber !== 0) return;
	
	//
	//編集画面の時にボタンを設置
	//
	if( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) {
		$(".editButtons").append("<input id='aozora_btn' title='青空文庫方式の書式をウィキ記法に変換' type='button' value='青空文庫コンバーター(XHTML)'/>");
	}
	
	//
	//	青空文庫コンバーター本体
	//
	$(document).on("click", ".editButtons #aozora_btn", function(){
		var new_text = "";
		var note_text = "";
		var dialog_html = "";
		
		$("#aozora_btn").val("青空文庫コンバーター(XHTML) 実行中...");
		
		var book_info = [];
		
		var original_text = $("#editform textarea").val();
		
		//
		//	必要のないheadタグ内、html、bodyタグを除去
		//
		new_text = replace_func(original_text, "^(\n|.)*</head>", "");
		new_text = replace_func(new_text, "<(/|)body>", "");
		new_text = replace_func(new_text, "<(/|)html>", "");
		
		//
		// XHTMLのルビタグをWiki記法のrubyテンプレートに変換
		//	[<ruby><rb>xx</rb><rp>(</rp><rt>yy</rt><rp>)</rp><ruby>] -> [{{r|xx|yy}}]
		//
		new_text = replace_func(new_text, "<ruby><rb>(.*?)</rb><rp>(</rp><rt>(.*?)</rt><rp>)</rp></ruby>", "{{r|$1|$2}}");
		
		//
		//	XHTMLの改行記号を改行に変更
		//	[<br />] -> [\n]
		//
		new_text = replace_func(new_text, "<br(/|| /)>", "\n");
		
		//
		//	Wiki記法の脚注に変更
		//	span.notes -> ref
		//
		new_text = replace_func(new_text, '<span class="notes">(.*?)</span>',"{{註|$1}}");

		//
		//	Wiki記法の傍点に変更
		//
		new_text = replace_func(new_text, '<strong class="SESAME_DOT">(.*?)</strong>',"{{傍点|$1}}");
		new_text = replace_func(new_text, '<em class="sesame_dot">(.*?)</em>',"{{傍点|$1}}");

		//
		//	Wiki記法のリンクに変更
		//
		new_text = replace_func(new_text, '(https?://www\.aozora\.gr\.jp/)',"(https://www.aozora.gr.jp/ )");

		//先頭行が改行になっているものを除去
		new_text = replace_func(new_text, "^\n", "");

		//aタグを除去
		new_text = replace_func(new_text, "<a (.*?)>(.*?)</a>", "$2");
		
		//h4タグを第2レベル節に変更(字下げ対策)
		new_text = replace_func(new_text, "<div (.*?)>(.*?)<h4 (.*?)>(.*?)</h4>(.*?)</div>", "\n==$4==\n");
		
		//h5タグを第3レベル節に変更(字下げ対策)
		new_text = replace_func(new_text, "<div (.*?)>(.*?)<h5 (.*?)>(.*?)</h5>(.*?)</div>", "\n==$4==\n");
		
		//h4タグを第2レベル節に変更
		new_text = replace_func(new_text, "<h4 (.*?)>(.*?)</h4>", "\n==$2==\n");
		
		//h5タグを第3レベル節に変更
		new_text = replace_func(new_text, "<h5 (.*?)>(.*?)</h5>", "\n===$2===\n");
		
		//外字が含まれているimgタグを数値参照に変換
		var gaiji_exp = new RegExp("<img[ -~]*([0-9]{1,3})-([0-9]{1,3})-([0-9]{1,3}).*?>", "g");
		new_text = new_text.replace(gaiji_exp, function(all, jis_code1, jis_code2, jis_code3){
			var jis_text = ( "0" + jis_code1 ).slice( -1 ) + "-" + ( "0" + jis_code2 ).slice( -2 ) + "-" + ( "0" + jis_code3 ).slice( -2 );
			return encodeUni(jis_text);
		});

		//タイトル・著者を取得
		book_info.title = find_func(new_text, "<h1 class=\"title\">(.*?)</h1>",1);
		book_info.translator = find_func(new_text, "<h2 class=\"translator\">(.*?)</h2>",1);
		book_info.author = find_func(new_text, "<h2 class=\"author\">(.*?)</h2>",1);

		//入力・校正者を取得
		book_info.inputter = find_func(new_text, "\n入力:(.*?)\n",1);
		book_info.proofreader = find_func(new_text, "\n校正:(.*?)\n",1);

		//脚注を取得
		var $new_elem = $(new_text);
		book_info.info_notes = $new_elem.filter(".bibliographical_information").text() + $new_elem.filter(".notation_notes").text();
		book_info.info_notes = replace_func(book_info.info_notes, "\n\n", "<br />\n");
		
		//ノートに掲載する書誌情報を作成
		note_text += "<!--書誌情報:ここから下をノートに転記-->\n";
		note_text += "{{textinfo \n";
		note_text += "|edition=" + book_info.info_notes + "\n";
		note_text += "|source=https://www.aozora.gr.jp/cards/<!--ここを消して青空文庫図書カードのURLを入力-->\n";
		note_text += "|contributors=[[User:CES1596]]<!--あなたの利用者名-->\n";
		note_text += "|proofreaders=\n";
		note_text += "|progress=100%\n";
		note_text += "|notes={{青空文庫|inputter=" + book_info.inputter + "|proofreader=" + book_info.proofreader + "}}\n";
		note_text += "}}\n";
		note_text += "<!--ここから上をノートに転記-->\n\n";

		//
		//ヘッダと本文を出力
		//
		var pub_text = "{{header\n";
		pub_text += "|title=" + book_info.title + "\n";
		pub_text += "|year=" + "\n";
		pub_text += "|author="+ book_info.author +"\n";
		pub_text += "|translator=" + book_info.translator + "\n";
		pub_text += "|edition=yes\n";
		pub_text += "|notes=\n";
		pub_text += "* 書誌情報の詳細は[[{{TALKPAGENAME}}|議論ページ]]をご覧ください。\n";
		pub_text += "{{DEFAULTSORT:<!--ここを消してソートキーを入力-->}}\n";
		//<includeonly>
		pub_text += "[[Category:青空文庫からインポートしたテキスト]]\n";
		pub_text += "{{Textquality|100%}}\n";
		pub_text += "}}\n";
		pub_text += $new_elem.filter("div.main_text")[0].innerHTML;
		pub_text += "<!--著作権の状況に応じて以下のタグを適切なものに置き換えてください-->\n{{PD-old}}\n";
		//</includeonly>
		
		$("#editform textarea").val(note_text + pub_text);
		$("#aozora_btn").val("青空文庫コンバーター(XHTML) 変換完了");
	});
	
	//
	//	テキストを置換する関数
	//
	function replace_func(original_text, regix_text, after_text){
		var regix_exp = new RegExp(regix_text, 'g');
		return original_text.replace(regix_exp, after_text);
	}
	
	//
	//	テキストを検索する関数
	//
	function find_func(find_text, regix_text, pos){
		var regix_exp = new RegExp(regix_text);
		var regix_ret = find_text.match(regix_exp);
		if(regix_ret != null){
			return regix_ret[pos];
		}else{
			return "";
		}
		 
	}
};