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

ナビゲーションに移動 検索に移動
tablesorter(MediaWiki標準のではない)を使用してソートするように変更
(sortmiddleが正しい位置に挿入できていなかった問題を修正)
(tablesorter(MediaWiki標準のではない)を使用してソートするように変更)
1行目: 1行目:
/**
/**
  * MediaWiki標準のソート機能を補強するスクリプト
  * 標準のソート機能を置換するスクリプト
* table.sortableがあるページでMediaWiki標準のtablesorterの読み込みを阻止し、
* 別のソートライブラリでソート機能を実現します。
  */
  */
var dateRegex = new RegExp(/(\d{4})(1[0-2]|\d)月(3[01]|[12]\d|[1-9])/);
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() {


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


  for (var i=0, len=rows.length; i<len; i++) {
      /* sortbottom相当の機能を追加する */
    var $tr = $(rows[i]);
      $.tablesorter.addWidget({
    /* ヘッダー行のdata-sort-typeでソートの種類を判定する */
        id: 'sortbottom',
    if (i === 0) {
        priority: 80,
      $tr.children('th, td').each(function(j) {
        format: function(table) {
        var $col = $(this),
          var $rows = $('> tbody > tr:not(.remove-me)', table);
             type = $col.hasClass('unsortable') ? null : $col.data('sortType');
          table.$sortbottoms.each(function() {
        sortTypes.push(type);
            var $before = $rows.eq(this.insertPosition);
             if ($before.length) {
              $before.before(this);
            } else {
              $('> tbody', table).append(this);
            }
          });
        }
       });
       });


    /* sortmiddle */
      /* tablesorterに必要なthead要素とtfoot要素を生成する */
    } else if ($tr.hasClass('sortmiddle')) {
      $sortableTables.each(function() {
      //$tr.removeClass('sortbottom');
        var $thead = $('<thead></thead>'),
      sortmiddles.push(rows[i]);
            $tfoot = $('<tfoot></tfoot>'),
      sortmiddlesPos.push(i);
            rows = this.tBodies[0].rows;
 
        while (rows) {
    } else {
          var $tr = $(rows[0]);
      $tr.children('th, td').each(function(j) {
          if ($tr.children('td').length) break;
        var $col = $(this);
          $tr.children().each(function() {
        /* 既にdata-sort-valueが指定されている場合は処理しない */
            var $cell = $(this),
        if ($col.data('sortValue')) return;
                sortType = $cell.data('sortType');
        switch (sortTypes[j]) {
             if ($cell.hasClass('unsortable')) {
          case 'date':
               $cell.data('sorter', false);
             if (dateRegex.test($col.text())) {
             } else if (sortType === 'number') {
               $col.data('sortValue', RegExp.$3 + ' ' + RegExp.$2 + '月 ' + RegExp.$1);
               $cell.data('sorter', 'digit');
             }
            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);
             }
             }
          });
          $thead.append($tr);
        }
        $thead.insertBefore(this.tBodies[0]);
        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.$sortbottoms = $rows.filter('.sortmiddle, .sortbottom').each(function(i) {
          this.insertPosition = $rows.index(this) - i;
        }).addClass('remove-me').remove();
       });
       });
    }
  }


  $table.on('sortEnd.tablesorter', function() {
      /* ソートキー */
    var rows = this.rows,
      function getElementSortKey(node) {
        len = sortmiddles.length;
        var $node = $(node),
    /* すべてのsortmiddleを一旦取り除く */
            data = $node.data('sortValue');
    for (var i=0; i<len; i++) {
        if (data !== null && data !== undefined) {
        sortmiddles[i].parentNode.removeChild(sortmiddles[i]);
          return String(data);
    }
        } else if (node.tagName.toLowerCase() === 'img') {
    /* sortmiddleを記憶した位置に挿入 */
          return $node.attr('alt') || '';
    for (var i=0; i<len; i++) {
        } else {
      if (rows[sortmiddlesPos[i]]) {
          return $.map(node.childNodes, function(el) {
        rows[sortmiddlesPos[i]].parentNode.insertBefore(sortmiddles[i], rows[sortmiddlesPos[i]]);
            return el.nodeType === 1 ? getElementSortKey(el) : $.text(el);
      } else {
          }).join('');
        rows[rows.length - 1].parentNode.appendChild(sortmiddles[i]);
        }
       }
       }
    }
  });
});


function defaultsortString(str) {
      $sortableTables.tablesorter({
  return str.replace(/[ァ-ン]/g, function(c) {
        debug: true,
      return String.fromCharCode(c.charCodeAt(0) - 96);
        sortLocaleCompare: true,
    })
        sortRestart: true,
    .replace(/ /g, '')
        textExtraction: getElementSortKey,
    .replace(/[ぁぃぅぇぉゃゅょ]/g, function(c) {
        widgets: ['sortbottom']
      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);
     });
     });
}
  }
});
user-upload
3,547

回編集

案内メニュー