User:Daask/sandbox/sagittarius.js
Appearance
< User:Daask | sandbox
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
Documentation for this user script can be added at User:Daask/sandbox/sagittarius. |
// <nowiki>
/*jshint undef:true, latedef:true, shadow:true, loopfunc:true, scripturl:true, undef:true */
/*globals jQuery, mw, importStylesheet */
mw.loader.using(['jquery.suggestions', 'mediawiki.api', 'mediawiki.Title', 'mediawiki.action.view.redirectPage'], function () { // <nowiki>
'use strict';
if (mw.config.get('wgNamespaceNumber') < 0)
return;
importStylesheet('User:Kephir/gadgets/sagittarius.css');
function normaliseAnchor(anchor) {
function 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();
}
}
// "." is not escaped!
return anchor.replace(/[^0-9A-Za-z_:\.]/g, function (m) { /* [\ud800-\udbff][\udc00-\dfff]| */
if (m.length === 2) { // surrogate pair
return 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 = {
"from": "Source",
"to" : "Target",
"misc": "Miscellaneous"
};
var templateAliases = {
"R to anchor" : "R to section",
"R to subtopic": "R to related topic",
"This is a redirect.": "This is a redirect",
"Redr" : "This is a redirect",
"Rcat shell" : "Redirect category shell",
"RCAT shell" : "Redirect category shell",
"redirect shell": "Redirect category shell",
"rcatsh" : "Redirect category shell",
"": ""
};
var wgNamespaceIds = mw.config.get('wgNamespaceIds');
var redirectTemplates = {
/* source */
"R restricted": {
"group": "from",
"label": "Name unavailable due to technical restrictions"
},
"R from initialism": {
"group": "from",
"label": "Initialism",
"auto": "capitals"
},
"R from alternative spelling": {
"group": "from",
"label": "Alternative spelling with same pronunciation"
},
"R from other capitalisation": {
"group": "from",
"label": "Other capitalisation"
},
"R from misspelling": {
"group": "from",
"label": "Misspelling",
"implies": "R unprintworthy"
},
"R from modification": {
"group": "from",
"label": "Modification (punctuation or word order)"
},
"R from plural": {
"group": "from",
"label": "Plural"
},
"R to plural": {
"group": "to",
"label": "Plural"
},
"R from name and country": {
"group": "from",
"label": "Name, Country/State/Province"
},
"R from long name": {
"group": "from",
"label": "Long name"
},
"R from alternative name": {
"group": "from",
"label": "Alternative name (nickname, etc.)"
},
"R from former name": {
"group": "from",
"label": "Former name with no historical significance"
},
"R from historic name": {
"group": "from",
"label": "Historic name",
"implies": ["R printworthy"]
},
"R from subtopic": {
"group": "from",
"label": "Sub-topic"
},
"R from scientific name": {
"group": "from",
"label": "Scientific name",
"implies": ["R printworthy"]
},
"R to scientific name": {
"group": "to",
"label": "Scientific name"
},
"R from alternative scientific name": {
"group": "from",
"label": "Alternative scientific name"
},
"R from molecular formula": {
"group": "from",
"label": "Molecular formula"
},
"R from alternative language": {
"group": "from",
"label": "Alternative language"
},
"R from ASCII": {
"group": "from",
"label": "ASCII-only title",
"auto": "from-ascii-to-unicode"
},
"R from Unicode": {
"group": "from",
"label": "Single Unicode character"
},
"R from diacritics": {
"group": "from",
"label": "Title with diacritics",
"conflict": "R from title without diacritics"
},
"R from title without diacritics": {
"group": "from",
"label": "Title without diacritics",
"conflict": "R from diacritics"
},
"R from surname": {
"group": "from",
"label": "Surname",
},
"R from CamelCase": {
"group": "from",
"label": "Old-style CamelCase name"
},
"R from unnecessary disambiguation": {
"group": "from",
"label": "Redundant disambiguation"
},
"R to decade": {
"group": "to",
"label": "Decade article"
},
"R to disambiguation page": {
"group": "to",
"label": "Disambiguation page"
},
"R from ambiguous page": {
"group": "from",
"label": "Ambiguous title"
},
"R from EXIF": {
"group": "from",
"label": "Title derived from EXIF data"
},
"R to list entry": {
"group": "to",
"label": "List entry"
},
"R from member": {
"group": "from",
"label": "Member of the target organisation"
},
"R to related topic": {
"group": "to",
"label": "Related topic"
},
"R from related word": {
"group": "from",
"label": "Related word"
},
"R from school": {
"group": "from",
"label": "School"
},
"R to section": {
"group": "to",
"label": "Section",
"auto": "anchor"
},
"R from shortcut": {
"group": "from",
"label": "Shortcut",
"conflict": "R from template shortcut"
},
"R from template shortcut": {
"group": "from",
"label": "Template shortcut",
"conflict": "R from shortcut"
},
"R from song": {
"group": "from",
"label": "Song (to artist article)"
},
"R from book": {
"group": "from",
"label": "Book (to author or publisher)"
},
"R from duplicated article": {
"group": "from",
"label": "Duplicated article"
},
"R from merge": {
"group": "from",
"label": "Merged article"
},
"R from move": {
"group": "from",
"label": "Moved title"
},
"R from album": {
"group": "from",
"label": "Album name"
},
"R from mathematical symbol or equation": {
"group": "from",
"label": "Mathematical symbol or equation"
},
"R to category": {
"group": "to",
"label": "Category namespace (from other namespaces)",
"target-namespace": wgNamespaceIds.category,
"xnr-only": true
},
"R to help": {
"group": "to",
"label": "Help namespace",
"target-namespace": wgNamespaceIds.help
},
"R to main": {
"group": "to",
"label": "Main namespace (from other namespaces)",
"target-namespace": 0,
"xnr-only": true
},
"R to portal": {
"group": "to",
"label": "Portal namespace",
"target-namespace": wgNamespaceIds.portal
},
"R to talk": {
"group": "to",
"label": "Talk namespace",
"target-talk": true
},
"R to template": {
"group": "to",
"label": "Template namespace (from other namespaces)",
"target-namespace": wgNamespaceIds.template,
"xnr-only": true
},
"R to user": {
"group": "to",
"label": "User namespace",
"target-namespace": wgNamespaceIds.user
},
"R to project": {
"group": "to",
"label": "Wikipedia namespace",
"target-namespace": wgNamespaceIds.project
},
/* miscellanea */
"R with old history": {
"group": "misc",
"label": "Has old history"
},
"R for convenience": {
"group": "misc",
"label": "Purely for convenience"
},
"R with possibilities": {
"group": "misc",
"label": "Might be worthy of own article",
"conflict": [
"R unprintworthy",
"R from subtopic without possibilities",
"R from highway in region without possibilities"
]
},
"R unprintworthy": {
"group": "misc",
"label": "Unprintworthy",
"conflict": "R printworthy"
},
"R printworthy": {
"group": "misc",
"label": "Printworthy",
"conflict": "R unprintworthy"
},
"": void(0) // for convenience
};
delete redirectTemplates[""];
var api = new mw.Api();
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 = '';
} else
this.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;
if (!(m = rdrx.exec(markup)))
throw new Error('Not a redirect');
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;
else
break 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]) // TODO
break;
this.rcatt[alias] = true;
} else {
break;
}
markup = markup.substr(m[0].length);
}
this.tail = markup;
};
MarkupBlob.prototype.toString = function () {
var markup = '#REDIRECT [[' + this.target + ']] ';
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');
else
tail += '{{' + key + '}}\n';
}
if (wrapped.length)
markup += "{{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));
}
return list;
}
function buildEditingUI(mblob, saveCallback) {
var statusbar;
var needsCheck = true;
var doSave;
var uiLink, uiTarget;
mblob = mblob || new MarkupBlob();
function setStatus(status) {
while (statusbar.firstChild)
statusbar.removeChild(statusbar.firstChild);
if (status) {
if (typeof status === 'string')
statusbar.appendChild(document.createTextNode(status));
else {
for (var j = 0; j < status.length; ++j) {
if (typeof status[j] === 'string')
statusbar.appendChild(document.createTextNode(status[j]));
else
statusbar.appendChild(status[j]);
}
}
}
}
function inputChanged(ev) {
/*jshint validthis:true */
try {
mblob.target = this.value;
var t = new mw.Title(this.value);
var frag = t.getFragment() ? '#' + normaliseAnchor(t.getFragment()) : '';
uiLink.href = mw.util.getUrl(t.getPrefixedDb(), { redirect: "no" }) + frag;
setStatus();
} catch (e) {
setStatus('Invalid title.');
uiLink.href = 'javascript:void(0);';
}
needsCheck = true;
}
var uiStatusLine;
var 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' })
], { 'class': 'redirectMsg' }),
buildTagList(mblob.rcatt),
uiStatusLine = el('p', [
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(["About Sagittarius"], mw.util.getUrl("User:Kephir/gadgets/sagittarius"))
], {
'style': 'float: right;'
})
])
], {
'action': 'javascript:void(0)',
'class': 'kephir-sagittarius-editor'
}, {
'submit': function (ev) {
ev.preventDefault();
ui.doCheck(saveCallback);
}
});
ui.statusLine = uiStatusLine;
var 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) {
// XXX
return;
}
var disambig = false; // XXX
var 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, '%$1')), // XXX: hack
disambig: 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 link
var 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;
}
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...']);
api.post({
action: 'edit',
title: mw.config.get('wgPageName'),
token: mw.user.tokens.get('editToken'),
createonly: 1,
summary: 'Redirecting to [[' + mblob.target + ']] ([[User:Kephir/gadgets/sagittarius|♐]])',
text: mblob.toString()
}, {
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)) // XXX
location.reload();
else
location.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 Sagittarius'
], {
"class": "kephir-sagittarius-invite"
}));
contentText.parentNode.insertBefore(uiWrapper, contentText);
} else if ((mw.config.get('wgAction') === 'view') && mw.config.get('wgIsRedirect') && redirMsg) {
// start editor immediately
uiWrapper.appendChild(el('div', ['Loading page source…'], {
"class": "kephir-sagittarius-loading"
}));
contentText.insertBefore(uiWrapper, contentText.firstChild);
api.get({
action: 'query',
prop: 'info|revisions',
rvprop: 'timestamp|content',
pageids: mw.config.get('wgArticleId'),
rvstartid: mw.config.get('wgRevisionId'),
rvlimit: 1,
rvdir: 'older',
intoken: 'edit',
}, {
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 = page.edittoken;
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...']);
api.post({
action: 'edit',
title: mw.config.get('wgPageName'),
basetimestamp: page.revisions[0].timestamp,
token: mw.user.tokens.get('editToken'),
summary: 'Redirecting to [[' + mblob.target + ']] ([[User:Kephir/gadgets/sagittarius|♐]])',
text: mblob.toString()
}, {
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)) // XXX
location.reload();
else
location.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);
}
});
} 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.wpTextbox1.readOnly)
return;
var uiPivot = document.getElementsByClassName('wikiEditor-ui')[0];
// Seemingly randomly, this sometimes doesn't exist. Further debugging is necessary.
if (!uiPivot)
return nil;
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;
}
ui = buildEditingUI(mblob, function () {
editform.wpSummary.value = 'Redirecting to [[' + mblob.target + ']] ([[User:Kephir/gadgets/sagittarius|♐]])';
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 Sagittarius"
}));
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...']);
editform.wpTextbox1.value = mblob.toString();
editform.wpSummary.value = 'Redirecting to [[' + mblob.target + ']] ([[User:Kephir/gadgets/sagittarius|♐]])';
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';
}
}
});
// </nowiki>