User:Geilamir/monobook.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 : [], /**    * 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 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')); assessment.ajaxMain(apiRequestURL, function {			that.loadRedirectList.apply(that, arguments)		}); },   /**     * 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) { 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) { 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&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); });