User:Rillke/logo 2013 voy review.js

From Meta, a Wikimedia project coordination wiki

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
var txts = [],
    revChache = [],
    imgs,
    processImage,
    nextImage;
    
function firstItem(o) { for (var i in o) { if (o.hasOwnProperty(i)) { return o[i]; } } }

var query = function(qc) {
    // First, load the whole revision history into the chache
    $.get('//meta.wikimedia.org/w/api.php', {
        format: 'json',
        action: 'query',
        rawcontinue: '',
        prop: 'revisions',
        rvdir: 'newer',
        rvprop: 'content|user|ids',
        rvcontinue: qc,
        titles: 'Wikivoyage/Logo 2013/Submissions',
        rvlimit: 20
    }, function(r) {
        revChache = revChache.concat(firstItem(r.query.pages).revisions);
        if (r['query-continue']) {
            // This is not the clean way but here I do not have libAPI from Commons, which has auto-query :-(
            query(r['query-continue'].revisions.rvcontinue);
        } else {
            nextImage();
        }
    });
};
query();

processImage = function(f, i) {
    console.log('Doing' + f, i);
    var host = 'commons';
    
    var onDone = function(r) {
        console.log(r);
        if (!firstItem(r.query.pages).revisions) {
            if (host === 'meta') {
                 console.log('Skipping ' + f)
                nextImage();
            }
            host = 'meta';
            doAJAX();
        }
        var pg = firstItem(r.query.pages),
            rv = pg.revisions[0],
            ii = pg.imageinfo,
            am = rv['*'].match(/\\s*|\s*[Aa]uthor\s*\=\s*(.+?)\s*\n/),
            author = (am ? am[1] : '') || "''unknown''",
            uploaders = [];
        
        $.each(ii, function(c, iii) {
            if ($.inArray(iii.user,uploaders) < 0) uploaders.push(iii.user);
        });
            
        var re = new RegExp($.escapeRE(f).replace(/ /g, '[_ ]'), '');
        var added;
        var addItem = function(diff, rvuser) {
            added = true;
            txts.push('\n| ' + i + '\n| ' + '[[File:' + f + '|120x120px|' + f + ']]' + '<br /><code>File:' + f + '</code>' +
                '\n| ' + '{{user|' + uploaders.join('}}, {{user|') + '}}' + '\n| ' + author + '\n| ' + 
                (diff ? '[//meta.wikimedia.org/w/index.php?diff=' + diff + ' ' + rvuser + ']' : '' )+ '\n| ');
        };
        // Now, digg through the history
        $.each(revChache, function(r, rv) {
            if ( re.test( rv['*'] )) {
                addItem(rv.revid, rv.user);
                return false;
            }
        });
        if (!added) addItem();
        nextImage();
    };
    var doAJAX = function() {
        $.ajax({
            url: '//' + host + '.wikimedia.org/w/api.php',
            dataType: 'jsonp',
            data: {
                'format': 'json',
                'action': 'query',
                'prop': 'info|imageinfo|revisions',
                'rvprop': 'content',
                'iilimit': 100,
                'titles': 'File:' + f
            }
        }).done(onDone);
    };
    doAJAX();
};

imgs = $('li.gallerybox').map(function(i, el) {
   var $el = $(el),
    $img = $el.find('img'),
    src = $img.attr('src'),
    m = src.match(/(?:thumb\/[0-9a-f]\/[0-9a-f]{2}\/(.+)\/|\/[0-9a-f]\/[0-9a-f]{2}\/(.+))/);
   return decodeURI(( m[1] || m[2] ).replace(/_/g, ' '));
});
imgs = $.makeArray(imgs);
var origLen = imgs.length;

nextImage = function() {
    if (imgs.length) {
        processImage(imgs.shift(), origLen - imgs.length);
    } else {
        finish();
    }
};

var finish=function() {
    $('<pre>').appendTo('body').text(txts.join('\n|-\n'));
}