Pengguna:SNN95/Gadget-AGprefs.js
Catatan: Selepas menyiarkan perubahan, anda mungkin perlu memintas cache pelayar untuk melihatnya.
- Firefox / Safari: Tahan Shift sambil mengklik Reload, atau tekan sama ada Ctrl-F5 atau Ctrl-R (⌘-R pada Mac)
- Google Chrome: Tekan Ctrl-Shift-R (⌘-Shift-R pada Mac)
- Internet Explorer / Edge: Tahan Ctrl sambil mengklik Refresh, atau tekan Ctrl-F5
- Opera: Tekan Ctrl-F5.
'use strict'; /** per-browser preferences page **/
/*jshint undef:true, boss:true, latedef:true, shadow:true */
/*global mw, jQuery */
var gadgetList = { '': {} };
var prefs;
try {
prefs = window.localStorage.getItem('AGprefs');
} catch (e) {
prefs = jQuery.cookie('AGprefs');
}
prefs = prefs ? JSON.parse(prefs) : { gadgets: {}, modules: {}, sheets: {}, scripts: {} };
var uiContent = document.getElementById('mw-content-text');
var api = new mw.Api();
api.get({
action: 'query',
titles: 'MediaWiki:Gadgets-definition',
prop: 'revisions',
rvprop: 'content',
rvlimit: 1
}).then(function (result) {
var m, mm, wikitext;
for (var pageid in result.query.pages) {
wikitext = result.query.pages[pageid].revisions[0]['*'];
}
var lines = wikitext.split('\n'), msgQueue = {}, curGroup = '';
for (var i = 0; i < lines.length; ++i) {
if (m = /^==\s*(.*?)\s*==$/.exec(lines[i])) {
msgQueue['Gadget-section-' + m[1]] = true;
gadgetList[curGroup = m[1]] = {};
} else if (m = /^\*\s*([A-Za-z][A-Za-z0-9_\-]*)\s*(?:\[(.*?)\])?\|(.*)\s*$/.exec(lines[i])) {
msgQueue['Gadget-' + m[1]] = true;
var gadget = gadgetList[curGroup][m[1]] = {
options: {},
css: [],
js: []
};
if (m[2]) {
var opts = m[2].split('|');
for (var j = 0; j < opts.length; ++j) {
if (mm = /^(.*)=(.*)$/.exec(opts[j]))
gadget.options[mm[1]] = mm[2];
else
gadget.options[opts[j]] = true;
}
}
var files = m[3].split('|');
for (var j = 0; j < files.length; ++j) {
if (/\.css$/.test(files[j]))
gadget.css.push(files[j]);
else
gadget.js.push(files[j]);
}
}
}
var validGadgets = {}, validModules = {}, validJS = {}, validCSS = {};
for (var group in gadgetList) {
for (var name in gadgetList[group]) {
var gadget = gadgetList[group][name];
validGadgets[name] = true;
if (gadget.options.ResourceLoader || (gadget.js.length === 0)) {
validModules['ext.gadget.' + name] = true;
} else {
for (var i = 0; i < gadget.css.length; ++i)
validJS[gadget.css[i]] = true;
for (var i = 0; i < gadget.js.length; ++i)
validCSS[gadget.js[i]] = true;
}
}
}
for (var key in prefs.gadgets)
if (!(key in validGadgets))
delete prefs.gadgets[key];
for (var key in prefs.modules)
if (!(key in validModules))
delete prefs.modules[key];
for (var key in prefs.sheets)
if (!(key in validCSS))
delete prefs.sheets[key];
for (var key in prefs.scripts)
if (!(key in validJS))
delete prefs.scripts[key];
var msgs = {};
jQuery.Deferred(function (self) {
/*jshint loopfunc:true */
var promises = [], queue = Object.keys(msgQueue);
for (var i = 0; i < queue.length; i += 50) {
promises.push(api.get({
action: 'query',
meta: 'allmessages',
amenableparser: '1',
ammessages: queue.slice(i, i + 50).join("|")
}).then(function (result) {
for (var i = 0; i < result.query.allmessages.length; ++i) {
var mesg = result.query.allmessages[i];
if ('missing' in mesg)
msgs[mesg.name] = '<' + mesg.name + '>';
else
msgs[mesg.name] = mesg['*'];
}
}));
}
jQuery.when.apply(jQuery, promises).then(function () {
self.resolveWith(msgQueue);
}, function (data) {
self.rejectWith(data);
});
}).then(function (msgQueue) {
function makeListItem(name, gadget) {
var uiItem = document.createElement('li');
var uiInput = document.createElement('input');
var uiLabel = document.createElement('label');
uiInput.type = 'checkbox';
uiInput.checked = name in prefs.gadgets ? prefs.gadgets[name] : !!gadget.options['default'];
uiInput.addEventListener('change', function () {
prefs.gadgets[name] = this.checked;
if (gadget.options.ResourceLoader || (gadget.js.length === 0)) {
prefs.modules['ext.gadget.' + name] = this.checked;
} else {
for (var i = 0; i < gadget.css.length; ++i)
prefs.sheets[gadget.css[i]] = this.checked;
for (var i = 0; i < gadget.js.length; ++i)
prefs.scripts[gadget.js[i]] = this.checked;
}
}, false);
// XXX: messy
var html = (msgs['Gadget-' + name] || ("<Gadget-" + name + ">")).replace(/\[\[(?:(.*?)\|)?(.*?)\]\]/g, function (whole, page, label) {
return '<a href="' + mw.util.getUrl(page || label).replace(/[<"&>]/g, function (c) {
return '&#' + c.charCodeAt(0) + ';';
}) + '">' + label + '</a>';
});
uiLabel.innerHTML = html;
uiLabel.insertBefore(uiInput, uiLabel.firstChild);
uiItem.appendChild(uiLabel);
return uiItem;
}
var uiPrefs = document.createElement('div');
for (var group in gadgetList) {
var uiHeader = document.createElement('h2');
var uiList = document.createElement('ul');
uiHeader.textContent = msgs['Gadget-section-' + group];
for (var name in gadgetList[group]) {
var gadget = gadgetList[group][name];
if ('rights' in gadget.options)
continue; // XXX: we just assume we do not have the necessary rights
if ('skins' in gadget.options)
if (gadget.options.skins.split(',').indexOf(mw.config.get('skin')) === -1)
continue;
var uiItem = makeListItem(name, gadget);
uiList.appendChild(uiItem);
}
if (uiList.hasChildNodes()) {
if (group !== '')
uiPrefs.appendChild(uiHeader);
uiPrefs.appendChild(uiList);
}
}
var uiSave = document.createElement('input');
var uiReset = document.createElement('input');
uiSave.type = 'button'; uiSave.value = 'Apply and reload';
uiReset.type = 'button'; uiReset.value = 'Reset to defaults';
uiSave.addEventListener('click', function () {
var value = JSON.stringify(prefs);
try {
window.localStorage.setItem('AGprefs', value);
} catch (e) {
jQuery.cookie('AGprefs', value, { expire: 90 });
}
location.reload();
}, false);
uiReset.addEventListener('click', function () {
try {
window.localStorage.removeItem('AGprefs');
} catch (e) {
/* ignore */
}
jQuery.cookie('AGprefs', null);
location.reload();
}, false);
uiPrefs.appendChild(uiSave);
uiPrefs.appendChild(document.createTextNode(" "));
uiPrefs.appendChild(uiReset);
uiContent.appendChild(uiPrefs);
}, function () {
console.error('getting gadget names failed', arguments);
});
}, function () {
console.error('getting Gadgets-definition failed', arguments);
});