User:Neolexx/CommonsRing.js
Jump to navigation
Jump to search
Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.
Documentation for this user script can be added at User:Neolexx/CommonsRing. |
- Report page listing warnings and errors.
/* BEGIN */ jQuery(document).ready(function() {
/* *********************
MAIN */
if (location.href != 'https://commons.wikimedia.org/wiki/User:Neolexx/CommonsRing.JS') {
return;
}
else if (typeof ScriptEngineMajorVersion == 'function' && ScriptEngineMajorVersion() < 9) {
window.alert('Вы используете устаревшую версию Internet Explorer, которая более не поддерживается.');
return;
}
else {
// OK, let's have it...
}
var CANONICAL_URL = 'https://commons.wikimedia.org/wiki/';
var SCRIPT_PATH = 'https://commons.wikimedia.org/w/api.php';
var HOME_WIKI = 'ru.wikipedia.org';
var WIKI_LANGUAGE_CODE = 'ru';
var ISO_LANGUAGE_CODE = 'ru-RU';
var DIALOG_MESSAGE = [
'Проверить состояние вклада с аккаунта:',
' \u2014 такой аккаунт не найден.'
];
var LOADING_SIGN = '<img '.concat(
'width="120" height="79" src="https://upload.wikimedia.org/wikipedia/commons/',
'thumb/b/b1/Loading_icon.gif/120px-Loading_icon.gif">'
);
var LI_BASE = '<li style="margin-bottom:1em;padding:0.5em 1em;';
var LI_OK_USED = 'outline:green solid 2px;">';
var LI_OK_UNUSED = 'outline:green dashed 2px;">';
var LI_DR_USED = 'outline:red solid 2px;">';
var LI_DR_UNUSED = 'outline:red dashed 2px;">';
var queryBase = {
format : 'json',
formatversion : 2,
action : 'query'
};
var queryUserProfile = jQuery.extend({}, queryBase, {
list : 'users',
usprop : 'groups|editcount|registration',
ususers : ''}
);
var queryContributorUploads = jQuery.extend({}, queryBase, {
list : 'usercontribs',
uclimit : 'max',
ucnamespace : 6,
ucshow : 'new',
ucprop : 'title',
ucuser : ''}
);
var queryWikipediaUsage = jQuery.extend({}, queryBase, {
prop : 'globalusage',
gulimit : 'max',
gufilterlocal : 1,
guprop : 'url|namespace',
titles : ''}
);
var queryPendingDeleteRequest = jQuery.extend({}, queryBase, {
prop : 'templates',
tltemplates : 'Template:Delete|Template:Copyvio|Template:Duplicate',
titles : ''}
);
var cnt = ''; // batch queries 'continue' field
var ptr = -1; // global cycle pointer
var resource = null; // current file
var record = ''; // current record markup
var usage_list = ''; // wiki usage list
var ups = []; // uploaded files
var dat = { // data summary
used : [], // used at home wiki
dr_used : [], // used with DR pending
dr_unused : [] // unused with DR pending
};
var contributor = mw.config.get('wgUserName') || '';
getContributorProfile(DIALOG_MESSAGE[0], contributor);
/* *********************
MAIN FUNCTIONS */
function getContributorProfile() {
contributor = window.prompt(arguments[0], arguments[1]);
if (!!contributor) {
queryUserProfile.ususers = contributor;
jQuery.get(SCRIPT_PATH, queryUserProfile, showContributorProfile);
}
}
function showContributorProfile(data) {
if ('missing' in data.query.users[0]) {
getContributorProfile(contributor.concat(DIALOG_MESSAGE[1], '\n', DIALOG_MESSAGE[0]), '');
}
else {
_$('Nx_Timestamp').textContent = 'check started: '.concat((new Date()).toUTCString());
_$('Nx_Name').innerHTML = getComboLink(CANONICAL_URL.concat('User:', contributor), contributor, 'c:', false);
_$('Nx_Registration').textContent = 'активность на Викискладе с '.concat(getDateString(data.query.users[0].registration));
_$('Nx_Edits').textContent = 'правок на Викискладе: '.concat(data.query.users[0].editcount);
_$('Nx_Status').textContent = 'статус на Викискладе: '.concat(getUserProjectStatus(data.query.users[0].groups));
_$('Nx_Total').textContent = 'загруженых файлов: ...'
_$('Nx_Summary').innerHTML = LOADING_SIGN;
queryContributorUploads.ucuser = contributor;
window.setTimeout(getContributorUploads, 10);
}
}
function getContributorUploads() {
if (cnt != '') {
queryContributorUploads.uccontinue = cnt;
}
else {
cnt = '';
delete queryContributorUploads.uccontinue;
}
jQuery.get(SCRIPT_PATH, queryContributorUploads,
function(data) {
jQuery.merge(ups, data.query.usercontribs);
if ('continue' in data) {
cnt = data.continue.uccontinue;
window.setTimeout(getContributorUploads, 10);
}
else {
if (ups.length > 0) {
_$('Nx_Total').textContent = 'загруженых файлов: '.concat(ups.length);
window.setTimeout(checkContributions, 10);
}
else {
_$('Nx_Total').textContent = 'загрузок не найдено';
_$('Nx_Summary').style.display = 'none';
}
}
}
);
}
function checkContributions() {
ptr++;
if (ptr < ups.length) {
queryWikipediaUsage.titles = ups[ptr].title;
jQuery.get(SCRIPT_PATH, queryWikipediaUsage,
function(data) {
usage_list = '<ol>';
for (var p in data.query.pages) {
resource = data.query.pages[p];
break;
// the simplest for such nutty data sructure...
}
for (var i=0; i<resource.globalusage.length; i++) {
if ( (resource.globalusage[i].wiki == HOME_WIKI) && (resource.globalusage[i].ns == 0) ) {
usage_list+= '<li>'.concat(
getComboLink(resource.globalusage[i].url, resource.globalusage[i].title, 'w:ru:', false),
'</li>'
);
}
}
usage_list+= '</ol>';
record = LI_BASE;
}
).done(function() {
queryPendingDeleteRequest.titles = resource.title;
jQuery.get(SCRIPT_PATH, queryPendingDeleteRequest, function(data) {
if ('templates' in data.query.pages[0]) { // DR
if (usage_list != '<ol></ol>') { // USED
record+= LI_DR_USED.concat(
getComboLink(CANONICAL_URL.concat(resource.title), resource.title, 'c:', true),
usage_list, '</li>'
);
dat.dr_used.push(resource.title);
}
else { // UNUSED
record+= LI_DR_UNUSED.concat(
getComboLink(CANONICAL_URL.concat(resource.title), resource.title, 'c:', true),
'</li>'
);
dat.dr_unused.push(resource.title);
}
}
else { // OK
if (usage_list != '<ol></ol>') { // USED
record+= LI_OK_USED.concat(
getComboLink(CANONICAL_URL.concat(resource.title), resource.title, 'c:', true),
usage_list, '</li>'
);
dat.used.push(resource.title);
}
else { // UNUSED
record+= LI_OK_UNUSED.concat(
getComboLink(CANONICAL_URL.concat(resource.title), resource.title, 'c:', true),
'</li>'
);
}
}
jQuery('#Nx_Uploads').append(record);
_$('Nx_Summary').scrollIntoView(false);
window.setTimeout(checkContributions, 10);
});
});
}
else {
ptr = -1;
_$('Nx_Summary').innerHTML = '<ul>'.concat(
'<li>всего файлов: ', ups.length, '</li>',
'<li>использовано в статьях: ', dat.used.length, ' (',
Math.round(dat.used.length / ups.length * 100),'%)</li>',
'<li>вынесены на КБУ и КУ: ', (dat.dr_used.length + dat.dr_unused.length), ' \u2014 ',
'из них используемые в статьях: ', dat.dr_used.length, '</li>',
'<ul>'
);
}
}
/* *********************
AUXILIARY FUNCTIONS */
function _$(id) {
return document.getElementById(id);
}
function getUserProjectStatus(flags) {
if (jQuery.inArray('bureaucrat', flags) != -1) {
return 'бюрократ';
}
else if (jQuery.inArray('sysop', flags) != -1) {
return 'администратор';
}
else if (jQuery.inArray('filemover', flags) != -1) {
return 'переименовывающий';
}
else if (jQuery.inArray('patroller', flags) != -1) {
return 'патрулирующий';
}
else if (jQuery.inArray('autopatrolled', flags) != -1) {
return 'автопатрулируемый';
}
else {
return 'рядовой участник';
}
}
function getDateString(iso) {
if ( (typeof iso == 'string') && (iso.indexOf('T') > 0) ) {
return new Date(iso.split('T')[0]).toLocaleDateString(ISO_LANGUAGE_CODE);
}
else {
return '?'; // some registration dates can be lost
}
}
function getComboLink(thisLink, thisText, thisNS, isFile) {
return '<a target="ext" href="'.concat(
thisLink, '">', isFile? thisText.substr(5) : thisText,
'</a><span class="NxWikiLink" style="display:none;">[[',
thisNS, thisText, '|', isFile? thisText.substr(5) : thisText,
']]</span>'
);
}
/* END */ });