User:R'n'B/dabcolorizer.js
Appearance
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:R'n'B/dabcolorizer. |
// Version 0.6; beta release
importScript("User:R'n'B/wrappi.js");
// create a private namespace for this script
if (! mw.RnB) {
mw.RnB = {};
}
// Utility functions
mw.RnB.titleUrl = function (title) {
var normalized = mw.util.wikiUrlencode(title);
normalized = normalized.slice(0,1).toUpperCase() + normalized.slice(1);
return normalized.replace(/%21/g, "!").replace(/%24/g, "$").
// .replace(/'/g, "%27")
replace(/%28/g, "(").replace(/%29/g, ")").
replace(/%2A/g, "*").replace(/%2C/g, ",").
replace(/%3B/g, ";").replace(/%40/g, "@");
};
// dabtag script
mw.RnB.dabtag = {
initialize: function () {
var app = mw.RnB.dabtag; //shortcut
console.log("dabtag: Initialization");
if (! mw.RnB.Wiki) {
setTimeout(app.initialize, 100);
return;
}
app.api = new mw.RnB.Wiki();
// set document ready function
jQuery(function() {
var myDiv = document.createElement('div');
console.log("dabtag: Document ready");
myDiv.appendChild(
document.createTextNode('dabtag: loading'));
myDiv.id = "colorizerStatus";
jQuery('#siteSub').after(myDiv);
app.statusDiv = jQuery('#colorizerStatus');
app.statusDiv.css({
'display': 'block',
'font-size': '92%',
'font-weight': 'normal'
});
app.api.request(app.params, app.botCallback);
app.statusDiv.text("dabcolorizer: waiting for data");
});
},
doHighlighting: function (pagetitle) {
// finds all links on the dabpage to the target page, and
// changes their CSS class
var urltitle = 'a[href="/wiki/' + mw.RnB.titleUrl(pagetitle) + '"]',
urlsection = 'a[href^="/wiki/' + mw.RnB.titleUrl(pagetitle) + '#"]';
// mw.log("Highlighting " + urltitle);
jQuery(urltitle).add(urlsection).addClass(
pagetitle.indexOf("(disambiguation)") === -1 ?
"dabpagelink" : "dabpagelink intdablink");
},
params: { // API query parameters for page queries
action: 'query',
generator: 'links',
prop: 'info|pageprops',
gplnamespace: '0',
gpllimit: 'max',
ppprop: 'disambiguation',
titles: mw.config.get("wgPageName"),
redirects: '',
rawcontinue: ''
},
pagelinkdata: {}, // holds results from API response
redirectsFromTo: {}, // maps redirects to targets, from API response
redirectsToFrom: {}, // maps targets to redirects, from API response
botCallback: function (linkdata) {
// process results of the last API query, continue if necessary,
// and change CSS class of found links to disambig pages
var app = mw.RnB.dabtag, //shortcut
i,
isDisambig,
page,
pageid,
pqr,
qc,
r,
tmpl;
if (! linkdata.query) {
console.log("Page link query failed!");
app.statusDiv.fadeOut('slow');
return;
}
console.log("dabtag: Linkdata", linkdata);
qc = linkdata["query-continue"];
app.queryContinue = qc; /* for debugging */
if (qc) {
// query-continue was set, so launch another query
if (qc.links) {
app.params.gplcontinue = qc.links.gplcontinue;
}
app.api.request(app.params, app.botCallback);
}
app.statusDiv.text("dabcolorizer: working");
// save any redirects for future reference
pqr = linkdata.query.redirects;
if (pqr !== undefined) {
for (r=0; r < pqr.length; r++) {
app.redirectsFromTo[ pqr[r].from ] = pqr[r].to;
if (app.redirectsToFrom[ pqr[r].to ] === undefined) {
app.redirectsToFrom[ pqr[r].to ] = [];
}
app.redirectsToFrom[ pqr[r].to ].push(pqr[r].from);
}
}
// check each page link in the response
for (pageid in linkdata.query.pages) {
if (linkdata.query.pages.hasOwnProperty(pageid)) {
page = linkdata.query.pages[pageid];
app.pagelinkdata[pageid] = page;
// mw.log("Saving data for page " + page.title);
// skip red links
if (pageid < 0) {
// mw.log("Skipping redlink " + page.title);
continue;
}
/* SHOULD BE UNNECESSARY
// skip links we have already identified as disambigs
if (page.hasOwnProperty("known_dab")) {
// mw.log("Skipping known dab " + page.title);
continue;
}
*/
// see if this link has the disambiguation property
if (page.hasOwnProperty("pageprops")
&& page.pageprops.hasOwnProperty("disambiguation")) {
app.pagelinkdata[pageid].known_dab = true;
// mw.log("Marked " + page.title + " as known dab");
// find the link element(s) that match the title
app.doHighlighting(page.title);
// if page is target of a redirect, also highlight links
// to the redirect
if (app.redirectsToFrom[page.title]) {
for (i in app.redirectsToFrom[page.title]) {
if (app.redirectsToFrom[page.title].hasOwnProperty(i)) {
app.doHighlighting(app.redirectsToFrom[page.title][i]);
}
}
}
}
}
}
if (qc) { // query is being continued
app.statusDiv.text("dabcolorizer: waiting for data");
}
else { // query was not continued, we're done
app.statusDiv.text("dabcolorizer: done!");
app.statusDiv.fadeOut('slow');
}
}
};
mw.RnB.action = mw.config.get("wgAction");
if (mw.config.get("wgIsArticle") || jQuery("#wikiPreview").length > 0) {
mw.RnB.dabtag.initialize();
}