「MediaWiki:Gadget-tablesort.js」の版間の差分
一部のページで無限ループに陥る問題を修正 |
resolve warning |
||
| (他の1人の利用者による、間の4版が非表示) | |||
| 7行目: | 7行目: | ||
var $sortableTables = $content.find('table.sortable'); | var $sortableTables = $content.find('table.sortable'); | ||
if ($sortableTables.length) { | if ($sortableTables.length) { | ||
$sortableTables.removeClass('sortable'); | $sortableTables.removeClass('sortable jquery-tablesorter'); | ||
$.getScript(mw.util.wikiScript() + '?title=MediaWiki:Jquery.tablesorter.min.js&action=raw&ctype=text/javascript', function() { | $.getScript(mw.util.wikiScript() + '?title=MediaWiki:Jquery.tablesorter.min.js&action=raw&ctype=text/javascript', function() { | ||
| 23行目: | 23行目: | ||
'わ': 'ワ', 'を': 'ヲ', 'ん': 'ン' | 'わ': 'ワ', 'を': 'ヲ', 'ん': 'ン' | ||
}); | }); | ||
/* based on jquery.tablesort.js (MediaWiki) */ | |||
function getElementSortKey(node) { | |||
var $node = $(node), | |||
data = $node.data('sortValue'); | |||
if (data !== null && data !== undefined) { | |||
return String(data); | |||
} else if (node.tagName.toLowerCase() === 'img') { | |||
return $node.attr('alt') || ''; | |||
} else { | |||
return $.map(node.childNodes, function(el) { | |||
return el.nodeType === 1 ? getElementSortKey(el) : $.text(el); | |||
}).join(''); | |||
} | |||
} | |||
/* sortbottom相当の機能を追加する */ | /* sortbottom相当の機能を追加する */ | ||
| 29行目: | 44行目: | ||
priority: 80, | priority: 80, | ||
format: function(table) { | format: function(table) { | ||
var $rows = $('> tbody > tr:not(.remove-me)', table); | var $rows = $('> tbody > tr:not(.remove-me)', table), | ||
table.$ | $target = table.$fixedRows; | ||
if (table.hasInitialized) { | |||
table.$fixedRows.filter('.sortbottom').prependTo(table.tFoot); | |||
table.$fixedRows.filter('.sorthidden').remove(); | |||
$target = $target.filter('.sortmiddle'); | |||
} | |||
$target.each(function() { | |||
var $before = $rows.eq(this.insertPosition); | var $before = $rows.eq(this.insertPosition); | ||
if ($before.length) { | if ($before.length) { | ||
$before.before(this); | $before.before(this); | ||
} else { | } else { | ||
$( | $rows.last().after(this); | ||
} | } | ||
}); | }); | ||
| 41行目: | 62行目: | ||
}); | }); | ||
/* | $.tablesorter.addParser({ | ||
id: 'number', | |||
is: $.tablesorter.isDigit, | |||
format: function(s) { | |||
var i = parseFloat(s.replace( /[, ]/g, '').replace('\u2212', '-')); | |||
return isNaN(i) ? 0 : i; | |||
}, | |||
type: 'numeric' | |||
}); | |||
/* tablesorterに必要なテーブル要素を生成する */ | |||
$sortableTables.each(function() { | $sortableTables.each(function() { | ||
var $thead = $('<thead></thead>') | /* 標準のソート機能が読み込まれてしまった場合に、割り当てられたアクションを取り除く */ | ||
if (this.tHead) { | |||
$('> th', this.tHead.rows).off('keypress click'); | |||
$(this.tBodies[0]).prepend(this.tHead.rows); | |||
$(this.tHead).remove(); | |||
} | |||
var rows = this.tBodies[0].rows, $tr; | |||
/* thead要素 */ | |||
var $thead = $('<thead></thead>'); | |||
var setCellSorter = function() { | |||
var $cell = $(this); | |||
if ($cell.hasClass('unsortable')) { | |||
$cell.data('sorter', false); | |||
} else if ($cell.data('sortType') === 'number') { | |||
$cell.data('sorter', 'number'); | |||
} | |||
}; | |||
while (rows.length) { | while (rows.length) { | ||
$tr = $(rows[0]); | |||
if ($tr.children('td').length | if ($tr.children('td').length || $tr.hasClass('sorthidden')) break; | ||
if ($tr.hasClass('unsortable')) { | |||
$tr.children().data('sorter', false); | |||
} else { | |||
$tr.children().each(setCellSorter); | |||
} | |||
$thead.append($tr); | $thead.append($tr); | ||
} | } | ||
$thead.insertBefore(this.tBodies[0]); | $thead.insertBefore(this.tBodies[0]); | ||
for (var i = rows.length - 1; 0 < i; i--) { | |||
/* tfoot要素 */ | |||
if (!this.tFoot) { | |||
var $tfoot = $('<tfoot></tfoot>'); | |||
for (var i = rows.length - 1; 0 < i; i--) { | |||
if ($(rows[i]).children('td').length) break; | |||
$tfoot.prepend(rows[i]); | |||
} | |||
$tfoot.appendTo(this); | |||
} | } | ||
var $rows = $(rows); | var $rows = $(rows); | ||
this.$ | /* 固定行をソート用にキャッシュしないよう一旦削除する */ | ||
this.$fixedRows = $rows.filter('.sortbottom, .sorthidden, .sortmiddle') | |||
.each(function(i) { | |||
this.insertPosition = $rows.index(this) - i; | |||
}).addClass('remove-me').remove(); | |||
/* rowspanを持つセルを分割する(暫定) */ | |||
$rows.each(function(i) { | |||
var cells = this.cells; | |||
for (var j = 0, len = cells.length; j < len; j++) { | |||
var rowspan = cells[j].rowSpan; | |||
cells[j].rowSpan = 1; | |||
for (var k = 1; k < rowspan; k++) { | |||
$(cells[j]).clone().insertBefore($rows.get(i + k).cells[j]); | |||
} | |||
} | |||
}); | |||
} | |||
} | |||
}) | |||
.tablesorter({ | |||
sortLocaleCompare: true, | sortLocaleCompare: true, | ||
sortRestart: true, | sortRestart: true, | ||