Jump to content

User:Alexis Jazz/MVattrib.js

From Wikipedia, the free encyclopedia
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.
//<nowiki>
//[[User:Alexis Jazz/MVattrib]], addon that makes MediaViewer (https://www.mediawiki.org/wiki/Reading/Multimedia/Media_Viewer) license compliant in certain cases where it otherwise isn't (https://phabricator.wikimedia.org/T68606)
if ( mw.config.get('wgMediaViewerOnClick') ) {
	MVattrib = {};
	MVattrib.msgs = {
		'author': 'Author',
		'license': 'License',
		'scroll': ' Scroll down for more complete information. '
	};
	MVattrib.debugmode = true;
	MVattrib.debug = function(text) {
		if ( MVattrib.debugmode == true ) {
			if ( typeof text == 'string' ) {
				console.log('MVattrib: ' + text);
			} else {
				console.log('MVattrib:');
				console.log(text);
			}
		}
	};
	MVattrib.debug('MVattrib loaded');
	MVattrib.getWikitextFromExport = function(text) {
		if ( text.match(/[^]*<text bytes[^>]*>([^]*)<\/text>[^]*/) ) {
			return text.replace(/[^]*<text bytes[^>]*>([^]*)<\/text>[^]*/, '$1').replace(/\&lt\;/g, '<').replace(/\&gt\;/g, '>').replace(/\&amp\;/g, '&');
		} else {
			return '';
		}
	};
	detectKey = function(pressedkey) {
		if ( ( pressedkey.key == 'ArrowLeft' || pressedkey.key == 'ArrowRight' ) && $('.mw-mmv-prev-image')[0] && $('.mw-mmv-next-image')[0] ) {
				MVattrib.addAttribution();
		}
	};
	document.addEventListener('keydown', detectKey);
	MVattrib.addAttribution = function() {
		MVattrib.debug('run MVattrib.addAttribution');
		var waitToAddAttrib = setInterval(function () {
			clearInterval(waitToAddAttrib);
			if ( $('.mw-mmv-prev-image')[0] && $('.mw-mmv-next-image')[0] ) {
				$('.mw-mmv-prev-image')[0].addEventListener('click', MVattrib.addAttribution);
				$('.mw-mmv-next-image')[0].addEventListener('click', MVattrib.addAttribution);
			}
			if ( $('.mw-mmv-image-metadata')[0] ) {
				MVattrib.title = decodeURIComponent(document.location.hash.replace(/\#\/media\//, '').replace('_', ' '));
				var apiCommons = new mw.ForeignApi('https://commons.wikimedia.org/w/api.php');
				apiCommons.get( {
					format: 'json', action: 'query', export: 'true', titles: MVattrib.title,
				} ).done( function ( data ) {
					MVattrib.debug(data);
					MVattrib.wikiText = MVattrib.getWikitextFromExport(data.query.export["*"]);
					MVattrib.licenseSection = MVattrib.wikiText.match(/\=\=.*\{\{int\:license\-header\}\}.*\=\=[^]*/);
					MVattrib.permissionParam = MVattrib.wikiText.match(/\|\s*[Pp]ermission\s*\=\s*(\{\{[^\{\}]*\}\}|\[\[[^\[\]]*\]\]|[^\|])*/);
					//conditions to append attribution, detect if MV is likely to have screwed up and if we're likely to be able to do better
					if ( (MVattrib.licenseSection || MVattrib.permissionParam) && ( MVattrib.wikiText.match(/\|\s*[Aa]uthor\s*\=\s*\{\{[Cc]reator\:[^\}\n]*\}\}[ \n]*[^ \n]/) || MVattrib.wikiText.match(/\{\{fop/i) ) ) {
						MVattrib.debug('okay let\'s add to the attribution and license info');
						MVattrib.attribution = MVattrib.wikiText.match(/\|\s*[Aa]uthor\s*\=\s*(\{\{[^\{\}]*\}\}|\[\[[^\[\]]*\]\]|[^\|])*/)[0].replace(/\|\s*[Aa]uthor\s*\=\s*/, '').replace(/\s*$/, '').replace(/\n\n/g, '\n').replace(/\{\{\!\}\}/g, '&#124;');
						if ( MVattrib.licenseSection && MVattrib.licenseSection[0] ) {
							MVattrib.debug('extract license section from wikitext');
							MVattrib.licenseSectionWikitext = MVattrib.licenseSection[0].replace(/\=\=.*\{\{int\:license\-header\}\}.*\=\=\s*/, '').replace(/\n\s*\=\=[^]*/, '').replace(/\s*$/, '').replace(/\n\n/g, '\n');
						} else {
							MVattrib.licenseSectionWikitext = '';
						}
						if ( MVattrib.permissionParam && MVattrib.permissionParam[0] ) {
							MVattrib.debug('extract permission section from wikitext');
							MVattrib.licensePermissionWikitext = MVattrib.permissionParam[0].replace(/\|\s*[Pp]ermission\s*\=\s*/, '').replace(/\s*$/, '').replace(/\n\n/g, '\n');
						} else {
							MVattrib.licensePermissionWikitext;
						}
						if ( MVattrib.licensePermissionWikitext ) {
							MVattrib.licensePermissionWikitext = MVattrib.licensePermissionWikitext + '<br/>';
						}
						MVattrib.license = MVattrib.licensePermissionWikitext + MVattrib.licenseSectionWikitext;
						MVattrib.tableClass = '';
						if ( MVattrib.attribution ) {
							MVattrib.authorCol = MVattrib.msgs.author;
						} else {
							MVattrib.authorCol = '';
						}
						if ( MVattrib.license ) {
							MVattrib.licenseCol = MVattrib.msgs.license;
						} else {
							MVattrib.licenseCol = '';
						}
						MVattrib.compliantAttrib = '{| class="' + MVattrib.tableClass + '" style="width:98%;margin-left:1%;margin-right:1%" \n! style="text-align:left"|\'\'\'' + MVattrib.authorCol + '\'\'\'\n! style="width:2em" |\n! style="text-align:left"|\'\'\'' + MVattrib.licenseCol + '\'\'\'\n|-\n| style="vertical-align:top" |' + MVattrib.attribution + '\n|\n| style="vertical-align:top" |' + MVattrib.license + '\n|-\n| colspan="3" |[[w:en:User:Alexis Jazz/MVattrib|About this interface add-on]]\n|}';
						MVattrib.scrollNotice = document.createElement('span');
						MVattrib.scrollNotice.id = 'MVattribScrollNotice';
						MVattrib.scrollNotice.innerHTML = MVattrib.msgs.scroll;
						apiCommons.get( {
						format: 'json', action: 'parse', title: MVattrib.title, pst: '1', prop: 'text', formatversion: '2', text: MVattrib.compliantAttrib
						} ).done( function ( data ) {
							MVattrib.debug(data);
							if ( $('#MVattrib')[0] ) {
								MVattrib.debug('updating license info');
								$('#MVattrib')[0].innerHTML = data.parse.text;
							} else {
								MVattrib.debug('adding license info');
								$('.mw-mmv-image-metadata').append('<div id="MVattrib">' + data.parse.text + '</div>');
								$('.mw-mmv-credit')[0].prepend(MVattrib.scrollNotice);
							}
						});
					} else if ( $('#MVattrib')[0] && $('#MVattribScrollNotice')[0] ) {
						MVattrib.debug('new image loaded, removing author+license of previous image');
						$('#MVattrib')[0].outerHTML = '';
						$('#MVattribScrollNotice')[0].outerHTML = '';
					} else {
						MVattrib.debug('nothing to do');
					}
				});
			}
		}, 1000);
	};
	if ( document.location.hash.match(/\#\/media\//) ) {
		MVattrib.addAttribution();
	}
	var waitToAddAttrib = setInterval(function () {
		clearInterval(waitToAddAttrib);
		for (int = 0; int < document.getElementsByClassName('image').length; int++) {
			document.getElementsByClassName('image')[int].addEventListener('click', MVattrib.addAttribution);
		}
	}, 1000);
}
//</nowiki>