مدیاویکی:Gadget-checkAbusefilter.js

از ویکی تراث
نسخهٔ تاریخ ‏۲ اوت ۲۰۲۳، ساعت ۱۸:۰۲ توسط Admin (بحث | مشارکت‌ها) (۱ نسخه واردشده)
(تفاوت) → نسخهٔ قدیمی‌تر | نمایش نسخهٔ فعلی (تفاوت) | نسخهٔ جدیدتر ← (تفاوت)

نکته: پس از انتشار ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.

  • فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلید‌های Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-R)
  • گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-Shift-R)
  • اینترنت اکسپلورر/ Edge: کلید Ctrl را نگه‌دارید و روی دکمهٔ Refresh کلیک کنید، یا کلید‌های Ctrl-F5 را با هم فشار دهید
  • اپرا: Ctrl-F5 را بفشارید.
/*global jQuery, mediaWiki */
//user:Yamaha5 @ fa.wikipedia.org
(function($, mw) {
    'use strict';
    function getAbusFilters() {
        return (new mw.Api()).get({
            action: 'query',
            list: 'abusefilters',
            abfshow: 'private',
            format: 'json',
            abfprop:'id|pattern'
        }).then(function(data) {
            return data.query.abusefilters;
        });
    }
    function markWord(node, text, word, preparedId) {
        var pos, len, newnodes = 0;
        var newnode, middlenode, endnode;

        // textnode - search for word
        if (node.nodeType == 3) {
            pos = node.data.search(text);
            if (pos >= 0) {
                // create new span-element
                newnode = $('<span>', {
                    class: 'AbuseFilter-marked AbuseFilter-marked-' + word.replace(/ /g, '_'),
                    id: preparedId
                }).css('border', "4px solid red")[0];

                // get length of the matching part
                len = node.data.match(text)[0].length;

                // splits content in three parts: begin, middle and end
                middlenode = node.splitText(pos);
                endnode = middlenode.splitText(len);

                // appends a copy of the middle to the new span-node
                newnode.appendChild(middlenode.cloneNode(true));
                // replace middlenode with the new span-node
                middlenode.parentNode.replaceChild(newnode, middlenode);

                newnodes = 1;
            }
        } else if ((node.nodeType == 1) // element node
            &&
            (node.hasChildNodes()) // with child nodes
            &&
            (node.tagName.toLowerCase() != "script") // no script, style and form
            &&
            (node.tagName.toLowerCase() != "style") && (node.tagName.toLowerCase() != "form")) {
            var this_child;
            for (this_child = 0; this_child < node.childNodes.length; this_child++) {
                this_child = this_child + markWord(node.childNodes[this_child], text, word, preparedId);
            }
        }
        return newnodes;
    }
    function checkForText(){
        var abusNumPage=$('a[title^=ویژه')[8].href.substr(-4,4).split('/')[1].trim()
        getAbusFilters().then(function(abusRegxAPIResult) {
            for (var i=0; i<abusRegxAPIResult.length; i++){
                if (abusRegxAPIResult[i]['id'].toString()==abusNumPage){
                   var pattern=abusRegxAPIResult[i]['pattern']
                   var regexPattern=pattern.match(/\"\\b[^\n]+\\b\)?\"/)[0]
                   regexPattern=regexPattern.replace(/\\-/ig,'-').replace(/\\_/ig,'_').replace(/"/ig,'').replace(/\\b/ig,'')// todo: javascript doesn't have \b and it should be replaced
                   regexPattern=new RegExp(regexPattern,'ig')
                   if ($('.mw-abuselog-details-edit_diff.mw-abuselog-value')[0]){
                        var addedTextByUser=$('.mw-abuselog-details-edit_diff.mw-abuselog-value')[0]['innerHTML']
                   }else{
                       var addedTextByUser=$('*')[0]['innerHTML']
                   }
                   var words= addedTextByUser.match(regexPattern)
                   
                   if (words==null){
                       var addedTextByUser=$('.mw-abuselog-details')[0]['innerHTML']
                       console.log(addedTextByUser.match(regexPattern))
                       var words= addedTextByUser.match(regexPattern)
                   }
                   if (words!=null){
                       words = [...new Set(words)];
                       if (words.length>1){
                            //mw.notify('مواردی که پالایهٔ '+abusNumPage+' دریافت کرده‌است ← '+words.join('\n'),{ autoHide: false });
                            mw.notify('چند مورد یافت شد');
                       }else{
                            //mw.notify('موردی که پالایهٔ '+abusNumPage+' دریافت کرده‌است ← '+words.join('\n'),{ autoHide: false });
                            mw.notify('یک مورد یافت شد');
                       }
                        
                       words.forEach(function(word) {
                            word=word.replace(/↵/gi,'').replace(/\+/gi,'')
                            var arabic_diacritics = "ًٌٍَُِّْٔ"
                            var main_regex = '\[؛؟\\s\\n\\r\\•●⚫⬤\\„\\”\\‚\\’\\‘\\“\\[\\]\\{\\}\\t\\<\\>\\.\\,\\"' + "\\'\\+\\!\\?\\-\\/\\»«،\\:\\|\\(\\)\۰۱۲۳۴۵۶۷۸۹]";
                            var start_regex = '\(\^\|' + main_regex + '\)';
                            var end_regex = '\(\$\|[' + arabic_diacritics + ']*' + main_regex + '\)';
                            var articleBody = $('#bodyContent, #article')[0];
                            //var articleBody = $('*')[0]['innerHTML'];
                            var replacements = [];
                            var markedItems = [];
                            var preparedId = 'tool-' + encodeURI(word).replace(/%/g, '.');
                            var regexp = new RegExp(start_regex + '(' +
                                                word.substring(0, word.length - 1).replace(/[ء-يٓ-ٕپچژگکكڪﻙﻚیﻱﻲكﮑﮐﮏﮎﻜﻛﻚﻙىﻯيہەھﻰ-ﻴ]/g, '$&\[ً-ِّْٰٔ\]\*') + word.slice(-1) +
                                                ')' + end_regex,
                                            'g'
                                        );
                            markWord(articleBody, regexp, word, preparedId);
                            });
                   }else{
                       mw.notify('موردی یافت نشد! ممکن است پالایهٔ '+abusNumPage+' ویرایش یا اصلاح شده‌باشد یا کد جاواسکریپت توانایی پیدا کردن نداشته‌باشد',{ autoHide: false });
                   }
                };
            };
        });
    };
    if (mw.config.get('wgNamespaceNumber') ==-1 && ["ویژه:سیاههٔ_خرابکاری"].indexOf(mw.config.get('wgPageName').split('/')[0]) != -1) {
        checkForText();
    };
})(jQuery, mediaWiki);