MediaWiki:Gadget-tablesort.js

提供: エケペディア
2014年3月23日 (日) 20:38時点におけるNo.name2 (トーク | 投稿記録)による版 (sortmiddleが正しい位置に挿入できていなかった問題を修正)
ナビゲーションに移動 検索に移動

注意: 保存後、変更を確認するにはブラウザーのキャッシュを消去する必要がある場合があります。

  • Firefox / Safari: Shift を押しながら 再読み込み をクリックするか、Ctrl-F5 または Ctrl-R を押してください (Mac では ⌘-R)
  • Google Chrome: Ctrl-Shift-R を押してください (Mac では ⌘-Shift-R)
  • Microsoft Edge: Ctrl を押しながら 最新の情報に更新 をクリックするか、Ctrl-F5 を押してください。
/**
 * 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);
    });
}