MediaWiki:Gadget-WikiProject.js

De Wikipedia, la enciclopedia libre

Nota: Después de guardar, debes refrescar la caché de tu navegador para ver los cambios. Internet Explorer: mantén presionada Ctrl mientras pulsas Actualizar. Firefox: mientras presionas Mayús pulsas el botón Actualizar, (o presiona Ctrl-Shift-R). Los usuarios de Google Chrome y Safari pueden simplemente pulsar el botón Recargar. Para más detalles e instrucciones acerca de otros exploradores, véase Ayuda:Cómo limpiar la caché.

/**
 * Interactúa con la [[Plantilla:Wikiproyecto]] para agregar funcionalidad a los wikiproyectos
 *
 * <nowiki>
 */
var WikiProject = {

	init: function ( require ) {

		// Get and set the config
		var config = $( '#wikiproject-tasks' ).data();
		mw.config.set( config );

		// Add the wikiproject hashtag to edits done from this tool
		mw.hook( 've.saveDialog.stateChanged' ).add( WikiProject.addHashtagToEditSummary );

		// Mount the app
		Codex = require( '@wikimedia/codex' );
		Vue = require( 'vue' );
		Vue.createApp( {
			template: `
				<cdx-accordion>
					<template #title>Referenciar</template>
					<p>Toda la información en Wikipedia debe ser <a target="_blank" href="/wiki/Wikipedia:Verificabilidad">verificable</a>, es decir que debe tener <a target="_blank" href="/wiki/Wikipedia:Referencias">referencias</a> que permitan rastrear el origen de la información.</p>
					<p>Los artículos en esta lista necesitan referencias. Haz click en alguno para empezar. Si ninguno de estos artículos es de tu interés, puedes actualizar la página para regenerar la lista.</p>
					<ul v-if="pagesToReference"><li v-for="page in pagesToReference"><a target="_blank" :href="page.href">{{page.title}}</a></li></ul>
					<p v-else>No hay artículos en esta lista.</p>
				</cdx-accordion>
				<cdx-accordion>
					<template #title>Actualizar</template>
					<p>Los artículos en esta lista necesitan actualizarse con información actual. Haz click en alguno para empezar. Si ninguno de estos artículos es de tu interés, puedes actualizar la página para regenerar la lista.</p>
					<ul v-if="pagesToUpdate"><li v-for="page in pagesToUpdate"><a target="_blank" :href="page.href">{{page.title}}</a></li></ul>
					<p v-else>No hay artículos en esta lista.</p>
				</cdx-accordion>
				<cdx-accordion>
					<template #title>Traducir</template>
					<p>Los artículos en esta lista no existen en la Wikipedia en español pero sí en otras Wikipedias. Haz click en alguno para empezar una traducción.</p>
					<ul v-if="pagesToTranslate"><li v-for="page in pagesToTranslate"><a target="_blank" :href="page.href">{{page.title}}</a> ({{page.source}})</li></ul>
					<p v-else>No hay artículos en esta lista.</p>
				</cdx-accordion>
				<cdx-accordion>
					<template #title>Expandir</template>
					<p>Los artículos en esta lista son demasiado breves y necesitan expansión. Haz click en alguno para empezar. Si ninguno de estos artículos es de tu interés, puedes actualizar la página para regenerar la lista.</p>
					<ul v-if="pagesToExpand"><li v-for="page in pagesToExpand"><a target="_blank" :href="page.href">{{page.title}}</a></li></ul>
					<p v-else>No hay artículos en esta lista.</p>
				</cdx-accordion>
				<cdx-accordion>
					<template #title>Otras</template>
					<p>Aquí se listan otras tareas que puedes realizar. Para agregar, modificar o quitar tareas, edita <a target="_blank" :href="otherTasks.href">esta página</a>.</p>
					<div v-html="otherTasks.text"></div>
				</cdx-accordion>
			`,
			data: function () {
				return {
					pagesToReference: [],
					pagesToUpdate: [],
					pagesToTranslate: [],
					pagesToExpand: [],
					otherTasks: [],
				};
			},
			beforeMount: function () {
				WikiProject.getPagesToReference( this );
				WikiProject.getPagesToUpdate( this );
				WikiProject.getPagesToTranslate( this );
				WikiProject.getPagesToExpand( this );
				WikiProject.getOtherTasks( this );
			}
		} )
		.component( 'cdx-accordion', Codex.CdxAccordion )
		.mount( '#wikiproject-tasks' );
	},

	addHashtagToEditSummary: function () {
		$( '.oo-ui-processDialog-actions-primary' ).on( 'mousedown', function () {
			var $summary = $( '.ve-ui-mwSaveDialog-summary' ).find( 'textarea' );
			var summary = $summary.val();

			// Add the wikiproject hashtag
			var params = new URLSearchParams( window.location.search );
			var hashtag = params.get( 'hashtag' );
			if ( hashtag ) {
				summary += ' #' + hashtag;
			}

			$( '.ve-ui-mwSaveDialog-summary' ).find( 'textarea' ).val( summary );
		} );
	},

	getPagesToReference: function ( data ) {
		var watchlist = mw.config.get( 'wikiprojectWatchlist' );
		var templates = mw.config.get( 'wikiprojectReferenceTemplates' ).split( ',' ).join( '|' );
		var params = {
			action: 'query',
			titles: watchlist,
			prop: 'templates',
			tltemplates: templates,
			tllimit: 'max',
			generator: 'links',
			gpllimit: 'max',
			redirects: true,
			formatversion: 2,
		};
		new mw.Api().get( params ).done( response => WikiProject.getPagesToReferenceContinue( response, params, data ) );
	},

	getPagesToReferenceContinue: function ( response, params, data ) {
		var editintro = mw.config.get( 'wikiprojectReferenceEditintro' );
		var hashtag = mw.config.get( 'wikiprojectHashtag' );
		var pages = response.query.pages;
		for ( var page of pages ) {
			if ( page.templates ) {
				page.href = mw.util.getUrl( page.title, { veaction: 'edit', editintro: editintro, hashtag: hashtag, withJS: 'MediaWiki:TemplateScript-WikiProject.js' } );
				data.pagesToReference.push( page );
			}
		}
		if ( response.continue ) {
			params.gplcontinue = response.continue.gplcontinue;
			new mw.Api().get( params ).done( response => WikiProject.getPagesToReferenceContinue( response, params, data ) );
		} else {
			WikiProject.getPagesToReferenceComplete( data );
		}
	},

	getPagesToReferenceComplete: function ( data ) {
		WikiProject.shuffle( data.pagesToReference );
		var limit = mw.config.get( 'wikiprojectUpdateLimit' );
		if ( data.pagesToReference.length > limit ) {
			data.pagesToReference.length = limit;
		}
		if ( data.pagesToReference.length === 0 ) {
			data.pagesToReference = null;
		}
	},

	getPagesToUpdate: function ( data ) {
		var watchlist = mw.config.get( 'wikiprojectWatchlist' );
		var templates = mw.config.get( 'wikiprojectUpdateTemplates' ).split( ',' ).join( '|' );
		var params = {
			action: 'query',
			titles: watchlist,
			prop: 'templates',
			tltemplates: templates,
			tllimit: 'max',
			generator: 'links',
			gpllimit: 'max',
			redirects: true,
			formatversion: 2,
		};
		new mw.Api().get( params ).done( response => WikiProject.getPagesToUpdateContinue( response, params, data ) );
	},

	getPagesToUpdateContinue: function ( response, params, data ) {
		var editintro = mw.config.get( 'wikiprojectUpdateEditintro' );
		var hashtag = mw.config.get( 'wikiprojectHashtag' );
		var pages = response.query.pages;
		for ( var page of pages ) {
			if ( page.templates ) {
				page.href = mw.util.getUrl( page.title, { veaction: 'edit', editintro: editintro, hashtag: hashtag, withJS: 'MediaWiki:TemplateScript-WikiProject.js' } );
				data.pagesToUpdate.push( page );
			}
		}
		if ( response.continue ) {
			params.gplcontinue = response.continue.gplcontinue;
			new mw.Api().get( params ).done( response => WikiProject.getPagesToUpdateContinue( response, params, data ) );
		} else {
			WikiProject.getPagesToUpdateComplete( data );
		}
	},

	getPagesToUpdateComplete: function ( data ) {
		WikiProject.shuffle( data.pagesToUpdate );
		var limit = mw.config.get( 'wikiprojectUpdateLimit' );
		if ( data.pagesToUpdate.length > limit ) {
			data.pagesToUpdate.length = limit;
		}
		if ( data.pagesToUpdate.length === 0 ) {
			data.pagesToUpdate = null;
		}
	},

	getPagesToTranslate: function ( data ) {
		var sources = mw.config.get( 'wikiprojectTranslateSources' ).split( ',' );
		var seed = mw.config.get( 'wikiprojectTranslateSeed' );
		var limit = mw.config.get( 'wikiprojectTranslateLimit' );
		var language = mw.config.get( 'wgContentLanguage' );
		sources.forEach( function ( source ) {
			var params = {
				source: source,
				target: language,
				seed: seed,
				count: limit,
			};
			$.get( '//recommend.wmflabs.org/types/translation/v1/articles', params ).done( results => WikiProject.getPagesToTranslateComplete( results, source, data ) );
		} );
	},

	getPagesToTranslateComplete: function ( results, source, data ) {
		for ( var result of results ) {
			var title = result.title.replaceAll( '_', ' ' );
			var href = mw.util.getUrl( 'Special:ContentTranslation', { page: title, from: source, to: mw.config.get( 'wgContentLanguage' ) } );
			data.pagesToTranslate.push( { title: title, href: href, source: source } );
		}
	},

	getPagesToExpand: function ( data ) {
		var watchlist = mw.config.get( 'wikiprojectWatchlist' );
		var params = {
			action: 'query',
			titles: watchlist,
			prop: 'info',
			generator: 'links',
			gpllimit: 'max',
			redirects: true,
			formatversion: 2,
		};
		new mw.Api().get( params ).done( response => WikiProject.getPagesToExpandContinue( response, params, data ) );
	},

	getPagesToExpandContinue: function ( response, params, data ) {
		var length = mw.config.get( 'wikiprojectExpandLength' );
		var editintro = mw.config.get( 'wikiprojectExpandEditintro' );
		var hashtag = mw.config.get( 'wikiprojectHashtag' );
		var pages = response.query.pages;
		for ( var page of pages ) {
			if ( page.length < length ) {
				page.href = mw.util.getUrl( page.title, { veaction: 'edit', editintro: editintro, hashtag: hashtag, withJS: 'MediaWiki:TemplateScript-WikiProject.js' } );
				data.pagesToExpand.push( page );
			}
		}
		if ( response.continue ) {
			params.gplcontinue = response.continue.gplcontinue;
			new mw.Api().get( params ).done( response => WikiProject.getPagesToExpandContinue( response, params, data ) );
		} else {
			WikiProject.getPagesToExpandComplete( data );
		}
	},

	getPagesToExpandComplete: function ( data ) {
		WikiProject.shuffle( data.pagesToExpand );
		var limit = mw.config.get( 'wikiprojectExpandLimit' );
		if ( data.pagesToExpand.length > limit ) {
			data.pagesToExpand.length = limit;
		}
		if ( data.pagesToExpand.length === 0 ) {
			data.pagesToExpand = null;
		}
	},

	getOtherTasks: function ( data ) {
		var page = mw.config.get( 'wikiprojectTasks' );
		var href = mw.util.getUrl( page );
		data.otherTasks = { href: href };
		var params = {
			action: 'parse',
			page: page,
			prop: 'text',
			formatversion: 2,
		};
		new mw.Api().get( params ).done( response => WikiProject.getOtherTasksComplete( response, data ) );
	},

	getOtherTasksComplete: function ( response, data ) {
		if ( response.parse && response.parse.text ) {
			data.otherTasks.text = response.parse.text;
		}
	},

	/**
	 * Helper method to shuffle an array
	 * Credit: https://stackoverflow.com/a/12646864/809356
 	 */
	shuffle: function ( array ) {
		for ( let i = array.length - 1; i > 0; i-- ) {
			const j = Math.floor( Math.random() * ( i + 1 ) );
			[ array[i], array[j] ] = [ array[j], array[i] ];
		}
	}
};

mw.loader.using( [
	'mediawiki.api',
	'mediawiki.user',
	'mediawiki.util',
	'@wikimedia/codex'
], WikiProject.init );