/**
* Optional component for metadata script ([[User:Pyrospirit/metadata.js]]).
* This script adds a link to the toolbox. When clicked, the script finds the
* assessment of all articles linked from the current article and colors the
* links accordingly.
*/
if(typeof assessment !== 'undefined') {
assessment.links = {
/**
* Add a link to the toolbox in the sidebar. Clicking the link runs the
* script.
*/
addToolboxLink: function addToolboxLink () {
var desc = 'Find the assessment of all articles linked and color the links';
mw.util.addPortletLink('p-tb', 'javascript:assessment.links.assessLinks()',
'Assess links', 't-assess-article-links', desc);
},
/**
* Find the assessment data for all links on the page, and color each
* link accordingly. Requests are only sent one at a time.
*/
assessLinks: function assessLinks () {
// Script-specific CSS rules
importStylesheet('User:Pyrospirit/metadata/assesslinks.css');
this.linkList = document.getElementById('bodyContent').getElementsByTagName('a');
// Start the first request
this.assessSingleLink(0);
},
/**
* Assess the link with the given index from the link list.
* @param {Number} linkIndex - the index of the link element to be assessed
*/
assessSingleLink: function assessSingleLink (linkIndex) {
if (linkIndex >= this.linkList.length)
return;
var el = this.linkList[linkIndex],
url = this.getRequestLink(el.href),
that = this;
if (url) {
assessment.ajaxMain(url, function () {
that.modifyLink.apply(that, arguments);
}, linkIndex);
}
else {
// Continue to next link
this.assessSingleLink(linkIndex + 1);
}
},
/**
* Given the href attribute of a link, finds and returns the talk page URL
* associated with it. Returns nothing for external or non-mainspace links.
* @param {String} href - the href attribute of the element to be assessed
* @return {String} url - the URL containing the assessment data
*/
getRequestLink: function getRequestLink (href) {
var localUrl = mw.config.get('wgServer') + mw.config.get('wgArticlePath').replace('$1', ''),
url;
if (href.replace(/#.*/, '') != document.location.href
&& RegExp('^' + localUrl).test(href)) {
if (!/^[a-z]+([_ ]talk)?:[^_ ]/i.test(href.replace(localUrl, ''))) {
url = href.replace('?', '&').replace('\/wiki\/', '\/w\/index.php?title=Talk:')
+ '&action=raw§ion=0';
}
else if (/^Talk:[^_ ]/i.test(href.replace(localUrl, ''))) {
url = href.replace('?', '&').replace('\/wiki\/', '\/w\/index.php?title=')
+ '&action=raw§ion=0';
}
return url;
}
},
/**
* The callback function for requests that are sent out. When the request
* is ready, parses the assessment data, colors the link, and starts the
* next request.
* @param {Object} request - an AJAX GET request containing assessment data
* @param {Number} index - the index of the element being assessed
*/
modifyLink: function modifyLink (request, index) {
if (request.readyState == 4) {
var assess = {rating: 'none', pageLink: [null, null], extra: [], activeReview: null};
// Only do stuff with the request if it has a 200 status code
if (request.status == 200) {
assess.rating = assessment.getRating(request.responseText);
}
var newClass = assessment.talkAssess(assess).newClass;
this.linkList[index].className += ' assess-wikilink ' + newClass;
// Start next request
this.assessSingleLink(index + 1);
}
}
};
// Add the toolbox link when the page loads
$(function () {
assessment.links.addToolboxLink.call(assessment.links);
});
}