User:Gary/categorize promoted featured items.js

// Generated by CoffeeScript 2.1.1 (function { /*    CATEGORIZE PROMOTED FEATURED ITEMS

Description: At Featured articles promoted in 2010, shows the section from Featured articles under where each featured article is placed. */ var CategorizePromoted;

CategorizePromoted = class CategorizePromoted { static categorizePromotedCallback(obj) { var article, content, heading, matches, page, pageType, pages, section, sections; // Get the first, and should be only, article from the results pages = obj['query']['pages']; for (page in pages) { article = pages[page]; break; }     pageType = CategorizePromoted.categorizePromotedPageType; content = article['revisions'][0]['*']; // split "content" by section first sections = {}; // Go through WP:FA to find sections and their content while (content) { // 0: whole thing; 1: section title; 2: articles only matches = content.match(/\==+(.*?)==+\n([\s\S]*?)\n\n/); heading = matches[1]; section = matches[2]; sections[heading] = section; content = $.trim(content.replace(matches[0], '')); if (!content.match('==')) { break; }     }      return $('#bodyContent').find('.wikitable').each((index, element) => {        var $table, tbody;        $table = $(element);        tbody = $table.children(':first');        // add a new column at the end of the table        tbody.children(':first').append($(' Category '));        return tbody.children.each((index, element) => { var articlePattern, match, results, row; row = $(element); // Only continue if the node is an element and it contains something if (!(row[0].nodeType === 1 && row.children(':first').children(':first').contents.length)) { return true; }         results = []; for (heading in sections) { articlePattern = new RegExp('\\[\\[' + CategorizePromoted.escapeRegExp(row.children(':first').text) + '(\\|(.*?))?\\]\\]'); match = sections[heading].match(articlePattern); if (match) { // Make article title appear based on formatting on WP:FA if (match[2]) { row.find('a:first').contents.eq(0).replaceWith(match[2].replace(/(.*?)/g, $1)); }             row.append($(' ' + heading + ' ')); break; } else { results.push(void 0); }         }          return results; });     });    }

static categorizePromotedPageType { var conditions, featuredTypes, pageType, type; featuredTypes = { 'articles': { 'all': 'Wikipedia:Featured articles', 'promoted': 'Wikipedia:Featured articles promoted in YEAR' }     };      for (type in featuredTypes) { conditions = featuredTypes[type]['promoted'] && window.mw.config.get('wgPageName').replace(/_/g, ' ').indexOf(featuredTypes[type]['promoted'].replace('YEAR', '')) === 0; if (conditions) { pageType = featuredTypes[type]; break; }     }      return pageType; }

static escapeRegExp(str) { return str.replace(/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); }

static init { var pageType, parameters; if (!window.mw.config.get('wgPageName')) { return false; }     pageType = CategorizePromoted.categorizePromotedPageType; if (!pageType) { return false; }     // Fix the width of each column window.mw.util.addCSS('.wikitable th:nth-child(1) { width: 25%; } .wikitable th:nth-child(2) { width: 15%; } .wikitable th:nth-child(3) { width: 30%; } .wikitable th:nth-child(4) { width: 30%; }'); parameters = { action: 'query', prop: 'revisions', rvdir: 'older', rvlimit: 1, rvprop: 'content', titles: pageType['all'], format: 'json' };     return $.get(window.mw.config.get('wgScriptPath') + '/api.php', parameters, CategorizePromoted.categorizePromotedCallback); }

};

$(function {   return CategorizePromoted.init;  });

}).call(this);