利用者:Naggy Nagumo/Edit SortSection.js
ナビゲーションに移動
検索に移動
注意: 保存後、変更を確認するにはブラウザーのキャッシュを消去する必要がある場合があります。
- 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>