Jump to content

User:Gary/categorize promoted featured items.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// Generated by CoffeeScript 2.1.1
(function() {
  /*
    CATEGORIZE PROMOTED FEATURED ITEMS

    Description: At [[Wikipedia:Featured articles promoted in 2010]], shows the
      section from [[Wikipedia: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($('<th>Category</th>'));
        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, '<i>$1</i>'));
              }
              row.append($('<td><a href="' + '/wiki/' + pageType['all'] + '#' + encodeURIComponent(heading.replace(/\s/g, '_')).replace(/%/g, '.') + '">' + heading + '</a></td>'));
              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);