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

لە ئینسایکڵۆپیدیای ئازادی ویکیپیدیاوە
تێبینی: دوای پاشەکەوتکردن، پێویستە کاشی وێبگەڕەکەت پاک بکەیتەوە تا گۆڕانکارییەکان ببینیت. بۆ گووگڵ کڕۆم، فایەرفۆکس، مایکرۆسۆفت ئێج و سافاری: پەنجە لەسەر دوگمەی ⇧ Shift ڕاگرە و کرتە لەسەر Reload بکە. بۆ وردەکاری و ڕێنمایییەکان لەسەر وێبگەڕەکانی تر، بڕوانە ئێرە.
//لە ویکیپیدیای عەرەبییەوە وەرگیراوە

//developer: user:Ebraminio
/*jslint regexp: true */
/*browser: true*/
/*global jQuery: false, mw: false, window: false, console: false */
(function ($) {
    'use strict';
    // Library!
    function addInfoToNode(node, info, color) {
        $(node).after('<span class="infoAddedcontent">[<span style="color: ' + color + ';">' + info + '</span>]</span>');
    }
    function getSelectedTextLinks() {
        // borrowed from: http://stackoverflow.com/questions/4220478 :)
        var selection,
            selectionAncestor,
            range,
            allWithinRangeParent,
            allSelected,
            i,
            el;

        // if `window.getSelection` is not defined (on IE) return nothing.
        if (window.getSelection === undefined) {
            return [];
        }
        selection = window.getSelection();

        // if nothing is selected, return empty array
        if (selection.isCollapsed) {
            return [];
        }

        range = selection.getRangeAt(0);
        selectionAncestor = range.commonAncestorContainer;
        if (selectionAncestor.getElementsByTagName === undefined) { // if it is not a formal HTML selection
            return [];
        }
        allWithinRangeParent = selectionAncestor.getElementsByTagName('a');

        allSelected = [];
        for (i = 0; (el = allWithinRangeParent[i]) !== undefined; i += 1) {
            // The second parameter says to include the element 
            // even if it's not fully selected
            if (selection.containsNode(el, true)) {
                allSelected.push(el);
            }
        }
        return allSelected;
    }
    function getArticleLinks() {
        var allSelected = getSelectedTextLinks();
        if (allSelected.length === 0) {
            return $('#bodyContent a');
        }
        return allSelected;
    }
    function parseUrl(url) {
        if (url === undefined) {
            return undefined;
        }
        var match = url.match(/\/wiki\/([^#]*)/);
        if (match === null) {
            match = url.match(/\/w\/index\.php\?title=([^&#]*).*redlink=1/);
        }

        if (match !== null) {
            return decodeURI(match[1]); // returns () matched text
        }
        return undefined;
    }
    function getLinkTitle(link) {
        return parseUrl(link.href);
    }
    function firstUserAndTime(data) {
        var res;
        $.each(data.query.pages, function (key, value) { // for retrieving first object index
            if (value.revisions !== undefined) {
                res = [value.revisions[0].user, value.revisions[0].timestamp];
            }
        });
        return res;
    }
    function detectHasTemplate(data) {
        var hasTemplate = false;
        $.each(data.query.pages, function (key, value) { // for retrieving first object index
            hasTemplate = value.templates === undefined ? false : true;
        });
        return hasTemplate;
    }
    //

    function infoAdder(infoType) {
        var enableDisambigDetection = $('#enableDisambigDetection').is(':checked'),
            enableFirstUserName = $('#enableFirstUserName').is(':checked'),
            enableFirstUserTime = $('#enableFirstUserTime').is(':checked'),
            enableRedirectDetection = $('#enableRedirectDetection').is(':checked'),
            enableRedLinkDetection = $('#enableRedLinkDetection').is(':checked'),
            api = new mw.Api(),
            links = getArticleLinks();
        if (enableRedLinkDetection) {
            $(links).filter('a.new').each(function (key, value) {
                // value.innerHTML = value.innerHTML + ' @';
                addInfoToNode(value, 'نییە', 'red');
            });
        }
        $(links).each(function (key, value) {
            var jValue = $(value),
                href = jValue.attr('href'),
                name;
            if (href === undefined || href.indexOf('/wiki/') !== 0) {
                return;
            }
            name = getLinkTitle(value);
            if (name === undefined) {
                return;
            }
            // value.innerHTML = value.innerHTML + ' @';
            if (enableRedirectDetection && jValue.is('a.mw-redirect')) {
                addInfoToNode(value, 'ڕەوانەکەر', 'green');
            }
            if (enableDisambigDetection) {
                api.get({
                    action: 'query',
                    prop: 'templates',
                    titles: name,
                    tltemplates: 'داڕێژە:ڕوونکردنەوە\u200cڕوونکردنەوە'
                }).done(function (data) {
                    if (detectHasTemplate(data)) {
                        addInfoToNode(value, 'ڕوونکردنەوە\u200cڕوونکردنەوە', 'aqua');
                    }
                }).fail(function (error) {
                    console.log('API failed :(', error);
                });
            }
            if (enableFirstUserName || enableFirstUserTime) {
                api.get({
                    action: 'query',
                    prop: 'revisions',
                    titles: name,
                    rvlimit: '1',
                    rvprop: 'user|timestamp',
                    rvdir: 'newer'
                }).done(function (data) {
                    var fut = firstUserAndTime(data);
                    if (fut !== undefined) {
                        if (enableFirstUserName) {
                            addInfoToNode(value, 'ب:' + fut[0], 'gray');
                        }
                        if (enableFirstUserTime) {
                            addInfoToNode(value, 'لە ' + new Date(fut[1]).toDateString(), 'orange');
                        }
                    }
                }).fail(function (error) {
                    console.log('API failed :(', error);
                });
            }
        });
    }

    $(function () {
        $('#articlesLinksInfo').remove();
        var html = '<span style="font-size: 40%;display: block;line-height: 1px;padding: 0px 0px 5px;color: grey;margin-top: -5px" id="articlesLinksInfo">';
        html = html + '<a id="allInfo-button" href="#">پیشاندانی زانیارییەکانی بەستەرەکان</a>';
        html = html + ' <input checked type="checkbox" name="enableDisambigDetection" id="enableDisambigDetection"><label for="enableDisambigDetection">ڕوونکردنەوە؟</label>';
        html = html + ' <input checked type="checkbox" name="enableFirstUserName" id="enableFirstUserName"><label for="enableFirstUserName">یەکەم بەکارھێنەر؟</label>';
        html = html + ' <input type="checkbox" name="enableFirstUserTime" id="enableFirstUserTime"><label for="enableFirstUserTime">مێژووی یەکەم دەستکاری؟</label>';
        html = html + ' <input checked type="checkbox" name="enableRedirectDetection" id="enableRedirectDetection"><label for="enableRedirectDetection">ڕەوانەکەر؟</label>';
        html = html + ' <input type="checkbox" name="enableRedLinkDetection" id="enableRedLinkDetection"><label for="enableRedLinkDetection">نییە؟</label>';
        html = html + '</span>';

        $('h1:first').append(html);

        $('#allInfo-button').click(function (event) {
            event.preventDefault();
            infoAdder('all');
        });
    });
}(jQuery));
mw.util.addCSS(".infoAddedcontent{font-weight:normal!important;margin-right:2px;font-family:tahoma;font-size:12px;position:relative;top:-2px;}");