User:Yamaha5/LinksInfo.js

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/*jslint browser: true, regexp: true, unparam: true*/
/*global jQuery: false, mw: false*/
/*
this code is based on User:Ebraminio/LinksInfo.js 
 + Default option
 + Size Query
 + Last User Query
 + Last edit time Query
**********************************************************************************
Options: put this variable to your /common.js. each item sets to 0 doesn't show! *
                                                                                 *
var pageInfoConf = {                                                             *
    'disambigQuery': true,                                                       *
    'firstUserQuery': true,                                                      *
    'lastUserQuery': true,                                                       *
    'firstTimeQuery': true,                                                      *
    'lastTimeQuery': true,                                                       *
    'redirectQuery': true,                                                       *
    'sizeQuery': true,                                                           *
    'redQuery': true                                                             *
};                                                                               *
                                                                                 *
**********************************************************************************
*/

(function ($) {
    'use strict';
    function addInfoToNode(node, info, color) {
        $(node).after('<span class="infoAddedcontent">[<span style="color: ' + color + ';">' + info + '</span>]</span>');
    }

    var conf = {
        'disambigQuery': true,
        'firstUserQuery': true,
        'lastUserQuery': true,
        'firstTimeQuery': true,
        'lastTimeQuery': true,
        'redirectQuery': true,
        'sizeQuery': true,
        'redQuery': true
    };
    $.extend(conf, window.pageInfoConf);

    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 lastUserAndTime(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 pageSize(data) {
        var res;
        $.each(data.query.pages, function (key, value) { // for retrieving first object index
            if (value !== undefined) {
                res = value.length;
            }
        });
        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'),
            enableLastUserName = $('#enableLastUserName').is(':checked'),
            enableLastUserTime = $('#enableLastUserTime').is(':checked'),
            enablePageSize = $('#enablePageSize').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;
            }

            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) {
                    // sad :(
                });
            }

            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) {
                    // sad :(
                });
            }

            if (enablePageSize) {
                api.get({
                    action: 'query',
                    prop: 'info',
                    titles: name
                }).done(function (data) {
                    var size = pageSize(data),
                        num;
                    if (size !== undefined) {
                        num = size / 1000;
                        if (num < 4) {
                            addInfoToNode(value, 'کیلوبایت ~ ' + num, '#D715C1');
                        } else if (10 > num && num > 4) {
                            addInfoToNode(value, 'کیلوبایت ~ ' + num, '#039839');
                        } else if (30 > num && num > 10) {
                            addInfoToNode(value, 'کیلوبایت ~ ' + num, 'red');
                        } else if (num > 30) {
                            addInfoToNode(value, 'کیلوبایت ~ ' + num, '#FF6B00');
                        }
                    }
                }).fail(function (error) {
                    // sad :(
                });
            }

            if (enableLastUserName || enableLastUserTime) {
                api.get({
                    action: 'query',
                    prop: 'revisions',
                    titles: name,
                    rvlimit: '1',
                    rvprop: 'user|timestamp',
                    rvdir: 'older'
                }).done(function (data) {
                    var Lut = lastUserAndTime(data);
                    if (Lut !== undefined) {
                        if (enableLastUserName) {
                            addInfoToNode(value, 'کاربر:' + Lut[0], 'gray');
                        }
                        if (enableLastUserTime) {
                            addInfoToNode(value, 'در ' + new Date(Lut[1]).toDateString(), 'orange');
                        }
                    }
                }).fail(function (error) {
                    // sad :(
                });
            }

        });
    }

    $(function () {
        $('#articlesLinksInfo').remove();
        // HTML Builder
        var hb = [];
        hb.push('<span style="font-size: 40%; margin: 0 2em;" id="articlesLinksInfo">');
        hb.push('<a id="allInfo-button" href="#">اطلاعات پیوندها</a>');
        if (conf.disambigQuery) {
            hb.push(' <input type="checkbox" name="enableDisambigDetection" id="enableDisambigDetection"><label for="enableDisambigDetection">ابهام\u200cزدایی؟</label>');
        }
        if (conf.firstUserQuery) {
            hb.push(' <input type="checkbox" name="enableFirstUserName" id="enableFirstUserName"><label for="enableFirstUserName">اولین ویرایشگر؟</label>');
        }
        if (conf.lastUserQuery) {
            hb.push(' <input type="checkbox" name="enableLastUserName" id="enableLastUserName"><label for="enableLastUserName">آخرین ویرایشگر؟</label>');
        }
        if (conf.firstTimeQuery) {
            hb.push(' <input type="checkbox" name="enableFirstUserTime" id="enableFirstUserTime"><label for="enableFirstUserTime">تاریخ ایجاد؟</label>');
        }
        if (conf.lastTimeQuery) {
            hb.push(' <input type="checkbox" name="enableLastUserTime" id="enableLastUserTime"><label for="enableLastUserTime">تاریخ آخرین ویرایش؟</label>');
        }
        if (conf.redirectQuery) {
            hb.push(' <input type="checkbox" name="enableRedirectDetection" id="enableRedirectDetection"><label for="enableRedirectDetection">تغییر مسیر؟</label>');
        }
        if (conf.sizeQuery) {
            hb.push(' <input type="checkbox" name="enablePageSize" id="enablePageSize"><label for="enablePageSize">حجم؟</label>');
        }
        if (conf.redQuery) {
            hb.push(' <input type="checkbox" name="enableRedLinkDetection" id="enableRedLinkDetection"><label for="enableRedLinkDetection">ناموجود؟</label>');
        }
        hb.push('</span>');

        $('h1:first').append(hb.join(''));

        $('#allInfo-button').click(function (event) {
            event.preventDefault();
            infoAdder('all');
        });
    });
}(jQuery));