MediaWiki:Upload.js
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)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/**
* Special:Upload helpers — guess soldier page from filename and toggle profile vs document options.
*/
$(function () {
if (mw.config.get('wgCanonicalSpecialPageName') !== 'Upload') {
return;
}
var PHOTO_EXT = /(\.(jpe?g|png|gif|webp))$/i;
var DOC_EXT = /(\.(pdf|docx?|txt|rtf|odt|tiff?))$/i;
function field(name) {
return $('input[name="wp' + name + '"], textarea[name="wp' + name + '"]');
}
var $soldier = field('RitchieSoldierPage');
var $profile = field('RitchieProfilePhoto');
var $gallery = field('RitchieAddGallery');
var $filename = $('#wpUploadFile, input[name="wpUploadFile"]');
if (!$soldier.length || !$filename.length) {
return;
}
function basename(path) {
path = String(path || '');
var parts = path.replace(/\\/g, '/').split('/');
return parts[parts.length - 1] || '';
}
function guessSoldier(name) {
name = basename(name).replace(PHOTO_EXT, '').replace(DOC_EXT, '').replace(/_/g, ' ').trim();
var parts = name.split(/\s+/);
if (parts.length < 2) {
return $.Deferred().resolve('').promise();
}
var query = parts[1] + ' ' + parts[0];
return $.getJSON(mw.util.wikiScript('api'), {
action: 'query',
list: 'search',
srsearch: query,
srnamespace: 0,
srlimit: 8,
format: 'json'
}).then(function (data) {
var hits = (data.query && data.query.search) || [];
var first = parts[0].toLowerCase();
var last = parts[1].toLowerCase();
for (var i = 0; i < hits.length; i++) {
var title = hits[i].title || '';
var lower = title.toLowerCase();
if (lower.indexOf(last) !== -1 && lower.indexOf(first) !== -1 && /\(\d{5,}\)/.test(title)) {
return title;
}
}
return hits.length ? hits[0].title : '';
});
}
function refreshOptions() {
var file = basename($filename.val());
var isPhoto = PHOTO_EXT.test(file);
var isDoc = DOC_EXT.test(file);
$profile.closest('div').toggle(isPhoto || !file);
if (isDoc) {
$profile.prop('checked', false);
$gallery.prop('checked', true);
} else if (isPhoto) {
$gallery.prop('checked', false);
}
if (!file) {
return;
}
guessSoldier(file).done(function (title) {
if (title && !$soldier.val()) {
$soldier.val(title);
}
if (isPhoto && title) {
$profile.prop('checked', true);
}
});
}
$filename.on('change input', refreshOptions);
refreshOptions();
});