「MediaWiki:Gadget-tablesort.js」の版間の差分
ナビゲーションに移動
検索に移動
sortmiddleの追加。ルビの拗音を変換するように修正 |
sortmiddleが正しい位置に挿入できていなかった問題を修正 |
||
| 7行目: | 7行目: | ||
var $table = $(this); | var $table = $(this); | ||
rows = this.rows, | rows = this.rows, | ||
sortmiddles = | sortmiddles = [], | ||
sortmiddlesPos = [], | |||
sortTypes = []; | sortTypes = []; | ||
| 22行目: | 23行目: | ||
/* sortmiddle */ | /* sortmiddle */ | ||
} else if ($tr.hasClass('sortmiddle')) { | } else if ($tr.hasClass('sortmiddle')) { | ||
$tr.removeClass('sortbottom'); | //$tr.removeClass('sortbottom'); | ||
sortmiddles[i] | sortmiddles.push(rows[i]); | ||
sortmiddlesPos.push(i); | |||
} else { | } else { | ||
| 49行目: | 51行目: | ||
$table.on('sortEnd.tablesorter', function() { | $table.on('sortEnd.tablesorter', function() { | ||
var rows = this.rows; | var rows = this.rows, | ||
for (i | len = sortmiddles.length; | ||
/* すべてのsortmiddleを一旦取り除く */ | |||
rows[i].parentNode.insertBefore(sortmiddles[i], rows[i]); | for (var i=0; i<len; i++) { | ||
sortmiddles[i].parentNode.removeChild(sortmiddles[i]); | |||
} | |||
/* sortmiddleを記憶した位置に挿入 */ | |||
for (var i=0; i<len; i++) { | |||
if (rows[sortmiddlesPos[i]]) { | |||
rows[sortmiddlesPos[i]].parentNode.insertBefore(sortmiddles[i], rows[sortmiddlesPos[i]]); | |||
} else { | |||
rows[rows.length - 1].parentNode.appendChild(sortmiddles[i]); | |||
} | |||
} | } | ||
}); | }); | ||
2014年3月23日 (日) 20:38時点における版
/**
* MediaWiki標準のソート機能を補強するスクリプト
*/
var dateRegex = new RegExp(/(\d{4})年(1[0-2]|\d)月(3[01]|[12]\d|[1-9])日/);
$('table.sortable').each(function() {
var $table = $(this);
rows = this.rows,
sortmiddles = [],
sortmiddlesPos = [],
sortTypes = [];
for (var i=0, len=rows.length; i<len; i++) {
var $tr = $(rows[i]);
/* ヘッダー行のdata-sort-typeでソートの種類を判定する */
if (i === 0) {
$tr.children('th, td').each(function(j) {
var $col = $(this),
type = $col.hasClass('unsortable') ? null : $col.data('sortType');
sortTypes.push(type);
});
/* sortmiddle */
} else if ($tr.hasClass('sortmiddle')) {
//$tr.removeClass('sortbottom');
sortmiddles.push(rows[i]);
sortmiddlesPos.push(i);
} else {
$tr.children('th, td').each(function(j) {
var $col = $(this);
/* 既にdata-sort-valueが指定されている場合は処理しない */
if ($col.data('sortValue')) return;
switch (sortTypes[j]) {
case 'date':
if (dateRegex.test($col.text())) {
$col.data('sortValue', RegExp.$3 + ' ' + RegExp.$2 + '月 ' + RegExp.$1);
}
return;
default:
var $rt = $col.find('.rt');
if ($rt.length) {
var sortkey = defaultsortString($rt.text());
console.log('data-sort-value:' + sortkey);
$col.data('sortValue', sortkey);
}
}
});
}
}
$table.on('sortEnd.tablesorter', function() {
var rows = this.rows,
len = sortmiddles.length;
/* すべてのsortmiddleを一旦取り除く */
for (var i=0; i<len; i++) {
sortmiddles[i].parentNode.removeChild(sortmiddles[i]);
}
/* sortmiddleを記憶した位置に挿入 */
for (var i=0; i<len; i++) {
if (rows[sortmiddlesPos[i]]) {
rows[sortmiddlesPos[i]].parentNode.insertBefore(sortmiddles[i], rows[sortmiddlesPos[i]]);
} else {
rows[rows.length - 1].parentNode.appendChild(sortmiddles[i]);
}
}
});
});
function defaultsortString(str) {
return str.replace(/[ァ-ン]/g, function(c) {
return String.fromCharCode(c.charCodeAt(0) - 96);
})
.replace(/ /g, '')
.replace(/[ぁぃぅぇぉゃゅょ]/g, function(c) {
return String.fromCharCode(c.charCodeAt(0) + 1);
})
.replace(/[がぎぐげござじずぜぞだぢづでどばびぶべぼ]/g, function(c) {
return String.fromCharCode(c.charCodeAt(0) - 1);
})
.replace(/[ぱぴぷぺぽ]/g, function(c) {
return String.fromCharCode(c.charCodeAt(0) - 2);
});
}