User:VasilievVV/metadata/assesslinks.js

/** * 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. */

assessment.links = { redirectTargets : [], rq : null,

/**	 * 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); },	/**	 * Load CSS and list of redirects before the main script is launched. */	assessLinks : function assessLinks { // Script-specific CSS rules importStylesheet('User:VasilievVV/metadata/assesslinks.css'); // Load request this.rq = sajax_init_object; // Load the redirects var that = this, apiRequestURL = wgServer + wgScriptPath + '/api.php?format=json&action=query&generator=links&gplnamespace=0&redirects&gpllimit=500&titles=' + encodeURIComponent(mw.config.get('wgPageName')); this.rq.onreadystatechange = function { that.loadRedirectList.apply(that, [that.rq]) };		this.rq.open( "GET", apiRequestURL, true ); },	/**	 * Loads the redirect map from API request and proceeds to link coloring. */	loadRedirectList : function loadRedirectList (request) { if (request.readyState == 4) { // Only do stuff with the request if it has a 200 status code if (request.status == 200) { document.write( request.responseText ); ajaxResult = eval('(' + request.responseText + ')'); var redirects = ajaxResult.query.redirects; if (redirects) for (var i = 0; i < redirects.length; i++) this.redirectTargets[redirects[i].from] = redirects[i].to; }

// Start the coloring itself this.doAssessLinks; }	},	/**	 * Find the assessment data for all links on the page, and color each * link accordingly. Requests are only sent one at a time. */	doAssessLinks: function doAssessLinks { 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 (RegExp('mw-redirect').test(el.getAttribute('class'))) { var target = this.redirectTargets[el.title]; if (target) url = mw.config.get('wgServer') + mw.config.get('wgScript') + '?action=raw&section=0&title=Talk:' + encodeURIComponent(target); }		if (url) { this.rq.onreadystatechange = function { that.modifyLink.apply(that, [that.rq, linkIndex]); };			this.rq.open( "GET", url, true ); }		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&section=0'; }			else if (/^Talk:[^_ ]/i.test(href.replace(localUrl, ''))) { url = href.replace('?', '&').replace('\/wiki\/', '\/w\/index.php?title=') + '&action=raw&section=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 addOnloadHook(function {	assessment.links.addToolboxLink.call(assessment.links); });