MediaWiki:Gadget-PrettyDiff.js

提供:エケペディア
ナビゲーションに移動 検索に移動

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

  • Firefox / Safari: Shift を押しながら 再読み込み をクリックするか、Ctrl-F5 または Ctrl-R を押してください (Mac では ⌘-R)
  • Google Chrome: Ctrl-Shift-R を押してください (Mac では ⌘-Shift-R)
  • Internet Explore/Edger: Ctrl を押しながら 最新の情報に更新 をクリックするか、Ctrl-F5 を押してください
  • Opera: Ctrl-F5を押してください
var DMP_JS_URL = 'https://cdnjs.cloudflare.com/ajax/libs/diff_match_patch/20121119/diff_match_patch.js';

function diff_prettyHtml(a) {
  var c = /&/g,
      d = /</g,
      e = />/g,
      f = /\n/g;
  return a.map(function(b) {
    var h = b[0],
        j = b[1].replace(c, '&amp;')
            .replace(d, '&lt;')
            .replace(e, '&gt;')
            .replace(f, '&para;<br/>');
    switch (h) {
      case 1:
        return '<ins style="background-color:#D8ECFF;">' + j + '</ins>';
      case -1:
        return '<del style="background-color:#FEEEC8;">' + j + '</del>';
      case 0:
        return j;
    }
  }).join('');
}

function prettyDiff() {
    var $table = $(this);
    if ($table.find('> tbody > tr.pretty-diff').length > 0) return;
    var dmp = new diff_match_patch();
    var $lineno = $table.find('> tbody > tr:has(.diff-lineno)');

    $lineno.each(function() {
        var $c = $(this).nextUntil($lineno);
        var oldStr = $c.find('> .diff-deletedline, > .diff-context:eq(0)')
            .map(function() { return $(this).text(); }).get().join('\n');
        var newStr = $c.find('> .diff-addedline, > .diff-context:eq(1)')
            .map(function() { return $(this).text(); }).get().join('\n');

        $('<tr class="pretty-diff"/>')
            .append('<td colspan="4" style="border: 1px solid #e6e6e6;">' +
                    diff_prettyHtml(dmp.diff_main(oldStr, newStr)) +
                    '</td>')
            .insertAfter(this);
        $c.remove();
    });
}

if (mw.util.getParamValue('diff') || $.inArray(mw.config.get('wgAction'), ['edit', 'submit']) !== -1) {
    mw.hook('wikipage.content').add(function($content) {
        $.getScript(DMP_JS_URL, function() {
            $content.on('dblclick', 'table.diff', prettyDiff);
        });
    });
}