User:Wugapodes/Capricorn.js

// <nowiki>// This is a modified version of [[User:Sam Sailor/Scripts/Sagittarius+.js]] ([[Special:PermaLink/899463476]])// Docs: [[User:Wugapodes/Capricorn]]/*jshint undef:true, latedef:true, shadow:true, loopfunc:true, scripturl:true, undef:true *//*globals jQuery, mw, importStylesheet */////////////////////////////////////////////////////////////////////////////////// Helper function definitionsfunction encodeCodePoint(c) {if (c === 0x20)return '_';if (c < 0x80) {return '.' + c.toString(16).toUpperCase();} else if (c < 0x800) {return '.' + (0xc0 |  (c >>>  6)        ).toString(16).toUpperCase() +'.' + (0x80 | ( c         & 0x3f)).toString(16).toUpperCase();} else if (c < 0x10000) {return '.' + (0xe0 |  (c >>> 12)        ).toString(16).toUpperCase() +'.' + (0x80 | ((c >>>  6) & 0x3f)).toString(16).toUpperCase() +'.' + (0x80 | ( c         & 0x3f)).toString(16).toUpperCase();} else if (c < 0x200000) {return '.' + (0xf0 |  (c >>> 18)        ).toString(16).toUpperCase() +'.' + (0x80 | ((c >>> 12) & 0x3f)).toString(16).toUpperCase() +'.' + (0x80 | ((c >>>  6) & 0x3f)).toString(16).toUpperCase() +'.' + (0x80 | ( c         & 0x3f)).toString(16).toUpperCase();} else if (c < 0x4000000) {return '.' + (0xf8 |  (c >>> 24)        ).toString(16).toUpperCase() +'.' + (0x80 | ((c >>> 18) & 0x3f)).toString(16).toUpperCase() +'.' + (0x80 | ((c >>> 12) & 0x3f)).toString(16).toUpperCase() +'.' + (0x80 | ((c >>>  6) & 0x3f)).toString(16).toUpperCase() +'.' + (0x80 | ( c         & 0x3f)).toString(16).toUpperCase();} else if (c < 0x80000000) {return '.' + (0xfc |  (c >>> 30)        ).toString(16).toUpperCase() +'.' + (0x80 | ((c >>> 24) & 0x3f)).toString(16).toUpperCase() +'.' + (0x80 | ((c >>> 18) & 0x3f)).toString(16).toUpperCase() +'.' + (0x80 | ((c >>> 12) & 0x3f)).toString(16).toUpperCase() +'.' + (0x80 | ((c >>>  6) & 0x3f)).toString(16).toUpperCase() +'.' + (0x80 | ( c         & 0x3f)).toString(16).toUpperCase();}}function normaliseAnchor(anchor) {// "." is not escaped!return anchor.replace(/[^0-9A-Za-z_:\.]/g, function (m) { /* [\ud800-\udbff][\udc00-\dfff]| */if (m.length === 2) { // surrogate pairreturn encodeCodePoint((m.charCodeAt(0) & 0x3ff) << 10 | m.charCodeAt(1) & 0x3ff);} else {return encodeCodePoint(m.charCodeAt(0));}});}function normaliseTitle(title) {try {var t = new mw.Title(title);return t.getPrefixedText();} catch (e) {return null;}}function el(tag, child, attr, events) {var node = document.createElement(tag); if (child) {if ((typeof child === 'string') || (typeof child.length !== 'number'))child = [child];for (var i = 0; i < child.length; ++i) {var ch = child[i];if ((ch === void(null)) || (ch === null))continue;else if (typeof ch !== 'object')ch = document.createTextNode(String(ch));node.appendChild(ch);}}if (attr) for (var key in attr) {if ((attr[key] === void(0)) || (attr[key] === null))continue;node.setAttribute(key, String(attr[key]));}if (events) for (var key in events) {var handler = events[key];if ((key === 'input') && (window.oninput === void(0))) {key = 'change';}node.addEventListener(key, handler, false);}return node;}function link(child, href, attr, ev) {attr = attr || {};ev = ev || {};if (typeof attr === 'string') {attr = { "title": attr };}if (typeof href === 'string')attr.href = href;else {attr.href = 'javascript:void(null);';ev.click = href;}return el('a', child, attr, ev);}var templateGroups = {    "fromRelatedInfo": "Related information, From",    "toRelatedInfo": "Related information, To",    "fromPartOfSpeech": "Parts of speech, From",    "fromEngVar": "English variant spelling, From",    "fromOrthographicModification": "Orthographic difference, From",    "toOrthographicModification": "Orthographic difference, To",    "fromAlt": "Alternative names, From",    "fromDisambiguation": "Ambiguity, From",    //"toDisambiguation": "Ambiguity, To",    //"fromSpecificity": "Specificity, From",    "fromAnthroponym": "Anthroponym, From",    "fromFiction": "Fiction, From",    "fromWork": "Works of art and works generally, From",    "toWork": "Works of art and works generally, To",    "fromLocationOrInfrastructure": "Geographic location or infrastructure, From",    "fromFormerName": "Former names, From",    "toFormerName": "Former names, To",    "fromSystematicName": "Systematic name, From",    "toSystematicName": "Systematic name, To",    "fromPostal": "From postal information",    "fromOrganization": "From organization",    "fromMath": "From mathematical topic",    "fromComic": "Comics, From",    "toComic": "Comics, To",    "fromMiddleEarth": "Middle-earth topic, From",    "toMiddleEarth": "Middle-earth topic, To",    "fromMisc": "From miscellaneous information",    "fromMeta": "Meta information, From",    "toMeta": "Meta information, To",    "fromProtected": "Protection level, From",    "toNameSpace": "Namespaces, To",    "fromPrintworthiness":"Printworthiness"};////////////////////////////////////////////////////////////////////////////////// Callback functionsfunction mainCallback(aliasJSON, templateJSON) {var templateAliases = aliasJSON;var redirectTemplates = templateJSON;//console.log(templateAliases);//console.log(redirectTemplates);// <nowiki>'use strict';importStylesheet('User:Wugapodes/Capricorn.css');var wgNamespaceIds = mw.config.get('wgNamespaceIds');var contentText = document.getElementById('mw-content-text');var firstHeading = document.getElementById('firstHeading');var redirMsg = contentText.getElementsByClassName('redirectMsg')[0];var uiWrapper = el('div');var edittoken = null;function MarkupBlob(markup) {if (!markup) {this.target = '';this.rcatt = {};this.tail = '';} elsethis.parse(markup);}MarkupBlob.prototype.parse = function (markup) {var rdrx = /^#REDIRECT:?\s*\[\[\s*([^\|{}[\]]+?)\s*]]\s*/i;var tprx = /^\s*{{([A-Za-z ]+)((?:\|(?:[^|{}]*|{{[^|}]*}})+)*)}}\s*/i;var m;m = rdrx.exec(markup.trim())markup = markup.substr(m[0].length);this.target = m[1];this.rcatt = {};out: while ((m = tprx.exec(markup))) {var alias = normaliseTitle(m[1]);while (templateAliases[alias])alias = templateAliases[alias]; // hopefully there are no loops.if (alias === "This is a redirect") {var params = m[2].split('|');for (var j = 0; j < params.length; ++j) {if (!params[j])continue;if (params[j].indexOf('=') !== -1)break out;alias = normaliseTitle("R " + params[j]);while (templateAliases[alias])alias = templateAliases[alias]; // hopefully there are still no loops.if (alias in redirectTemplates)this.rcatt[alias] = true;elsebreak out;}} else if (alias === "Redirect category shell") {var mm, rr = /{{(.*?)}}/g;while (mm = rr.exec(m[2])) {alias = normaliseTitle(mm[1]);while (templateAliases[alias])alias = templateAliases[alias];if (alias in redirectTemplates)this.rcatt[alias] = true;}} else if (alias in redirectTemplates) {if (m[2]) // TODObreak;this.rcatt[alias] = true;} else {break;}markup = markup.substr(m[0].length);}this.tail = markup;};MarkupBlob.prototype.toString = function () {var markup = '#REDIRECT [[' + this.target + ']]\n';var tail = '';var wrapped = [];for (var key in this.rcatt) {if (this.rcatt[key])if ((wrapped.length < 6) && /^R\s+/.test(key))wrapped.push('{{' + key + '}}\n');elsetail += '{{' + key + '}}\n';}if (wrapped.length)markup += "\n{{Redirect category shell|\n" + wrapped.join("") + "}}\n";markup += tail + '\n';markup += this.tail;return markup;};function buildTagList(rcatt) {function makeCheckBox(key) {return el('label', [el('input', null, {type: "checkbox",checked: (key in rcatt) ? "checked" : null,}, {change: function (ev) {rcatt[key] = this.checked;}}),' ',redirectTemplates[key].label], {"title": redirectTemplates[key].tooltip});}var list = el('dl', null, { "class": "tag-list" });var group = {};for (var key in templateGroups) {list.appendChild(el('dt', templateGroups[key]));list.appendChild(el('dd', group[key] = el('ul')));}for (var key in redirectTemplates) {var label = makeCheckBox(key);group[redirectTemplates[key].group].appendChild(el('li', label));}var collapsibleContent = el('div', list, { "class": "mw-collapsible-content","id": "capricorn-toggle-content"})return collapsibleContent;}////  Interface creation//function buildEditingUI(mblob, saveCallback) {var statusbar;var needsCheck = true;var doSave;var uiLink, uiTarget;mblob = mblob || new MarkupBlob();// Change text of status barfunction setStatus(status) {while (statusbar.firstChild) // Remove previous statusesstatusbar.removeChild(statusbar.firstChild);if (status) { // If status is a string, add itif (typeof status === 'string')statusbar.appendChild(document.createTextNode(status));else {  // Otherwise, loop through list and add statusesfor (var j = 0; j < status.length; ++j) {if (typeof status[j] === 'string')statusbar.appendChild(document.createTextNode(status[j]));elsestatusbar.appendChild(status[j]);}}}}// Check if the target has changed??// Not actually sure what this does yet 21 Oct 2019function inputChanged(ev) {/*jshint validthis:true */try {mblob.target = this.value;var t = new mw.Title(this.value);var frag = t.getFragment() ? '#' + normaliseAnchor(t.getFragment()) : '';if (uiLink) uiLink.href = mw.util.getUrl(t.getPrefixedDb(), { redirect: "no" }) + frag;setStatus();} catch (e) {setStatus('Invalid title.');if (uiLink) uiLink.href = 'javascript:void(0);';}needsCheck = true;}var uiStatusLine;var patrolLine;var origTarget = mblob.targetvar ui = el('form', [el('div', [el('ul', [el('li', [uiTarget = el('input', null, {'type': 'text','class': 'redirectText','value': mblob.target}, {'input': inputChanged,'change': inputChanged,'blur': function (ev) { // i would not have to write this, if it were not for jQuery. seriously.if (mblob.target === this.value)return;inputChanged.call(this, ev);}})])], { 'class': 'redirectText' }),el('input', null, {"type": "button","class":"capricorn-toggle","id": "capricorn-toggle-button","value": "Hide rcat list"}, {'click': function() {$( "#capricorn-toggle-content" ).toggle();var buttonText = $("#capricorn-toggle-button")[0].value;if (buttonText === "Hide rcat list") {$("#capricorn-toggle-button")[0].value = "Show rcat list"} else {$("#capricorn-toggle-button")[0].value = "Hide rcat list"};}})], { 'class': 'redirectMsg' }),buildTagList(mblob.rcatt),uiStatusLine = el('p', [patrolLine = el('span', [], {}),statusbar = el('span', [], {'class': 'status-line'}),el('span', [link(["Statistics for this page"], 'https://tools.wmflabs.org/pageviews?project=en.wikipedia.org&pages=' + encodeURIComponent(mw.config.get('wgPageName'))),' • ',link(["WP:TMR"], mw.util.getUrl("Wikipedia:Template messages/Redirect pages")),' • ',link(["About Capricorn"], mw.util.getUrl("User:Wugapodes/Capricorn"))], {'style': 'float: right;'})])], {'action': 'javascript:void(0)','class': 'kephir-sagittarius-editor'}, {'submit': function (ev) {ev.preventDefault();if (uiStatusLine.childNodes[1].childNodes[0]) {var patrolVal = uiStatusLine.childNodes[1].childNodes[0].childNodes[0].checked;if (patrolVal) {api.get({"action": "query","format": "json","prop": "revisions","meta": "tokens","titles": mw.config.get('wgPageName'),"rvprop": "ids","rvslots": "","rvlimit": "1","rvdir": "newer","type": "patrol"}, {success: function (result) {//console.log(mw.config.get('wgPageName'))var patrolToken = result["query"]["tokens"]["patroltoken"];var revIDpart = result["query"]["pages"];var revID = null;for (var page in revIDpart) {revID = revIDpart[page]["revisions"][0]["revid"];}//console.log(revID)api.post({"action": 'patrol',"revid": revID,"token": patrolToken}, {success: function (result) {if (result.error) {console.log(result.error);setStatus(['API error: "',result.error.info,'" [code: ', el('code', [result.error.code]), ']']);console.log(result.error)return;}}});}});}}ui.doCheck(saveCallback);}});ui.statusLine = uiStatusLine;ui.patrolLine = patrolLine;ui.origTarget = origTargetvar sectCache = {};var $uiTarget = jQuery(uiTarget);$uiTarget.suggestions({submitOnClick: false,delay: 500,fetch: function (query) {$uiTarget.suggestions('suggestions', []);if (query.indexOf('#') !== -1) {var title = query.substr(0, query.indexOf('#'));var sect = query.substr(query.indexOf('#') + 1);if (sectCache[title]) {var normSect = normaliseAnchor(sect);$uiTarget.suggestions('suggestions',sectCache[title].filter(function (item) {var norm = normaliseAnchor(item.anchor);return norm.substr(0, normSect.length) === normSect;}));return;}api.get({action: 'parse',page: title,prop: 'sections|properties',redirects: '1'}).then(function (result) {if (result.parse.redirects && result.parse.redirects.length) {// XXXreturn;}var disambig = false; // XXXvar normSect = normaliseAnchor(sect);sectCache[title] = result.parse.sections.map(function (item) {return {anchor: item.anchor,title: title + '#' + decodeURIComponent(item.anchor.replace(/_/g, ' ').replace(/\.([0-9A-Fa-f][0-9A-Fa-f])/g, '%')), // XXX: hackdisambig: disambig,toString: function () {return this.title;}};});$uiTarget.suggestions('suggestions',sectCache[title].filter(function (item) {var norm = normaliseAnchor(item.anchor);return norm.substr(0, normSect.length) === normSect;}));});return;}api.get({action: 'query',generator: 'allpages',gapprefix: query,gaplimit: 16,prop: 'info|pageprops',}).then(function (result) {var pglist = [];for (var pgid in result.query.pages) {var page = result.query.pages[pgid];pglist.push({title: page.title,pageid: page.pageid,disambig: page.pageprops && ('disambiguation' in page.pageprops),redirect: 'redirect' in page,toString: function () {return this.title;}});}$uiTarget.suggestions('suggestions', pglist);});},result: {render: function (item, content) {var elm = this[0];elm.appendChild(el('span', [item.title], {style: item.redirect ? 'font-style: italic' : ''}));if (item.disambig)elm.appendChild(el('small', [' (disambiguation page)']));if (item.redirect)elm.appendChild(el('small', [' (redirect)']));},select: function ($textbox) {var item = this.data('text');var textbox = $textbox[0];textbox.value = item.title;if (item.redirect) {api.get({action: 'query',pageids: item.pageid,redirects: '1'}).then(function (result) {var redir = result.query.redirects.pop();textbox.value = redir.to + (redir.tofragment ? '#' + redir.tofragment : '');});}return true;}}});ui.doCheck = function (callback) {var that = this;if (!/^\s*[^\|{}[\]]+\s*$/.test(mblob.target)) {setStatus(['Error: the target page name is invalid.']);return;}if (needsCheck) {var oldTarget = mblob.target;var normTarget;try {normTarget = new mw.Title(oldTarget);} catch (e) {setStatus(['"', oldTarget, '" is not a valid page name. Try again to proceed anyway.']);return;}setStatus(['Checking target validity...']);needsCheck = false;api.get({action: 'parse',page: oldTarget = mblob.target,prop: 'sections',redirects: '1'}, {success: function (result) {var m;if (result.error) {if (result.error.code === 'missingtitle') {setStatus(['Error: The target page "',link([normTarget.getPrefixedText()], mw.util.getUrl(normTarget.getPrefixedText(), { "class": "new" })),'" does not exist. Try again to proceed anyway.']);} else {setStatus(['API error: "',result.error.info,'" [code: ', el('code', [result.error.code]), ']']);}return;}if (result.parse.redirects && result.parse.redirects[0]) {var newTarget = result.parse.redirects[0].to + (result.parse.redirects[0].tofragment ? "#" + result.parse.redirects[0].tofragment : "");setStatus(['Error: The target page "',link([normTarget.getPrefixedText()], mw.util.getUrl(normTarget.getPrefixedText(), { redirect: "no" })),'" is already a redirect to "',link([newTarget], mw.util.getUrl(newTarget, { redirect: "no" })),'". Try again to proceed anyway, or ',link(['retarget this redirect to point there directly'], function () {uiTarget.value = mblob.target = newTarget +((!result.parse.redirects[0].tofragment && normTarget.fragment) ? '#' + normTarget.fragment : '');needsCheck = true;}),'.']);return;}if (normTarget.fragment) { // we have a section linkvar sect = normaliseAnchor(normTarget.fragment);var isValidSect = false;var sectlist = result.parse.sections;for (var j = 0; j < sectlist.length; ++j) {if (sectlist[j].anchor === sect)isValidSect = true;}if (!isValidSect) {setStatus(['Error: The target page "',link([normTarget.getPrefixedText()], mw.util.getUrl(normTarget.getPrefixedText(), { redirect: "no" })),'" does not have a a section called "',normTarget.fragment,'". Try again to proceed anyway.']);return;}}callback(setStatus);}});return;}callback(setStatus);};return ui;}function setSummary(current,orig) {    var summary;    if (orig === current) {        summary= "Modifying [[WP:RCAT|redirect categories]] using [[User:Wugapodes/Capricorn|Capricorn ♑]]";    } else {        summary = 'Redirecting to [[' + current + ']] ([[User:Wugapodes/Capricorn|♑]])'    }    return summary}if ((mw.config.get('wgAction') === 'view') && (mw.config.get('wgArticleId') === 0)) { // nonexistent page.uiWrapper.appendChild(el('div', [link(['Create a redirect'], function () {while (uiWrapper.hasChildNodes())uiWrapper.removeChild(uiWrapper.firstChild);var mblob = new MarkupBlob();var ui = buildEditingUI(mblob, function (setStatus) {setStatus(['Saving...']);var summary = setSummary(mblob.target,ui.origTarget)api.post({action: 'edit',title: mw.config.get('wgPageName'),createonly: 1,summary: summary,text: mblob.toString(),token: mw.user.tokens.get('csrfToken')}, {success: function (result) {if (result.error) {setStatus(['API error: "',result.error.info,'" [code: ', el('code', [result.error.code]), ']']);return;}setStatus(['Saved. Reloading page...']);if (/redirect=no/.test(location.href)) // XXXlocation.reload();elselocation.search = location.search ? location.search + '&redirect=no' : '?redirect=no';}});});ui.statusLine.insertBefore(el('input', null, {type: 'submit',value: 'Save'}), ui.statusLine.firstChild);uiWrapper.appendChild(ui);}), ' from this page with Capricorn'], {"class": "kephir-sagittarius-invite"}));contentText.parentNode.insertBefore(uiWrapper, contentText);} else if ((mw.config.get('wgAction') === 'view') && mw.config.get('wgIsRedirect') && redirMsg) {// start editor immediatelyuiWrapper.appendChild(el('div', ['Loading page source…'], {"class": "kephir-sagittarius-loading"}));contentText.insertBefore(uiWrapper, contentText.firstChild);api.get({action: 'query',prop: 'revisions',rvprop: 'timestamp|content',pageids: mw.config.get('wgArticleId'),rvstartid: mw.config.get('wgRevisionId'),rvlimit: 1,rvdir: 'older'}, {success: function (result) {if (result.error) {uiWrapper.appendChild(el('div', ['API error: "',result.error.info,'" [code: ', el('code', [result.error.code]), ']. Reload to try again.'], {"class": "kephir-sagittarius-error"}));return;}while (uiWrapper.hasChildNodes())uiWrapper.removeChild(uiWrapper.firstChild);var page = result.query.pages[mw.config.get('wgArticleId')];var mblob;var token = mw.user.tokens.get('csrfToken')try {mblob = new MarkupBlob(page.revisions[0]['*']);} catch(e) {uiWrapper.appendChild(el('div', ['Error: unable to parse page. Edit the source manually.'], {"class": "kephir-sagittarius-error"}));return;}redirMsg.parentNode.removeChild(redirMsg);var ui = buildEditingUI(mblob, function (setStatus) {setStatus(['Saving...']);var summary = setSummary(mblob.target,ui.origTarget)api.post({action: 'edit',title: mw.config.get('wgPageName'),basetimestamp: page.revisions[0].timestamp,summary: summary,text: mblob.toString(),token: mw.user.tokens.get('csrfToken')}, {success: function (result) {if (result.error) {setStatus(['API error: "',result.error.info,'" [code: ', el('code', [result.error.code]), ']']);return;}setStatus(['Saved. Reloading page...']);if (/redirect=no/.test(location.href)) // XXXlocation.reload();elselocation.search = location.search ? location.search + '&redirect=no' : '?redirect=no';}});});var userName = mw.user.getName();api.get({"action": "query","format": "json","list": "users","usprop": "groups","ususers": userName}, { success: function(result) {var groups = result["query"]["users"][0]["groups"]if (groups.includes("patroller")) {ui.patrolLine.insertBefore(el('label', [el('input', [], {'class': 'checkbox','type': 'checkbox','id': 'patrol','value': 'patrol'}), 'Mark as patrolled?']),null);}}});ui.statusLine.insertBefore(el('input', null, {type: 'submit',value: 'Save'}), ui.statusLine.firstChild);uiWrapper.appendChild(ui);}});} else if ((mw.config.get('wgPageContentModel') === 'wikitext') && ((mw.config.get('wgAction') === 'edit') || (mw.config.get('wgAction') === 'submit'))) {if (mw.util.getParamValue('section'))return;var editform = document.getElementById('editform');if (!editform || !editform.wpTextbox1 || editform.wpTextbox1.readOnly)return;var uiPivot = document.getElementsByClassName('wikiEditor-ui')[0];var ui, mblob;firstHeading.appendChild(document.createTextNode(' '));firstHeading.appendChild(link(['♑'], function () {if (ui && ui.parentNode)ui.parentNode.removeChild(ui);try {mblob = new MarkupBlob(editform.wpTextbox1.value);} catch (e) {alert("Error: unable to parse page. This page is probably not a redirect.");return;}currentTarget = mblob.targetui = buildEditingUI(mblob, function () {editform.wpSummary.value = 'Redirecting to [[' + mblob.target + ']] ([[User:Wugapodes/Capricorn|♑]])';editform.wpTextbox1.value = mblob.toString();mblob = null;ui.style.display = 'none';uiPivot.style.display = '';});ui.style.display = 'none';ui.statusLine.insertBefore(el('input', null, {type: "button",value: "Cancel",}, {click: function () {mblob = null;ui.style.display = 'none';uiPivot.style.display = '';}}), ui.statusLine.firstChild);ui.statusLine.insertBefore(el('input', null, {type: "submit",value: "Check"}), ui.statusLine.firstChild);uiPivot.parentNode.insertBefore(ui, uiPivot);uiPivot.style.display = 'none';ui.style.display = '';}, {"class": "kephir-sagittarius-editlink","title": "Edit this redirect with Capricorn"}));var submitButton;var inputs = editform.getElementsByTagName('input');for (var i = 0; i < inputs.length; ++i) {inputs[i].addEventListener('click', function (ev) {submitButton = this;}, false);}editform.addEventListener('submit', function (ev) {if (submitButton !== editform.wpSave)return;if (mblob) {ev.preventDefault();ev.stopImmediatePropagation();ui.doCheck(function (setStatus) {setStatus(['Proceeding with saving...']);var summary = setSummary(currentTarget,ui.origTarget)editform.wpTextbox1.value = mblob.toString();editform.wpSummary.value = summary;mblob = null;editform.submit();});}}, false);}if (!window.kephirSagittariusFollowCategoryRedirects)if ((mw.config.get('wgAction') === 'view') && (mw.config.get('wgNamespaceNumber') === wgNamespaceIds.category)) {var pagesList = document.getElementById('mw-pages').getElementsByClassName('mw-redirect');for (var i = 0; i < pagesList.length; ++i) {pagesList[i].href += '?redirect=no';}}}function abortConditions() {if (window.location.href.includes('&diff=')) {throw 'Capricorn does not run when viewing page diffs. Please revert before editing redirect.';}if (mw.config.get('wgNamespaceNumber') < 0) {throw 'Page is in a virtual namespace. Capricorn aborts.';}}function Capricorn() {$.getJSON("https:https://www.search.com.vn/wiki/index.php?lang=en&q=User:Wugapodes/Capricorn/RedirectAliases.json&action=raw&ctype=application/json", function(aliasJSON) {$.getJSON("https:https://www.search.com.vn/wiki/index.php?lang=en&q=User:Wugapodes/Capricorn/RedirectTemplates.json&action=raw&ctype=application/json",function(templateJSON) {mw.loader.using(['jquery.suggestions', 'mediawiki.api', 'mediawiki.Title', 'mediawiki.action.view.redirectPage'], function () {mainCallback(aliasJSON,templateJSON);});});});}var api = new mw.Api();api.get({action: "query",format: "json",prop: "info",formatversion: 2,titles: mw.config.get('wgPageName')}, {success: function (result) {try {abortConditions();} catch(abortMessage) {console.info(abortMessage)return;}if (result.query.pages[0].redirect || (window.location.href.includes('&redlink=1'))) {Capricorn();} else {console.debug('Page is not a redirect.')return;}}});/*</source> [[Category:Wikipedia scripts]]*/// </nowiki>