/// User:PerfektesChaos/js/watchCategories/d.js
/// 2018-08-24 [email protected]
// Display member count of some (maintenance) categories on watchlist
// ResourceLoader: compatible;
// dependencies: user, mediawiki.api, mediawiki.util
// namespaces: -1
// doc: w:en:PerfektesChaos/js/watchCategories
/// Fingerprint: #0#0#
/// @license GPL [//www.mediawiki.org/w/COPYING] (+GFDL, LGPL, CC-BY-SA)
/// <nowiki>
/* jshint forin:false */
/* global window:false */
/* jshint bitwise:true, curly:true, eqeqeq:true, latedef:true,
laxbreak:true,
nocomma:true, strict:true, undef:true, unused:true */
( function ( mw, $ ) {
"use strict";
var WatCat = "watchCategories",
Version = -1.3;
if ( typeof mw.libs[ WatCat ] !== "object"
|| ! mw.libs[ WatCat ] ) {
mw.libs[ WatCat ] = { };
}
mw.libs[ WatCat ].type = WatCat;
WatCat = mw.libs[ WatCat ];
WatCat.doc = "[[w:en:User:PerfektesChaos/js/" + WatCat + "]]";
WatCat.vsn = Version;
// Requires: JavaScript 1.3
function fire() {
// Intialize application, check for meaningful usage
// Uses:
// > .type
// > .cats
// mw.loader.getState()
// mw.loader.state()
// mw.loader.using()
// feed()
// (WatCat.fire)
// 2018-08-24 [email protected]
var signature = "ext.gadget." + WatCat.type,
rls;
if ( mw.loader.getState( signature ) !== "ready" ) {
rls = { };
rls[ signature ] = "ready";
mw.loader.state( rls );
if ( WatCat.cats ) {
mw.loader.using( [ "user",
"mediawiki.api",
"mediawiki.util" ],
WatCat.fire );
}
}
} // fire()
WatCat.factory = function ( already ) {
// Return single object
// Precondition:
// already -- object with user defined data
// Postcondition:
// Returns object
// Uses:
// mw.util.$content
// 2013-05-31 [email protected]
var r, s, v;
if ( already.cat ) {
r = { };
for ( s in already ) {
v = already[ s ];
if ( v ) {
r[ s ] = v;
}
} // for s in r
r.cat = r.cat.replace( /_/g, " " );
if ( typeof( r.min ) !== "number" ) {
r.min = 1;
}
if ( typeof( r.ns ) !== "number" ) {
r.ns = -1;
}
if ( r.ns === -1 && typeof( r.title ) !== "string" ) {
r.title = "Watchlist";
}
if ( typeof( r.append ) !== "string" &&
typeof( r.before ) !== "string" ) {
if ( r.ns === -1 && r.title === "Watchlist" ) {
r.before = "#mw-content-text";
} else {
r.before = mw.util.$content;
}
}
if ( typeof( r.style1 ) !== "string" ) {
r.style1 = "border: solid 2px #FF0000;"
+ " padding: 3px;"
+ " color: #FF0000;";
}
if ( r.min < 1 && typeof( r.style0 ) !== "string" ) {
r.style0 = "border: solid 1px #008000;"
+ " padding: 3px;"
+ " color: #008000;";
}
}
return r;
}; // .factory()
WatCat.find = function () {
// Launch API query
// Uses:
// this
// > .q
// < .reSp
// < .space
// .finder()
// 2013-05-31 [email protected]
var e, i, s;
var n = this.q.length;
var sP = false;
var sT = false;
for ( i = n - 1; i >= 0; i-- ) {
e = this.q[ i ];
if ( e.ns === this.nsN && e.title === this.title ) {
switch ( typeof( e.cat ) ) {
case "string" :
s = "Category:" + e.cat;
if ( sT ) {
sT = sT + "|" + s;
} else {
sT = s;
}
break;
case "number" :
e.curid = e.cat;
delete e.cat;
if ( sP ) {
sP = sP + "|";
} else {
sP = "";
}
sP = sP + e.curid;
break;
} // switch typeof e.cat
} else {
this.q[ i ] = false;
}
} // for i--
if ( sP || sT ) {
this.reSp = new RegExp( " ", "g" );
this.space = mw.config.get( "wgFormattedNamespaces" )[ 14 ];
}
if ( sP ) {
this.finder( sP, false );
}
if ( sT ) {
sT = sT.replace( this.reSp, "_" );
this.finder( sT, true );
}
}; // .find()
WatCat.finder = function ( ask, assigned ) {
// Launch API query
// Precondition:
// ask -- pipe separated page list
// assigned -- true: titles; false: pageids
// Uses:
// this
// (.found)
// 2013-05-31 [email protected]
var a = new mw.Api();
var o = { action: "query",
prop: "categoryinfo" };
if ( assigned ) {
o.titles = ask;
} else {
o.pageids = ask;
}
a.get( o ).done( this.found );
}; // .finder()
WatCat.fire = function () {
// Check whether anything to do
// Precondition:
// .cats present
// Uses:
// > .cats
// < .nsN
// < .title
// < .q
// mw.config.get()
// .factory()
// .find()
// Remark: Used as event handler -- 'this' is not WatCat
// 2013-05-31 [email protected]
var e, i, n,
launch = false;
WatCat.nsN = mw.config.get( "wgNamespaceNumber" );
if ( WatCat.nsN === -1 ) {
WatCat.title = mw.config.get( "wgCanonicalSpecialPageName" );
}
switch ( typeof( WatCat.cats ) ) {
case "string" :
case "number" :
if ( WatCat.nsN === -1 ) {
if ( WatCat.title === "Watchlist" ) {
WatCat.q = [ WatCat.factory( { cat: WatCat.cats } )
];
launch = true;
}
}
break;
case "object" :
n = WatCat.cats.length;
if ( typeof( n ) === "number" ) {
if ( WatCat.nsN !== -1 ) {
WatCat.title = mw.config.get( "wgTitle" );
}
WatCat.q = [ ];
for ( i = 0; i < n; i++ ) {
e = WatCat.cats[ i ];
switch ( typeof( e ) ) {
case "string" :
case "number" :
e = WatCat.factory( { cat: e } );
break;
case "object" :
e = WatCat.factory( e );
break;
default :
e = false;
} // switch typeof e
if ( e ) {
if ( e.ns === WatCat.nsN ) {
if ( e.title === WatCat.title ) {
WatCat.q.push( e );
launch = true;
}
}
}
} // for i
}
break;
} // switch typeof .cats
if ( launch ) {
WatCat.find();
}
}; // .fire()
WatCat.flag = function ( adhere, about, amount, alter ) {
// Mark detected "common-error" in Module transclusion
// Precondition:
// adhere -- configuration object
// about -- category title
// amount -- number of pages in category
// alter -- iff string: different link title
// Uses:
// this
// > .type
// > .reSp
// .furnish()
// 2018-08-24 [email protected]
var s;
if ( amount >= adhere.min ) {
s = "<div style='margin-top: 5px; margin-bottom: 5px;'>"
+ "<span "
+ ( adhere.id ? "id='" + adhere.id + "' "
: "class='" + WatCat.type + "' " )
+ "style='"
+ ( amount ? adhere.style1 : adhere.style0 )
+ "'>"
+ "<a href='/wiki/Category:"
+ about.replace( this.reSp, "_" )
+ "'>"
+ ( typeof( alter ) === "string" ? alter
: about )
+ "</a>"
+ ( amount ? " #<strong>" + amount + "</strong>"
: "" )
+ "</span></div>";
if ( adhere.append ) {
this.furnish( s, adhere.append, true );
} else if ( adhere.before ) {
this.furnish( s, adhere.before, false );
}
}
}; // .flag()
WatCat.found = function ( arrived ) {
// Show API success on pagesincategory
// Precondition:
// arrived -- JSON result of ajax query
// Uses:
// > .q
// > .space
// .flag()
// Remark: Used as event handler -- 'this' is not WatCat
// 2013-12-25 [email protected]
var e, g, i, p, s,
got = arrived.query,
j = WatCat.space.length + 1,
n = WatCat.q.length;
if ( got ) {
got = got.pages;
if ( got ) {
for ( g in got ) {
p = got[ g ];
for ( i = 0; i < n; i++ ) {
e = WatCat.q[ i ];
if ( p && e ) {
if ( p.title ) {
s = p.title.substr( j );
if ( typeof( p.pageid ) !== "number" ) {
p.pageid = -2;
}
if ( p.pageid === e.curid || s === e.cat ) {
p = p.categoryinfo;
if ( p ) {
WatCat.flag( e, s, p.pages, e.text );
}
}
}
}
} // for i
} // for g in got
}
}
}; // .found()
WatCat.furnish = function ( apply, adjacent, append ) {
// Insert element content
// Precondition:
// apply -- string with content to be inserted
// adjacent -- element; selector string or jQuery
// append -- true: append; false: before
// Uses:
// mw.util.$content
// jQuery()
// jQuery().append()
// jQuery().before()
// 2013-05-31 [email protected]
var $e;
var $i = $( apply );
switch ( typeof( adjacent ) ) {
case "string" :
$e = $( adjacent );
break;
case "object" :
$e = adjacent;
break;
default:
$e = false;
} // switch typeof adjacent
if ( ! $e.length ) {
$e = mw.util.$content;
}
if ( append ) {
$e.append( $i );
} else {
$e.before( $i );
}
}; // .furnish()
fire();
}( window.mediaWiki, window.jQuery ) );
// Emacs
// Local Variables:
// coding: utf-8-dos
// fill-column: 80
// End:
/// EOF </nowiki> watchCategories/d.js