User:Ilmari Karonen/watchfilter.js
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// FILTER WATCHLIST BY NAMESPACE <pre><nowiki>
// NOTE: This script is now mostly OBSOLETE, as similar functionality has been added to MediaWiki. It also no longer works with "enhanced recent changes" enabled.
$(function () {
if (unescape(window.location.href).indexOf("Special:Watchlist") < 0) return;
// just one little ID attribute would be _so_ nice...
var wlNotePara = document.getElementsByTagName('hr')[0];
while (wlNotePara && !(wlNotePara.nodeType == 1 && wlNotePara.tagName.toLowerCase() == 'p'))
wlNotePara = wlNotePara.nextSibling;
if (!wlNotePara) return;
var nameSpaces = new Array ('Talk', 'User', 'User talk', 'Wikipedia', 'Wikipedia talk',
'Image', 'Image talk', 'MediaWiki', 'MediaWiki talk',
'Template', 'Template talk', 'Help', 'Help talk',
'Category', 'Category talk', 'Portal', 'Portal talk');
var list = new Array ();
var prepareFilter = function () {
var nsRegexp = new RegExp ("^(" + nameSpaces.join("|") + "):");
var foundNameSpaces = new Array ();
var dates = document.getElementById('content').getElementsByTagName('h4');
for (var i = 0; i < dates.length; i++) {
var node = dates[i].nextSibling;
while (node && node.nodeType != 1) node = node.nextSibling;
if (!node) continue;
var sublist = new Array ();
switch (node.tagName.toLowerCase()) {
case 'ul': // normal mode
sublist = node.getElementsByTagName('li');
break;
case 'div': // enhanced mode
var row = sublist[0] = document.createElement('span');
node.insertBefore(row, node.firstChild);
var subnode;
while (subnode = row.nextSibling) {
row.appendChild(subnode);
if (subnode.nodeType == 1 && subnode.tagName.toLowerCase() == 'br') {
var nextRow = document.createElement('span');
node.insertBefore(nextRow, row.nextSibling);
row = sublist[sublist.length] = nextRow;
}
}
break;
}
for (var j = 0; j < sublist.length; j++) {
var link = sublist[j].getElementsByTagName('a')[0];
if (!link) continue;
var nsPrefix = nsRegexp.exec(link.title);
nsPrefix = (nsPrefix ? nsPrefix[1] : "(Main)");
sublist[j].setAttribute('watchFilterNsPrefix', nsPrefix);
foundNameSpaces[nsPrefix] = true;
list[list.length] = sublist[j];
}
}
for (var i = 0; i < nsSelect.options.length; i++) {
if (nsSelect.options[i].value != "" && !foundNameSpaces[nsSelect.options[i].value]) {
nsSelect.options[i].style.color = 'graytext';
nsSelect.options[i].disabled = true;
}
}
};
var activateFilter = function () {
var nsPrefix = nsSelect.options[nsSelect.selectedIndex].value;
nsCheckbox.disabled = (nsPrefix == "");
var invert = (nsPrefix != "" && nsCheckbox.checked);
for (var i = 0; i < list.length; i++) {
var show = (nsPrefix == "" || nsPrefix == list[i].getAttribute('watchFilterNsPrefix'));
if (invert ? !show : show)
list[i].className = list[i].className.replace(/(^|\s)hiddenStructure(\s|$)/, "$2");
else
list[i].className = list[i].className.replace(/(?:(^|\s)hiddenStructure(\s|$)|$)/, " hiddenStructure$2");
}
};
var nsForm = document.createElement('form');
nsForm.style.display = 'inline';
nsForm.onsubmit = 'return false';
nsForm.appendChild(document.createTextNode('Namespace: '));
var nsSelect = document.createElement('select');
nsSelect.name = 'ns';
nsSelect.onchange = activateFilter;
nsForm.appendChild(nsSelect);
nsSelect.options[nsSelect.options.length] = new Option ("All", "", true);
nsSelect.options[nsSelect.options.length] = new Option ("(Main)");
for (var i = 0; i < nameSpaces.length; i++) {
nsSelect.options[nsSelect.options.length] = new Option (nameSpaces[i]);
}
var nsCheckboxLabel = document.createElement('label');
var nsCheckbox = document.createElement('input');
nsCheckbox.type = 'checkbox';
nsCheckbox.name = 'invert';
nsCheckbox.value = '1';
nsCheckbox.onclick = activateFilter;
nsCheckboxLabel.appendChild(nsCheckbox);
nsCheckboxLabel.appendChild(document.createTextNode(' Invert selection'));
nsForm.appendChild(document.createTextNode(' ('));
nsForm.appendChild(nsCheckboxLabel);
nsForm.appendChild(document.createTextNode(') '));
wlNotePara.appendChild(document.createElement('br'));
wlNotePara.appendChild(nsForm);
prepareFilter();
activateFilter();
});
// </nowiki></pre>