「MediaWiki:Gadget-tablesort.js」の版間の差分

提供:エケペディア
ナビゲーションに移動 検索に移動
(rowspanで不具合があったので分割するように処置(とりあえず))
(tr.unsortable, tr.sorthiddenを追加)
24行目: 24行目:
       });
       });


       /* ソートキー */
       /* based on jquery.tablesort.js (MediaWiki) */
       function getElementSortKey(node) {
       function getElementSortKey(node) {
         var $node = $(node),
         var $node = $(node),
44行目: 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.$sortbottoms.each(function() {
              $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 {
               $('> tbody', table).append(this);
               $rows.last().after(this);
             }
             }
           });
           });
56行目: 62行目:
       });
       });


       /* tablesorterに必要なthead要素とtfoot要素を生成する */
       /* tablesorterに必要なテーブル要素を生成する */
       $sortableTables.each(function() {
       $sortableTables.each(function() {
         var $thead = $('<thead></thead>'),
         var $thead = $('<thead></thead>'),
             $tfoot = $('<tfoot></tfoot>'),
             $tfoot = $('<tfoot></tfoot>'),
             rows = this.tBodies[0].rows;
             rows = this.tBodies[0].rows, $tr;
        /* thead要素 */
         while (rows.length) {
         while (rows.length) {
           var $tr = $(rows[0]);
           $tr = $(rows[0]);
           if ($tr.children('td').length) break;
           if ($tr.children('td').length || $tr.hasClass('sorthidden')) break;
           $tr.children().each(function() {
           if ($tr.hasClass('unsortable')) {
            var $cell = $(this),
            $tr.children().data('sorter', false);
                sortType = $cell.data('sortType');
          } else {
            if ($cell.hasClass('unsortable')) {
            $tr.children().each(function() {
              $cell.data('sorter', false);
              var $cell = $(this);
            } else if (sortType === 'number') {
              if ($cell.hasClass('unsortable')) {
              $cell.data('sorter', 'digit');
                $cell.data('sorter', false);
             }
              } else if ($cell.data('sortType') === 'number') {
           });
                $cell.data('sorter', 'digit');
              }
             });
           }
           $thead.append($tr);
           $thead.append($tr);
         }
         }
         $thead.insertBefore(this.tBodies[0]);
         $thead.insertBefore(this.tBodies[0]);
        /* tfoot要素 */
         for (var i = rows.length - 1; 0 < i; i--) {
         for (var i = rows.length - 1; 0 < i; i--) {
           if ($(rows[i]).children('td').length) break;
           if ($(rows[i]).children('td').length) break;
82行目: 94行目:
         $tfoot.appendTo(this);
         $tfoot.appendTo(this);


        /* .sortmiddle, .sortbottom */
         var $rows = $(rows);
         var $rows = $(rows);
         this.$sortbottoms = $rows.filter('.sortmiddle, .sortbottom').each(function(i) {
        /* 固定行をソート用にキャッシュしないよう一旦削除する */
          this.insertPosition = $rows.index(this) - i;
         this.$fixedRows = $rows.filter('.sortbottom, .sorthidden, .sortmiddle')
        }).addClass('remove-me').remove();
          .each(function(i) {
            this.insertPosition = $rows.index(this) - i;
          }).addClass('remove-me').remove();


         /* rowspanを持つセルを分割する(暫定) */
         /* rowspanを持つセルを分割する(暫定) */
99行目: 112行目:
           }
           }
         });
         });
       })
       })
       .tablesorter({
       .tablesorter({

2014年4月14日 (月) 21:46時点における版

/**
 * 標準のソート機能を置換するスクリプト
 * table.sortableがあるページでMediaWiki標準のtablesorterの読み込みを阻止し、
 * 別のソートライブラリでソート機能を実現します。
 */
mw.hook('wikipage.content').add(function($content) {
  var $sortableTables = $content.find('table.sortable');
  if ($sortableTables.length) {
    $sortableTables.removeClass('sortable');
    $.getScript(mw.util.wikiScript() + '?title=MediaWiki:Jquery.tablesorter.min.js&action=raw&ctype=text/javascript', function() {

      /* ソートでカタカナ・濁音・半濁音を清音(ひらがな)として評価させる */
      $.extend($.tablesorter.characterEquivalents, {
        'あ': 'アァぁ', 'い': 'イィぃ', 'う': 'ウゥぅ', 'え': 'エェぇ', 'お': 'オォぉ',
        'か': 'カガが', 'き': 'キギぎ', 'く': 'クグぐ', 'け': 'ケゲげ', 'こ': 'コゴご',
        'さ': 'サザざ', 'し': 'シジじ', 'す': 'スズず', 'せ': 'セゼぜ', 'そ': 'ソゾぞ',
        'た': 'タダだ', 'ち': 'チヂぢ', 'つ': 'ツヅづ', 'て': 'テデで', 'と': 'トドど',
        'な': 'ナ', 'に': 'ニ', 'ぬ': 'ヌ', 'ね': 'ネ', 'の': 'ノ',
        'は': 'ハバパばぱ', 'ひ': 'ヒビピびぴ', 'ふ': 'フブプぶぷ', 'へ': 'ヘベペべぺ', 'ほ': 'ホボポぼぽ',
        'ま': 'マ', 'み': 'ミ', 'む': 'ム', 'め': 'メ', 'も': 'モ',
        'や': 'ヤャゃ', 'ゆ': 'ユュゅ', 'よ': 'ヨョょ',
        'ら': 'ラ', 'り': 'リ', 'る': 'ル', 'れ': 'レ', 'ろ': 'ロ',
        'わ': 'ワ', 'を': 'ヲ', 'ん': 'ン'
      });

      /* 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相当の機能を追加する */
      $.tablesorter.addWidget({
        id: 'sortbottom',
        priority: 80,
        format: function(table) {
          var $rows = $('> tbody > tr:not(.remove-me)', 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);
            if ($before.length) {
              $before.before(this);
            } else {
              $rows.last().after(this);
            }
          });
        }
      });

      /* tablesorterに必要なテーブル要素を生成する */
      $sortableTables.each(function() {
        var $thead = $('<thead></thead>'),
            $tfoot = $('<tfoot></tfoot>'),
            rows = this.tBodies[0].rows, $tr;
        /* thead要素 */
        while (rows.length) {
          $tr = $(rows[0]);
          if ($tr.children('td').length || $tr.hasClass('sorthidden')) break;
          if ($tr.hasClass('unsortable')) {
            $tr.children().data('sorter', false);
          } else {
            $tr.children().each(function() {
              var $cell = $(this);
              if ($cell.hasClass('unsortable')) {
                $cell.data('sorter', false);
              } else if ($cell.data('sortType') === 'number') {
                $cell.data('sorter', 'digit');
              }
            });
          }
          $thead.append($tr);
        }
        $thead.insertBefore(this.tBodies[0]);

        /* 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);
        /* 固定行をソート用にキャッシュしないよう一旦削除する */
        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,
        sortRestart: true,
        textExtraction: getElementSortKey,
        widgets: ['sortbottom']
      });
    });
  }
});