Jump to content

MediaWiki:Wp/bgn/Gadget-decodesummary.js

From Wikimedia Incubator

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)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
function deChar(ss) {
    'use strict';
    try {
        ss = decodeURIComponent(ss.replace(
            /\.([0-9A-F][0-9A-F])/g, '%$1'));
    } catch (ignore) {}
    return ss;
}

function decodeAnchor(link) { //simplify internal link: replace %20 and _ then decode anchor
    'use strict';
    link = link.replace(/(_|%20)/g, ' ').replace(/^ +| +$/g, '');
    var parts = link.split('#'),
        i,
        anchor,
        hidIdx = -1,
        hidden = [];
    if (parts.length !== 2) {
        return link; //no anchor
    }
    anchor = parts[1];

    //decode 4, 3 and 2-byte: http://en.wikipedia.org/wiki/UTF-8
    anchor = anchor.replace(
        /\.F[0-4]\.[89AB][\dA-F]\.[89AB][\dA-F]\.[89AB][\dA-F]/g,
        deChar
    );
    anchor = anchor.replace(
        /\.E[\dA-F]\.[89AB][\dA-F]\.[89AB][\dA-F]/g,
        deChar
    );
    anchor = anchor.replace(/\.[CD][\dA-F]\.[89AB][\dA-F]/g,
        deChar
    );
    anchor = anchor.replace( //hide IPs
        /(?:^|[^0-9A-F\.])(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/,
        function (s) {
            hidden[++hidIdx] = s;
            return '\x01' + hidIdx + '\x02';
        }
    );
    //decode 1-byte chars: all symbols except  -.:_  and []{} prohibited in links
    anchor = anchor.replace(/\.[2-7][0-9A-F]/g, function (hhh) {
        var ch = deChar(hhh);
        if ('!"#$%&\'()*+,/;<=>?@\\^`~'.indexOf(ch) >= 0) {
            return ch;
        }
        return hhh;
    });
    //unhide IPs and return
    for (i = hidIdx; i >= 0; i--) {
        anchor = anchor.replace('\x01' + i + '\x02', hidden[i]);
    }
    if (anchor.indexOf("''") !== -1) {
        return link; //cannot have double '' in link
    }
    return parts[0] + '#' + anchor;
}

$(function () {
    'use strict';
    mw.loader.using('jquery.lengthLimit', function () {
        $(
            '#wpSummary, #wpReason, [name=wpReason], #mwProtect-reason, #mw-input-wpReason-other, #wpComment, .mw-ui-input.summary'
        ).byteLimit(Infinity);
    });

    $(
        '#wpSummary, #wpReason, [name=wpReason], #mwProtect-reason, #mw-input-wpReason-other, #wpComment, .mw-ui-input.summary'
    ).on(
        'paste keyup change',
        function (e) {
            var that, val, bytes;
            that = $(this);
            val = that.val();
            // from https://stackoverflow.com/questions/2219526/
            bytes = encodeURI(val).split(
                    /%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./).length -
                1;
            that.css('background-color', bytes > 255 ? '#FFEBEB' :
                'white');
            val = val.replace( // place diff before oldid
                /(oldid=(?:\d+|next|prev|cur|))&(diff=(?:\d+|next|prev|cur|))/gi,
                '$2&$1'
            ).replace( // Special:Diff
                /(?:(^|[ \\^`#<>\[\]\"\t\n{|}])|https?:\/\/([a-z\-]+)\.(?:wikipedia|wikimedia)\.org\/[^ \\^`#<>\[\]\"\t\n{|}]*)&?diff=(\d+|next|prev|cur)(?:&oldid=(\d+|next|prev|cur|))?(#[^ \\^`#<>\[\]\"\t\n{|}]*)?(?=$|[ \\^`#<>\[\]\"\t\n{|}])/gi,
                '$1[[$2:Special:Diff/$4/$3$5]]'
            ).replace( // Special:Permalink
                /(?:(^|[ \\^`#<>\[\]\"\t\n{|}])|https?:\/\/([a-z\-]+)\.(?:wikipedia|wikimedia)\.org\/[^ \\^`#<>\[\]\"\t\n{|}]*)&?oldid=(\d+|next|prev|cur)(#[^ \\^`#<>\[\]\"\t\n{|}]*)?(?=$|[ \\^`#<>\[\]\"\t\n{|}])/gi,
                '$1[[$2:Special:Permalink/$3$4]]'
            ).replace( // [[Special:Diff/12345678/prev]] is equal to [[Special:Diff/12345678]]
                /\[\[([a-z\-]+:)Special:Diff\/(\d+|next|prev|cur)\/prev\]\]/gi,
                '[[$1Special:Diff/$2]]'
            ).replace( // no oldid
                'Special:Diff//',
                'Special:Diff/'
            ).replace(
                '[[fa:',
                '[['
            ).replace(
                '[[:',
                '[['
            );
            try {
                val = decodeURI(val.replace(/%20/g, '‍‍‍')).replace(/‍‍‍/g, '%20'); // three zwnj
                val = val.replace(/\[\[.*?\]\]/g, decodeAnchor);
            } catch (ignore) {}
            if (val !== that.val()) {
                that.val(val);
            }
        });
});