MediaWiki:Wp/bgn/Gadget-decodesummary.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)
- 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);
}
});
});