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

No.name2 (トーク | 投稿記録)
tablesorter(MediaWiki標準のではない)を使用してソートするように変更
Motodai (トーク | 投稿記録)
resolve warning
 
(他の1人の利用者による、間の5版が非表示)
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.$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);
             }
             }
           });
           });
41行目: 62行目:
       });
       });


       /* tablesorterに必要なthead要素とtfoot要素を生成する */
      $.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>'),
         /* 標準のソート機能が読み込まれてしまった場合に、割り当てられたアクションを取り除く */
            $tfoot = $('<tfoot></tfoot>'),
        if (this.tHead) {
            rows = this.tBodies[0].rows;
          $('> th', this.tHead.rows).off('keypress click');
        while (rows) {
          $(this.tBodies[0]).prepend(this.tHead.rows);
          var $tr = $(rows[0]);
          $(this.tHead).remove();
          if ($tr.children('td').length) break;
        }
          $tr.children().each(function() {
 
            var $cell = $(this),
        var rows = this.tBodies[0].rows, $tr;
                sortType = $cell.data('sortType');
 
            if ($cell.hasClass('unsortable')) {
        /* thead要素 */
              $cell.data('sorter', false);
        var $thead = $('<thead></thead>');
            } else if (sortType === 'number') {
        var setCellSorter = function() {
              $cell.data('sorter', 'digit');
    var $cell = $(this);
             }
if ($cell.hasClass('unsortable')) {
           });
        $cell.data('sorter', false);
    } else if ($cell.data('sortType') === 'number') {
        $cell.data('sorter', 'number');
    }
};
 
        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(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--) {
 
          if ($(rows[i]).children('td').length) break;
         /* tfoot要素 */
          $tfoot.prepend(rows[i]);
        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);
         }
         }
        $tfoot.appendTo(this);


         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を持つセルを分割する(暫定) */
      function getElementSortKey(node) {
        $rows.each(function(i) {
        var $node = $(node),
          var cells = this.cells;
            data = $node.data('sortValue');
          for (var j = 0, len = cells.length; j < len; j++) {
        if (data !== null && data !== undefined) {
            var rowspan = cells[j].rowSpan;
          return String(data);
            cells[j].rowSpan = 1;
        } else if (node.tagName.toLowerCase() === 'img') {
            for (var k = 1; k < rowspan; k++) {
          return $node.attr('alt') || '';
              $(cells[j]).clone().insertBefore($rows.get(i + k).cells[j]);
        } else {
            }
          return $.map(node.childNodes, function(el) {
           }
            return el.nodeType === 1 ? getElementSortKey(el) : $.text(el);
         });
           }).join('');
         }
      }


       $sortableTables.tablesorter({
       })
        debug: true,
      .tablesorter({
         sortLocaleCompare: true,
         sortLocaleCompare: true,
         sortRestart: true,
         sortRestart: true,