利用者:Naggy Nagumo/Edit SortSection.js

出典: フリー多機能辞典『ウィクショナリー日本語版(Wiktionary)』
ナビゲーションに移動 検索に移動

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

  • 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を押してください
// <nowiki>

EDIT.セクション並べ替え = {
	実行: function () {
		let 転置回数;

		function 五十音順並べ替え() {
			const テキストボックスID = EDIT.テキストボックスID;
			const 元のテキスト = $('#' + テキストボックスID).val();
			let テキストリスト;
			let 出力テキスト;
			転置回数 = 0;

			let コメント = [];
			出力テキスト = EDIT.コメントを退避(元のテキスト, コメント);

			テキストリスト = ウィキテキストをリストに変換(出力テキスト);
			if (!テキストリスト) {
				return false;
			}

			テキストリスト = リストを五十音順に並べ替え(テキストリスト);
			if (!テキストリスト) {
				return false;
			}

			出力テキスト = リストをウィキテキストに変換(テキストリスト);
			if (!出力テキスト) {
				return false;
			}

			出力テキスト = EDIT.コメントを戻す(出力テキスト, コメント);

			$('#' + テキストボックスID).val(出力テキスト);

			if (転置回数 > 0) {
				EDIT.要約欄にメッセージを挿入('[セクション並べ替え]');
			}

			return true;

		}

		function ウィキテキストをリストに変換(ウィキテキスト) {
			let セクション名 = [''];
			let 正規表現実行結果;

			// セクションタイトル
			let セクション正規表現 = /== ?([^=\n ]+) ?== ?[^=\n]*\n/g;
			while ((正規表現実行結果 = セクション正規表現.exec(ウィキテキスト)) !== null) {
				セクション名.push(正規表現実行結果[1]);
			}

			// セクション内容
			let 内容 = ウィキテキスト.split(/== ?[^=\n ]+ ?== ?[^=\n]*\n/g);

			// 表示上のセクションタイトル
			let セクション表示名 = $('.mw-parser-output > h2 > .mw-headline').map(function (i) {
				return $(this).text();
			}).toArray();
			セクション表示名.unshift('');

			// セクション数不一致を検知
			if (セクション名.length !== セクション表示名.length) {
				return null;
			}

			let セクション毎テキストリスト = [];
			for (i = 0; i < セクション名.length; i++) {
				let 項目 = { 'セクション名': セクション名[i], '内容': 内容[i], 'セクション表示名': セクション表示名[i] };
				セクション毎テキストリスト.push(項目);
			}

			return セクション毎テキストリスト;
		}

		function リストを五十音順に並べ替え(ソート前リスト) {
			let ソート済みリスト = [];

			// 表示されているセクションタイトルでソートキーを決定
			ソート前リスト.forEach(リスト項目 => {
				let 表示言語名 = リスト項目.セクション表示名;
				let ソートキー;

				if (表示言語名 === '日本語') {
					// 日本語を優先
					ソートキー = '*にほんこ';
				}
				else if (EDIT.CONSTANTS.表示名ソートキー対応表[表示言語名]) {
					// ソートキーディクショナリに登録済み
					ソートキー = EDIT.CONSTANTS.表示名ソートキー対応表[表示言語名];
				}
				else if (表示言語名 === '') {
					// 最初のL2セクションの前は空文字列
					ソートキー = '';
				}
				else {
					// その他不明なセクション名
					if (ソート済みリスト[ソート済みリスト.length - 1].ソートキー === '') {
						// 上の方にあるのはおそらく文字種名
						ソートキー = '';
					} else {
						// 文字以外
						ソートキー = EDIT.言語名の漢字の読み方を推測(表示言語名);
						ソートキー = UTIL.sortkey(ソートキー).sort1;
					}
				}

				ソート済みリスト.push({ 'ソートキー': ソートキー, 'セクション': リスト項目 });
			});

			// ソートキーで並べ替え
			ソート済みリスト.sort((a, b) => {
				if (a.ソートキー < b.ソートキー) {
					転置回数++;
					return -1;
				}
				if (a.ソートキー > b.ソートキー) {
					return 1;
				}
				return 0;
			});
			console.log(ソート済みリスト);

			return ソート済みリスト;
		}

		function リストをウィキテキストに変換(リスト) {
			// 整形されたウィキテキストのディクショナリに変換
			let ウィキテキストリスト = [];
			let ウィキテキスト = '';
			リスト.forEach(リスト項目 => {
				var セクションテキスト = '';
				if (リスト項目.セクション.セクション名) {
					セクションテキスト = '==' + リスト項目.セクション.セクション名 + '==\n';
				}
				セクションテキスト += リスト項目.セクション.内容.replace(/\n-{4,5}\n/g, '\n');
				ウィキテキストリスト.push(セクションテキスト);
			});

			// 最初のL2セクションの前に何かある場合の処理
			if (ウィキテキストリスト[0].substring(0, 2) !== '==') {
				ウィキテキスト = ウィキテキストリスト[0];
				ウィキテキストリスト.shift();
			}

			// リストを水平線で区切って文字列に書き出す
			ウィキテキスト += ウィキテキストリスト.join('\n----\n\n');

			// 言語間リンクを除去
			ウィキテキスト = ウィキテキスト.replace(/\n\[\[(aa|ab|af|ak|als|am|an|ang|ar|as|ast|av|ay|az|be|bg|bh|bi|bm|bn|bo|br|bs|ca|ch|chr|co|cr|cs|csb|cy|da|de|dv|dz|el|en|eo|es|et|eu|fa|fi|fj|fo|fr|fy|ga|gd|gl|gn|gu|gv|ha|he|hi|hif|hr|hsb|hu|hy|ia|id|ie|ik|io|is|it|iu|ja|jbo|jv|ka|kk|kl|km|kn|ko|ks|ku|kw|ky|la|lb|li|ln|lo|lt|lv|mg|mh|mi|mk|ml|mn|mo|mr|ms|mt|my|na|nah|nds|ne|nl|nn|no|oc|om|or|pa|pi|pl|pnb|ps|pt|qu|rm|rn|ro|roa-rup|ru|rw|sa|sc|scn|sd|sg|sh|si|simple|sk|sl|sm|sn|so|sq|sr|ss|st|su|sv|sw|ta|te|tg|th|ti|tk|tl|tn|to|tpi|tr|ts|tt|tw|ug|uk|ur|uz|vec|vi|vo|wa|wo|xh|yi|yo|yue|za|zh|zh-min-nan|zu):[^\]]*\]\]/g, '');

			// 連続空行を除去
			ウィキテキスト = ウィキテキスト.replace(/\n{3,}/g, '\n\n').replace(/\n{2,}$/, '\n');

			return ウィキテキスト;
		}

		return 五十音順並べ替え();
	}
};

EDIT.セクション並べ替え.ボタン = $('<button>セクション並べ替え</button>').click(function () {
	const テキストボックスID = EDIT.テキストボックスID;

	// テキストボックスが変更されている場合実行不可とする
	if ($('#' + テキストボックスID).text() !== $('#' + テキストボックスID).val()) {
		alert('プレビューボタンを押して再度実行してください。');
		return;
	}

	// テキストボックス並べ替え実行
	let 実行終了条件 = EDIT.セクション並べ替え.実行();

	// 実行失敗時メッセージを出す
	if (!実行終了条件) {
		alert('エラーが発生しました。プレビューボタンを押してから再度お試しください。');
		return;
	}

});
$('#editform').before(EDIT.セクション並べ替え.ボタン);

// </nowiki>