User:Qwerfjkl/scripts/unusedCategories.js
Appearance
< User:Qwerfjkl | scripts
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. |
This user script seems to have a documentation page at User:Qwerfjkl/scripts/unusedCategories and an accompanying .css page at User:Qwerfjkl/scripts/unusedCategories.css. |
// Forked from [[User:Writ Keeper/Scripts/TeahouseTalkbackLink.js]]
// <nowiki>
function tagCategory()
{
if ($("#mw-content-text").length > 0)
{
var $nodeListC = $('a[title^="Category:"]'),
pdneC = ' (page does not exist)';
if ($nodeListC !== null)
{
var i;
for (i = 0; i < $nodeListC.length; i++)
{
var $link = $($nodeListC[i]);
var newLinkStringC = "|";
var redlinkC = false;
var newLinkHrefC = $link[0].title;
if(newLinkHrefC.includes(pdneC))
{
redlinkC = true;
newLinkHrefC = newLinkHrefC.replace(pdneC, "");
}
var newLinkIdC = "TCsubmit" + i;
if (redlinkC === false)
{
newLinkStringC += '<a style="font-size:x-small; display:inline-block;" title="Tag page for deletion." noPopup=1 id="' + newLinkIdC + 'Delete">Delete</a>|';
newLinkStringC += '<a style="font-size:x-small; display:inline-block;" title="Tag page as empty category." noPopup=1 id="' + newLinkIdC + 'Tag">Tag</a>';
$($link).after(newLinkStringC);
$("#" + newLinkIdC + "Delete").click({"page":newLinkHrefC}, deleteSubmitC);
$("#" + newLinkIdC + "Tag").click({"page":newLinkHrefC}, tagSubmitC);
}
}
}
}
}
function deleteSubmitC(event) {
var page = event.data.page;
window.UnusedCategoriesPage = page; // Page will be converted to ID later
var params = {
action: 'query',
format: 'json',
titles: page,
prop: 'categoryinfo'
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
var pages = data.query.pages,
page;
for ( page in pages ) {
window.numPagesInCategoryC = pages[ page ].categoryinfo.pages + pages[ page ].categoryinfo.subcats;
if (window.numPagesInCategoryC < 1) { // pages in cat < 1, else skip
checkIfTaggedForDeletion( window.UnusedCategoriesPage, page );
}
else {
mw.notify("Too many pages in category ("+window.numPagesInCategoryC+"), aborted.");
}
}
} );
}
function checkIfTaggedForDeletion ( page, pageID ) {
window.abortIfCatEmpty = false;
var params = {
action: 'query',
format: 'json',
prop: 'categories',
titles: page
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
var pages = data.query.pages,
p;
for ( p in pages ) {
if (pages[ p ].categories != null) { // has cats
//alert(pages[ p ].categories)
pages[ p ].categories.forEach( function ( cat ) {
if ('Category:Empty categories awaiting deletion' === cat.title || 'Category:All categories for discussion' === cat.title || 'Category:Candidates for speedy deletion' === cat.title) {
// Abort, already tagged
window.abortIfCatEmpty = true;
mw.notify('Aborted, "'+page+'" is in a "category discussion" category.');
}
} );
}
}
if (window.abortIfCatEmpty === false) {
checkPageWikitext2( window.UnusedCategoriesPage, pageID );
}
//else { // Empty page - no categories
// checkPageWikitext2( window.UnusedCategoriesPage, pageID );
//}
} );
}
function checkPageWikitext2(page, pageID) {
var send_req = {
action: 'expandtemplates',
text: "{{:"+page+"}}",
titles: page,
prop: 'wikitext',
};
$.get( mw.config.get( 'wgScriptPath' ) + '/api.php', send_req, function( response ) {
window.textToCheckForCategories = $( response ).find( '*' ).text();
if (window.textToCheckForCategories.match(/__EXPECTUNUSEDCATEGORY__/) === null) { // No match
getPageDataC(pageID);
}
else {
mw.notify("'"+page+"' contains __EXPECTUNUSEDCATEGORY__, aborted.");
}
});
}
function getPageDataC( pageID ) {
// Get page creator - taken from [[User:Eizen/PageCreator.js]]
var PageCreator = {
getData: function (callback) {
var that = this;
this.api.get({
action: "query",
prop: "revisions",
titles: window.UnusedCategoriesPage,
rvprop: "ids|timestamp|user|userid",
rvlimit: "1",
rvdir: "newer",
format: "json"
}).done(function ($data) {
if (!$data.error) {
callback(that, $data);
}
});
},
/**
* @method handleData
* @param {object} that
* @param {json} $result
* @returns {void}
*/
handleData: function (that, $result) {
//var pageID = getID( page )
//mw.notify(pageID)
var $data = $result.query.pages[pageID].revisions[0];
submitDeleteEditsC( $data.user, pageID );
},
init: function () {
this.api = new mw.Api();
this.getData(this.handleData);
}
};
PageCreator.init();
}
function submitDeleteEditsC (pageCreator, page) {
// Check
if ( !confirm( "Are you sure? (Category contains "+window.numPagesInCategoryC+" pages.)")){
mw.notify("Aborted.");
return;
}
// Tag for deletion
var requestDataC =
{
minor: false,
prependtext: "{{db-catempty|help=off}}\n",
summary: "Requesting speedy deletion ([[Wikipedia:Criteria for speedy deletion#C1. Unpopulated categories|CSD C1]]) (via [[User:Qwerfjkl/scripts/unusedCategories|unusedCategories.js]])"
};
new mw.Api().edit(window.UnusedCategoriesPage, function() {
return requestDataC;
}).done(function(data) {
if (data && data.result && data.result === 'Success')
{
mw.notify("'"+window.UnusedCategoriesPage+"' tagged for deletion!");
}
else
{
alert('There was an error tagging "'+window.UnusedCategoriesPage+'" for deletion. Code: ' + data);
}
}).fail(function(data) {
alert('There was an error using AJAX to tag "'+window.UnusedCategoriesPage+'" for deletion. Error: ' + data);
});
// Notify talk
var requestDataC2 =
{
minor: false,
appendtext: "\n{{subst:db-catempty-notice|"+window.UnusedCategoriesPage+"}} ~~~~",
summary: "Notifying user ([[Wikipedia:Criteria for speedy deletion#C1. Unpopulated categories|CSD C1]]) (via [[User:Qwerfjkl/scripts/unusedCategories|unusedCategories.js]])"
};
//mw.notify("Created by: "+pageCreator)
//mw.notify("Tagging: "+window.UnusedCategoriesPage)
//mw.notify("Page ID: "+page)
if (pageCreator.match(/bot/i) === null) { // page creator isn't a bot - no match for 'bot' in username
if (pageCreator != 'Starcheerspeaksnewslostwars') {
new mw.Api().edit('User_talk:'+pageCreator, function() {
return requestDataC2;
}).done(function(data) {
if (data && data.result && data.result === 'Success')
{
mw.notify("'User:"+pageCreator+"' notified.");
}
else
{
alert('There was an error notifying "'+pageCreator+'". Code: ' + data);
}
}).fail(function(data) {
alert('There was an error using AJAX to notify the user "'+pageCreator+'". Error: ' + data);
});
}
else {
mw.notify('User:"'+pageCreator+'" was not notified, per request.');
}
}
else {
mw.notify("'User:"+pageCreator+"' is a bot, skipping.");
}
}
function getID( page ) {
mw.notify(page);
var params = {
action: 'query',
format: 'json',
titles: window.UnusedCategoriesPage,
prop: 'info',
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
var pages = data.query.pages,
p;
for ( p in pages ) {
mw.notify(pages[ p ].pageid);
return pages[ p ].pageid;
}
} );
}
function tagSubmitC(event){
var page = event.data.page;
checkPageWikitext(page);
}
function checkPageWikitext(page) {
var send_req = {
action: 'expandtemplates',
text: "{{:"+page+"}}",
titles: page,
prop: 'wikitext',
};
$.get( mw.config.get( 'wgScriptPath' ) + '/api.php', send_req, function( response ) {
window.textToCheckForCategories = $( response ).find( '*' ).text();
tagSubmitC2(page);
});
}
function tagSubmitC2(page) {
if (window.textToCheckForCategories.match(/__EXPECTUNUSEDCATEGORY__/) != null) { // There's a match
mw.notify( page+" contains __EXPECTUNUSEDCATEGORY__, aborted.");
return;
}
if ( !confirm( "Are you sure?")){
mw.notify("Aborted.");
return;
}
var requestDataC =
{
minor: false,
prependtext: "{{Possibly empty category}}\n",
summary: "+{{[[Template:Possibly empty category|Possibly empty category]]}} (via [[User:Qwerfjkl/scripts/unusedCategories|unusedCategories.js]])"
};
new mw.Api().edit(page, function() {
return requestDataC;
}).done(function(data) {
if (data && data.result && data.result === 'Success')
{
mw.notify(page+" tagged with {{Possibly empty category}}!");
}
else
{
alert('There was an error tagging "'+page+'". Code: ' + data);
}
}).fail(function(data) {
alert('There was an error using AJAX to tag "'+page+'". Error: ' + data);
});
}
if (mw.config.get("wgPageName") === "Wikipedia:Database_reports/Empty_categories" || mw.config.get("wgPageName") === "Special:UnusedCategories")
{
mw.loader.using("mediawiki.api", function()
{
// Taken from [[User:Anomie/linkclassifier.js]] to highlight categories tagged for deletion
mw.loader.getScript('//en.wikipedia.org/w/index.php?title=User:Anomie/linkclassifier.js&action=raw&ctype=text/javascript')
.then( function () {
// Linkback: [[User:Anomie/linkclassifier.js]]
importStylesheet('User:Anomie/linkclassifier.css'); // Linkback: [[User:Anomie/linkclassifier.css]]
// needs delay - wait until class applied (else does nothing. TODO)
$('a.deletion').parent().remove(); // hide tagged for deletion
})
tagCategory();
});
}
// </nowiki>