Користувач:RLuts/ImgsCleanUp.js

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Увага: Після публікування слід очистити кеш браузера, щоб побачити зміни.

  • Firefox / Safari: тримайте Shift, коли натискаєте Оновити, або натисніть Ctrl-F5 чи Ctrl-Shift-R (⌘-R на Apple Mac)
  • Google Chrome: натисніть Ctrl-Shift-R (⌘-Shift-R на Apple Mac)
  • Internet Explorer / Edge: тримайте Ctrl, коли натискаєте Оновити, або натисніть Ctrl-F5
  • Opera: натисніть Ctrl-F5
/*
* @author RLuts
* ver. 1.00 alfa
*/

if( window.ImgsCleanUp === undefined ) {
	window.ImgsCleanUp = {
		install: function () {
			this.icu = 'FairUse Clean Up'; 
			mw.loader.using(['mediawiki.util']).done(function () {
				mw.util.addPortletLink( 'p-views', 'javascript:window.ImgsCleanUp.showDialog()', this.icu );
			});
		},
		
		selects: {}, 
		information: '', 
		furation: '',
		newfuration: '',
		pagecontent: '',
		
		showDialog: function () {
			var icu = this;
			if( $( '#icu-dialog' ).length === 0 ) {
				$( '#mw-content-text' ).append('<div id="icu-dialog" style="display:none;" title="' + this.icu + '"></div>');				
				this.getTpls();
			}
			mw.loader.using( 'jquery.ui', function () {
				$( '#icu-dialog' ).dialog({
					width: 400,
					buttons: {
						'Зберегти': function () {
							icu.savePage();
						}
					}
				});	
			});
		},
		
		getTpls: function () {
			var icu = this;

			mw.util.addCSS( '#icu-dialog select {width:100%; height: 1.7em} #icu-dialog input:not([type="checkbox"]) {width:100%; height: 1.3em} #icu-dialog p {margin-bottom: 0}' );
			mw.util.addCSS('.icu-addtf {font-size:.8em; background-color:#FF0; margin-right:3px; cursor:pointer}');
			
			var cats = mw.config.get('wgCategories'), pur;
			if(cats.indexOf('Зображення:Обкладинки друкованих творів') >= 0) {
				pur = ' про книгу ';
			} else if(cats.indexOf('Зображення:Обкладинки альбомів') >= 0) {
				pur = ' про альбом ';
			} else  {
				pur = ' ';
			}
			
			var page = $('.mw-imagepage-linkstoimage-ns0').children('a').first().text();
			if(pur && page) {
				pur = pur + '[[' + page + ']]';
			} else {
				pur = '';
			}
			
			var res = $('.fileInfo').text().match(/[0-9]{1,3}\s×\s[0-9]{1,3}/gi);
			if(typeof res === 'object' && res !== null) {
				res = ' (' + res[0] + ')';
			} else {
				res = '';
			}
			
			this.addForm('Опис', 'icu-descr', undefined, true);
			this.addForm('Джерело', 'icu-source', {'невідоме': 'Невідоме'});
			this.addForm('Автор', 'icu-author', {'невідомий': 'Невідомий'});
			this.addForm('Час створення', 'icu-date', {'невідомий': 'Невідомий'});
			this.addForm('Частина', 'icu-part', {'повністю': 'Зображення повністю'});
			this.addForm('Роздільність', 'icu-res', {'низька': 'Низька' + res});
			this.addForm('Мета', 'icu-purp', {'ілюстр.': 'Проілюструвати статтю' + pur});
			this.addForm('Замінність', 'icu-subst', {'заміна неможл.': 'Заміна вільним файлом неможлива', 'створ. неможл.': 'Створити вільну альтернативу цьому файлу неможливо (авторський твір)'});
			this.addForm('Інше', 'icu-oth', {'відп. КДВ': 'Завантажене зображення відповідає [[ВП:КДВ|всім критеріям добропорядного використання]]. Його використання не порушує закон США про авторське право'});
			
			$( '#icu-dialog' ).append('<p><input style="display: inline" type="checkbox" id="icu-furremove" checked />Вилучити шаблон disputed-fairuse</p>');
			$( '#icu-dialog' ).append('<p><input type="checkbox" id="icu-addpagetotpl" />Додати включену сторінку в параметр шаблону ліцензії</p>');
			$( '#icu-dialog' ).append('<p><input type="checkbox" id="icu-keepinftpl" checked />Додати/залишити шаблон «Зображення» у описі файлу</p>');
			
			$( '.icu-addtf' ).click( function() {
				if( $( this ).parent().children( 'input' ) ) {
					$( this ).parent().children( 'input' ).val( $( this ).attr( 'title' ) );
				}
			} );
			
			var content, tpl, pars;
			var param = {
				action: 'query',
				prop: 'revisions',
				format: 'json',
				rvprop: 'content',
				rvlimit: '1',
				titles: mw.config.get('wgPageName'),
				indexpageids: ''
			};
			$.get(mw.util.wikiScript('api'), param).done(function(data) {
				content = data.query.pages[data.query.pageids[0]].revisions[0]['*'];
				icu.pagecontent = content;
				tpl = 'Обґрунтування добропорядного використання|ОДВ|Non-free fair use rationale|ОСВ|Non-free media rationale|Non-free image rationale|Non-free use rationale|Обґрунтування сумлінного використання';
				tpltext = icu.getTplText(content, tpl);
				if(tpltext !== undefined) {
					icu.furation = tpltext;
					pars = ['Опис', 'Автор', 'Джерело', 'Час створення', 'Частина', 'Роздільність', 'Мета', 'Замінність', 'Інше'];
					var ration = icu.getTplPars(tpltext, pars);
				}
				tpl = 'Зображення|Information';
				tpltext = icu.getTplText(content, tpl);
				if(tpltext !== undefined) {
					icu.information = tpltext;
					pars = ['Назва', 'Опис', 'Автор', 'Джерело', 'Час створення', 'Ліцензія'];
					var inform = icu.getTplPars(tpltext, pars);
				}
				
				if(ration === undefined && inform === undefined) {
					console.log('Templates not found');
					return false;
				} else if(ration === undefined) {
					console.log('FairUse Rationale template not found');
					var ration = {};
				} else if(inform === undefined) {
					console.log('Information template not found');
					var inform = {};
				}
				
				var sp = ['Опис', 'Автор', 'Джерело', 'Час створення'];
				var c = [];
				for (var i in icu.selects) c.push(i);
				for (var a in c) {
					if(sp.indexOf(c[a]) == -1 || inform[c[a]] === undefined || ration[c[a]] == inform[c[a]]) {
						$('#' + icu.selects[c[a]]).val(ration[c[a]]);
					} else if(ration[c[a]] === undefined) { 
						$('#' + icu.selects[c[a]]).val(inform[c[a]]);
					} else if(ration[c[a]] != inform[c[a]]) {
						$('#' + icu.selects[c[a]]).replaceWith('<select id="'+ icu.selects[c[a]] +'"><option></option><option value="ration">' + ration[c[a]] +'</option><option value="inform">' + inform[c[a]] + '</option></select>');
					}
				}
				$( '#icu-dialog select' ).change(function() {
					$(this).replaceWith('<input id="' + $(this).attr('id') + '" value="' + $(this).children('option:selected').text() + '"/>');
				});
			});
		},
		
		getTplText: function (content, tpl) {
			content = content.replace(/<\s*nowiki\s*\>[\s\S]*?<\s*\/nowiki\s*\>/gi, '');
			var a;
			if(a = content.match(RegExp('\\{\\{(' + tpl + ')[\\S\\s]*?(\\{\\{[\\s\\S]*?}}[\\s\\S]*?)*?}}', 'gi'))) {
				return a[0];
			}
		},
		
		getTplPars: function (tpltext, pars) {
			var b = {}, c;
			for(var a in pars) {
				if(c = tpltext.match(RegExp('\\|\\s*(?:' + pars[a] + ')\\s*=\\s*(.*?(\\[\\[.*?\\|?.*]].*?)*?(\\{\\{.*?\\|?.*}}.*?)*?)\\s*(?:\\||}}$)'))) { 
					if(c[1].match(/\S/gi))
						b[pars[a]] = c[1];
				}
			}
			return(b);
		},
		
		addForm: function (text, id, addtf) {
			this.selects[text] = id;
			$( '#icu-dialog' ).append('<div>');
			$( '#icu-dialog div' ).last().append('<p>' + text + ':</p><input id="' + id + '" value="" />');
			if (typeof addtf == 'object') {
				$.each( addtf, function( key, value ) {
					$( '#icu-dialog div' ).last().append('<span class="icu-addtf" title="' + value + '">' + key + '</span>');
				});
			}
		},
		
		getLicSect: function() {
			return this.pagecontent.match(/\n==\s?Ліцензування:?\s?==\s+([\s\S]*?)(?=\n==|$)/i);
		},
		
		savePage: function() {
			if( $('#icu-dialog select').length > 0 ) {
				$('#icu-dialog').append('<p style="color:red; font-size: 80%">Виберіть параметри шаблону із списку</p>');
				$('#icu-dialog select').first().focus();
				return false;
			}
			$('#icu-dialog').dialog('close');
			$( '#mw-content-text' ).append('<div id="icu-modal"></div>')
			$( '#icu-modal' ).html('<p style="font-size:1.5em">Зачекайте, будь ласка...</p>');
			$('#icu-modal').dialog({buttons: false, modal: true});
			var icu = this, newcont, licen, tpltext;
			if( icu.information !== '' && icu.getTplPars( icu.information, ['Ліцензія'] )['Ліцензія'] !== undefined ) {
				licen = icu.getTplPars( icu.information, ['Ліцензія'] )['Ліцензія'];
			}
			if($( '#icu-keepinftpl' ).is(':checked') ) {
				icu.newfuration = "{{Зображення\n| Опис         = " + $( '#icu-descr' ).val() + "\n| Джерело      = " + $( '#icu-source' ).val() + " \n| Автор        = " + $( '#icu-author' ).val() + " \n| Час створення= " + $( '#icu-date' ).val() + "\n| Ліцензія = \n}}\n";
				icu.newfuration += "{{Обґрунтування добропорядного використання\n| Частина      = " + $( '#icu-part' ).val() + " \n| Роздільність = " + $( '#icu-res' ).val() + " \n| Мета         = " + $( '#icu-purp' ).val() + " \n| Замінність   = " + $( '#icu-subst' ).val() + " \n| Інше         = " + $( '#icu-oth' ).val() + "\n}}";
			} else {
				icu.newfuration = "{{Обґрунтування добропорядного використання\n| Опис         = " + $( '#icu-descr' ).val() + "\n| Джерело      = " + $( '#icu-source' ).val() + " \n| Автор        = " + $( '#icu-author' ).val() + " \n| Час створення= " + $( '#icu-date' ).val() + " \n| Частина      = " + $( '#icu-part' ).val() + " \n| Роздільність = " + $( '#icu-res' ).val() + " \n| Мета         = " + $( '#icu-purp' ).val() + " \n| Замінність   = " + $( '#icu-subst' ).val() + " \n| Інше         = " + $( '#icu-oth' ).val() + "\n}}";
			}
			
			if(licen !== undefined && !icu.getLicSect()) { // якщо параметр «Ліцензія» в шаблоні «Зображення» не порожній та немає розділу «Ліцензування»
				icu.newfuration = icu.newfuration + '\n\n== Ліцензування ==\n' + licen;
			}
			if(icu.furation !== '' && icu.information !== '') { // є ОДВ та шаблон Зображення
				newcont = icu.pagecontent.replace(icu.furation, '').replace(icu.information, icu.newfuration);
			} else if(icu.furation !== '') {  // тільки ОДВ
				newcont = icu.pagecontent.replace(icu.furation, icu.newfuration);
			} else if(icu.information !== '') { // тільки шаблон Зображення
				newcont = icu.pagecontent.replace(icu.information, icu.newfuration);
			} else {
				newcont = icu.newfuration + '\n' + icu.pagecontent;
			}
			
			if( $( '#icu-furremove' ).is(':checked') ) {
				tpltext = icu.getTplText(newcont, 'Disputed-fairuse');
				newcont = newcont.replace(tpltext, '');
			}
			
			if( $( '#icu-addpagetotpl' ).is(':checked') ) {
				tpl = RegExp('{{\\s?(Fairuse|Логотип|Coatofarms|Поштова марка|Art|Музика|Поп-музика|Знімок екрана|Кадр|Обкладинка книги|Знімок екрана сайту|Історичне фото|Character-artwork|Mac-software-screenshot|CopyrightByWikimedia|Fairuse in|Обкладинка відеогри|Постер|Обкладинка альбому|Old-50|FU-meteorite|Нотний приклад|Семпл|Non-free currency|Фотопортрет померлого|Map|Non-free computer icon|Money-EU|Рок музика|Ліцензування скульптури|Коробка|Персонаж|Free media|Non-free Olympics logo|Несвободный файл/ОДИ|Корпорація Sony|ФП з ОДВ|Постер з ОДВ|Логотип з ОДВ|Обкладинка альбому з ОДВ|Обкладинка книги з ОДВ|poster|Logo|Non-free logo|Fair use in|Fairusein)\\s?}}', 'gi');
				var page = $('.mw-imagepage-linkstoimage-ns0').children('a').first().text();
				if(tpltext = newcont.match(tpl)) {
					tpltext = tpltext[0];
				}
				if(page && tpltext) {
					newcont = newcont.replace(tpltext, tpltext.replace('}}', '|' + page + '}}'));
				}
			}
			
			console.log(newcont);
			//Збереження та перевантаження сторінки 
			icu.writeInPage( mw.config.get( 'wgPageName' ), newcont, 'FairUse clean up ([[User:RLuts/ImgsCleanUp.js|ImgsCleanUp.js]] alfa)', undefined, undefined, function() { 
				location.reload();
			});
		},
		
		writeInPage: function ( title, content, summary, option, section, success ) {
			var param = {
				action: 'edit',
				title: title, 
				summary: summary, 
				watchlist: 'watch',
				token: mw.user.tokens.get('csrfToken'),
				format: 'json'
			};
			param[option || 'text'] = content;
			if (section || section === 0) 
				param.section = section;
			$.post(mw.util.wikiScript('api'), param, function() {
				if (typeof(success) === 'function')
					success();
			});
		}
	};
}

$( document ).ready(function () {
	if(mw.config.get('wgCategories').indexOf('Невільні файли') >= 0)
		ImgsCleanUp.install();
});