MediaWiki:Gadget-FlowThreadCheck.js

注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Internet Explorer:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:前往菜单 → 设置(Mac为Opera → Preferences),然后隐私和安全 → 清除浏览数据 → 缓存的图片和文件
/* globals $ */
$(function() {
    var rules = [],
        checkBox = {
            node: $('<div id="flowthreadCheckBox"><div id="flowthreadCheckBoxTitle"><div id="flowthreadCheckBoxTitleContent">评论预览</div><span id="flowthreadCheckBoxCloseButton">×</span></div><div id="flowthreadCheckBoxContent"><div id="flowthreadCheckBoxContentBox"></div></div></div>').css('margin-left', ($(window).width() - 600) / 2 + 'px').appendTo(document.body),
            closeButton: $('#flowthreadCheckBoxCloseButton').on('click', checkBoxFadeOut),
            content: $('#flowthreadCheckBoxContentBox')
        };
    function addCheckButton() {
        $('.comment-submit').each(function() {
            var submitButton = $(this);
            if (submitButton.data('addCheckButton') === true) return;
            var checkButton = $('<button/>').text('评论检查').addClass('comment-check').css('right', submitButton.width() + parseInt(submitButton.css('right')) - parseInt(submitButton.css('border-width')));
            checkButton.on('click', showCheckBox);
            submitButton.before(checkButton).data('addCheckButton', true);
        });
    }
    function checkBoxFadeIn() {
        return checkBox.node.fadeIn(370).delay(370);
    }
    function checkBoxFadeOut() {
        return checkBox.node.fadeOut(370).delay(370);
    }
    function showError(text) {
        checkBoxFadeIn().queue(function() {
            $(this).text(text).dequeue();
        });
    }
    function showCheckBox() {
        var self = this,
            text = $(this).closest('.comment-replybox').find('textarea').val();
        if (/\s{1307,}/.test(text)) return alert('输入内容有误,请不要输入那么多空格');
        if (!text) return alert('请输入评论内容后检查');
        if (checkBox.content.text()) checkBox.content.empty();
        if (!rules[0]) $.ajax({
            url: '//zh.moegirl.org/MediaWiki:Flowthread-blacklist?action=raw',
            type: 'GET',
            success: function(data) {
                rules = data.split('\n');
                rules.splice(0, 5);
                rules.forEach(function(v, i) {
                    var length = v.lastIndexOf(' #') == -1 ? i.length : v.lastIndexOf(' #'),
                        regexp = v.slice(0, length);
                    if (!/^ *\#/.test(v) && regexp) rules[i] = RegExp(regexp);
                    else rules[i] = /\s{1307,}/;
                });
                checkText(text);
            },
            error: function() {
                showCheckBox.call(self);
            }
        });
        else checkText(text);
    }
    function checkText(text) {
        var errorText = [];
        rules.forEach(function(v) {
            var r = RegExp(v, 'g');
            if (r.test(text)) errorText.push([v, text.match(r)]);
        });
        checkBoxFadeIn();
        if (!errorText[0]) checkBox.content.append('您的评论没有触发黑名单机制。');
        else {
            var table = checkBox.content.append('您的评论触发以下黑名单(使用正则表达式<sup><a rel="nofollow" target="_blank" class="external text" href="http://baike' + '.baidu.com/view/94238.htm">解释</a></sup>):').append($('<table/>')).find('table');
            table.append('<tr><th>No.</th><th>黑名单</th><th>命中字符串</th></tr>');
            errorText.forEach(function(n) {
                table.append(
                    $('<tr/>').append($('<td/>').addClass('first').text(table.find('tr').length))
                    .append($('<td/>').text(n[0]))
                    .append($('<td/>').append(n[1].map(function(t) {
                        return '<code>' + $('<span/>').text(t).html() + '</code>';
                    }).join('<br/>')))
                );
            });
        }
    }
    addCheckButton();
    $('.comment-container').on('click', function(e) {
        if ($(e.target).hasClass("comment-reply")) window.setTimeout(function() {
            addCheckButton();
        }, 0);
    });
});