MediaWiki discusión:Gadget-WikiSign.js

Último comentario: hace 3 meses por Sophivorus en el tema Fallo al reconocer las secciones

Mejoras editar

El código no debería ejecutarse de forma automática a través de un enlace tal como hace la actual plantilla, ya que de este modo es una semilla para posibles errores o incluso vandalismos. Poco se ha tardado en encontrar el primer equívoco. Debería ejecutarse únicamente a través de la llamada de un control con un identificador concreto, del mismo modo que para notificar errores MediaWiki:Gadget-Wikibugs.js funciona a través del controlador n-bug_in_article. Sugiero agregar en la plantilla {{Firmar}} una clase ui-action-sign o similar con la que controlar mediante el código que solamente se ejecutará bajo la llamada de uno de estos botones, y con una configuración específica. Porque mediante opciones del propio controlador se podría establecer el funcionamiento concreto del comando, de forma que se pueda configurar para firmar al final de una página o de una sección concreta, así como opcionalmente mostrar un pequeño diálogo para agregar pequeños comentarios junto a la firma, o validar los requisitos de los usuarios que pueden usar la herramienta para firmar en una votación. Esto ampliaría la funcionalidad de la herramienta de cara a ser usada en cualquier tipo de votaciones. -- Leoncastro (discusión) 20:11 7 feb 2022 (UTC)Responder

@Leoncastro Hecho lo de ui-action-sign. En cuanto al diálogo para comentarios y la validación de requisitos, me parecen excelentes ideas que espero incorporar pronto. ¡Saludos! Sophivorus (discusión) 17:06 22 feb 2022 (UTC)Responder
Además de la protección de la clase ui-action-sign para comprobar que existe un botón en la página, debería comprobarse que la misma no está en modo edición o previsualización. El código también debería comprobar mejor cual es el botón que se pulsa; porque uno de los usos que puede tener esta herramienta es para votar, y en esos casos se necesitarán varios botones en la misma página, uno para cada opción. Es por ello que el código debería ejecutarse directamente como un evento del botón (para ello será necesario cargar previamente el código desde MediaWiki:Common.js y no a través de un enlace como se hace actualmente en la plantilla). Además, la expresión button.closest( 'p' ) no es acertada, pues el botón puede no estar en un párrafo sino en una definición (como usando : {{Firmar}}) o en cualquier otra posición. Por otro lado, la sección y su contenido no deben buscarse dentro del wikitexto con una expresión regular, pues en una votación será común tener varias secciones con encabezados iguales («Sí», «No», «A favor», etc.). Para ello puede usarse la propia API para obtener el índice de encabezados, su contenido, y la publicación con los cambios. Para completar la herramienta, a la función de firma se le puede añadir la opción de incluir un comentario obtenido del usuario mediante un cuadro de diálogo. Si a todo esto le permitimos una personalización de las opciones desde el propio botón que va a llamar a la función, obtendremos una herramienta bastante completa y potente. A continuación, mi propuesta (que no la puedo implementar porque no soy administrador de interfaz, así que aquí la dejo).
( function ( mw, $ ) {

	$( function () {
		var ws$i18n = {
			dlgTitle: 'Firma automática',
			fldInput: 'Opcionalmente puedes agregar un comentario',
			comments: 'Este mensaje acompañará tu firma, por favor no te extiendas demasiado.',
			fldSign: 'Firma',
			btnAccept: 'Firmar',
			btnCancel: 'Cancelar',
			previewWarning: 'No se puede firmar durante la edición o previsualización.'
		};
		var ws$options = {
			classNameButton: '.ui-action-sign',
			validNamespaces: [ 4, 102 ],
			prevSignDefault: '# ',
			textSignDefault: '~~' + '~~',
			postSignDefault: '',
		};

		if (	!( ws$options.validNamespaces.includes( mw.config.get('wgNamespaceNumber') ) )
		  ||	!( mw.config.get( 'wgUserName' ) )
		  ||	!( $( ws$options.classNameButton ).length )
		) {
			return;
		}

		if ( $.inArray( mw.config.get('wgAction'), [ 'view' ] ) !== -1 )
		{
			mw.loader.using( [
			'mediawiki.api',
			'oojs-ui-core',
			'oojs-ui-widgets',
			'oojs-ui-windows'
			] )
			.then( function()
			{
				$( ws$options.classNameButton ).on( 'click', function( e )
				{
					var button = $( this );
					var sectionTitle;
					while( button.attr( 'id' ) != 'mw-content-text' )
					{
						if ( $.inArray( button.prop( 'tagName' ), [ 'H1','H2','H3','H4','H5','H6' ] ) === -1 )
						{
							button = button.prev().length ? button.prev() : button.parent();
						}
						else
						{
							sectionTitle = button.children( '.mw-headline' ).attr( 'id' );
							break;
						}
					}

					var windowManager = new OO.ui.WindowManager();
					var messageDialog = new OO.ui.MessageDialog();
					$( 'body' ).append( windowManager.$element );
					windowManager.addWindows( [ messageDialog ] );

					var inputComm = new OO.ui.MultilineTextInputWidget( {
						placeholder: ws$i18n.comments,
						rows: 3
					} );
					var inputSign = new OO.ui.TextInputWidget( {
						value: ws$options.textSignDefault,
						disabled: true
					} );
					var fieldset = new OO.ui.FieldsetLayout( {
						classes: [ 'container' ],
					} );
					fieldset.addItems( [
						new OO.ui.FieldLayout( inputComm, {
							label: ws$i18n.fldInput,
							align: 'top'
						} ),
						new OO.ui.FieldLayout( inputSign, {
							label: ws$i18n.fldSign,
						} ),
					] );
					var form = new OO.ui.FormLayout( {
						items: [ fieldset ],
					} );

					var dlg = windowManager.openWindow( messageDialog, {
						title: ws$i18n.dlgTitle,
						message: form.$element,
						actions: [
							{ label: ws$i18n.btnAccept, action: 'sign', flags: 'progressive' },
							{ label: ws$i18n.btnCancel },
						],
						size: 'medium',
					} );

					dlg.closed.then( function ( data )
					{
						if ( data && data.action === 'sign' )
						{
							var comments = inputComm.getValue();
							var prevSign;
							switch ( button.data('prev-sign') )
							{
								case 'ul':
								case 'bullet':
									prevSign = '* ';
									break;
								case 'ol':
								case 'number':
									prevSign = '# ';
									break;
								case 'custom':
									prevSign = button.data('prev-sign-custom') || '';
									break;
								default:
									prevSign = ws$options.prevSignDefault;
							}
							var textSign;
							switch ( button.data('post-sign') )
							{
								case '3':
								case 'name':
								case 'username':
									textSign = '~~' + '~';
									break;
								case '4':
								case 'sign':
								case 'usersign':
									textSign = '~~' + '~~';
									break;
								case 'custom':
									textSign = button.data('post-sign-custom') || '~~' + '~~'; // cannot be empty
									break;
								default:
									textSign = ws$options.postSignDefault || '~~' + '~~'; // cannot be empty;
							}
							var postSign;
							switch ( button.data('post-sign') )
							{
								case 'custom':
									postSign = button.data('post-sign-custom') || '';
									break;
								default:
									postSign = ws$options.postSignDefault;
							}
							var fullSign = '\n';
							if ( prevSign )
							{
								fullSign = fullSign + prevSign;
							}
							if ( comments )
							{
								fullSign = fullSign + '<small>' + comments + '</small> ';
							}
							if ( textSign )
							{
								fullSign = fullSign + textSign;
							}
							if ( postSign )
							{
								fullSign = fullSign + postSign;
							}

							var api = new mw.Api();

							if( sectionTitle )
							{
								api.get( {
									format: 'json',
									action: 'parse',
									prop: 'sections',
									page: mw.config.get( 'wgPageName' )
								} )
								.then( function ( result )
								{
									var sectionParse = result.parse.sections;
									var sectionCount = 1;
									for ( var s in sectionParse )
									{
										if ( $.trim( sectionParse[ s ].anchor ) === sectionTitle )
										{
											api.get( {
												format: 'json',
												action: 'parse',
												prop: 'wikitext',
												page: mw.config.get( 'wgPageName' ),
												section: sectionCount
											} )
											.then( function ( result )
											{
												var wikitext = result.parse.wikitext[ '*' ];
												api.post( {
													action: 'edit',
													title: mw.config.get( 'wgPageName' ),
													text: wikitext + fullSign,
													summary: '/' + '* ' + sectionTitle + ' *' + '/ ',
													section: sectionCount,
													token: mw.user.tokens.get( 'csrfToken' )
												} ).then( function () {
													window.location.reload( true );
												} );
											} );
												break;
										}
										sectionCount++;
									}
								} );
							}
							else
							{
								api.get( {
									format: 'json',
									action: 'parse',
									prop: 'wikitext',
									page: mw.config.get( 'wgPageName' )
								} )
								.then( function ( result )
								{
									var wikitext = result.parse.wikitext[ '*' ];
									api.post( {
										action: 'edit',
										title: mw.config.get( 'wgPageName' ),
										text: wikitext + fullSign,
										token: mw.user.tokens.get( 'csrfToken' )
									} ).then( function () {
										window.location.reload( true );
									} );
								} );
							}
						}
						windowManager.destroy();
					} );

					e.preventDefault();
					return false;
				} );
			} );
		}
		else
		if ( $.inArray( mw.config.get('wgAction'), [ 'edit', 'submit' ] ) !== -1 )
		{
			$( ws$options.classNameButton ).on('click', function( e ) {
				mw.notify( ws$i18n.previewWarning );
				e.preventDefault();
				return false;
			} );
		}
	} );

}( mediaWiki, jQuery ) );
A este código se le debe acompañar con la inclusión en MediaWiki:Common.js del código siguiente (de forma similar a como se hace con Wikibugs):
mw.loader.load('/w/index.php?title=MediaWiki:Sign.js&action=raw&ctype=text/javascript');
Y en la plantilla {{Firmar}} se puede prescindir del enlace al código (ya que se cargará por defecto), quedando de la forma:
<span class="mw-ui-button mw-ui-progressive ui-action-sign" {{{2|}}}>{{{1|Firmar}}}</span><noinclude>{{Documentación}}</noinclude>
Con esto, en las encuestas y votaciones se puede reemplazar el clásico comentario de «Para votar, añade # ~~~~ al final de esta sección» por un botón de {{Firmar}}.
Sobre comprobar los requisitos para votar, sería necesario establecerlo como opción o quizás detectarlo a través del título de la página. Sin embargo me encuentro que no soy capaz de detectar completamente todos los requisitos: el primero es utilizar una cuenta de usuario registrada, que se puede comprobar mediante mw.config.get('wgUserName') !== null; el tercero son 180 días de antigüedad, chequeable mediante mw.config.get('wgUserRegistration') < Date.now() - 180*24*60*60*1000; pero el segundo son 500 contribuciones en espacios de contenido, ya sea principal o anexo. Se puede comprobar el total de contribuciones con mw.config.get('wgUserEditCount'), pero no se pueden filtrar por espacios de nombre. -- Leoncastro (discusión) 00:25 23 feb 2022 (UTC)Responder
@Leoncastro ¡Excelente trabajo, acabo de actualizar el script y MediaWiki:Common.js! Solo faltaría documentar en Plantilla:Firmar/doc las nuevas opciones de configuración. ¡Gracias por tan gran aporte! PD: Si quisieras el permiso de administrador de interfaz, contás con mi apoyo. Sophivorus (discusión) 13:08 23 feb 2022 (UTC)Responder
@Sophivorus, lo he implantado en la votación en curso para ver la respuesta de la Comunidad. -- Leoncastro (discusión) 17:35 23 feb 2022 (UTC)Responder

Nueva versión editar

@Leoncastro Acabo de actualizar a una nueva versión. Aquí hay un resumen de los cambios:

  • Agregué la opción de firmar automáticamente (sin pasar por el diálogo) para cuando los comentarios no son adecuados, como pueden ser votaciones donde el tiempo de debate ya pasó, o quizás listas de participantes en wikiproyectos y editatones.
  • Quise agregar la opción de hacer que el comentario sea obligatorio. Esto debería resultar útil en aquellas consultas donde una y otra vez hay que recordar que no son votaciones. Sin embargo, parece que setear el comment field como required no alcanza, el diálogo se cierra y la firma se agrega. Parece que hay que programar la lógica. :-(
  • Renombré el script a Wikisign.js para darle un nombre más único
  • Encapsulé todo en una clase con métodos
  • Unifiqué el espaciado y el estilo de los curly braces siguiendo el estándar de JavaScript en Wikimedia
  • Renombre variables para mayor legibilidad
  • Resolví warnings
  • No vi la utilidad de textSign y postSign entonces los quité. Si me explicás el potencial, con gusto los restauro.
  • El código para determinar la sección relevante ahora es más claro y robusto y el número de sección se determina via jQuery para ahorrar un request a la API
  • Encapsulé y unifiqué el código de los requests a la API con o sin sectionTitle

También algunas ideas:

  • Opción de requerir que el usuario sea autoconfirmado
  • Opción de firmas anónimas
  • Si no se permiten firmas anónimas, enviar a logearse con returnto seteado a la página actual

Por otra parte, ¡me gustaría conversar con vos para coordinarnos mejor, intercambiar ideas, y conocernos! Si te parece, me enviarías un email con tu Whatsapp, Telegram o lo que sea? ¡Saludos! Sophivorus (discusión) 15:35 26 feb 2022 (UTC)Responder

@Sophivorus, me parece bien que el código siga evolucionando, especialmente teniendo en cuenta que mi versión la hice apresuradamente. Me parece perfecto que exista la opción de firma directa sin comentarios, puesto que era la idea original, aunque debo señalar que las votaciones sí permiten comentarios breves de hasta quince palabras. Ya que se ha generado la clase Wikisign —no veo que aquí se renombrase nada a Wikisign.js—, se podría renombrar también la página a MediaWiki:Gadget-Wikisign.js, siguiendo el modelo de herramientas como MediaWiki:Gadget-Wikibugs.js y otras más. La idea de incluir postSign era para poder compensar el prefijo prevSign, por ejemplo para un hipotético uso donde en el prefijo se indica el inicio de una plantilla (con data-prev-sign-custom="{{ejemplo|"), que requiere un cierre de llaves en postSign (con data-post-sign-custom="}}"). Observa que, además, yo había permitido configurar la forma de la firma a ingresar (que era el motivo de usar también textSign), para que, según la configuración del botón, se pueda ingresar un mensaje totalmente configurable desde el botón de acción. Además del encapsulamiento personalizable mencionado, esto podría permitir la inclusión de reportes del tipo precarga como Wikipedia:Tablón de anuncios de los bibliotecarios/Portal2/Precargas/Nombre no válido, o aquellos que se hacen con otras herramientas en desarrollo como el Usuario:Ezarate/AutoVEC.js. Estaba pensado en previsión de ampliar la funcionalidad del código. -- Leoncastro (discusión) 16:52 26 feb 2022 (UTC)Responder
@Leoncastro Gracias por la explicación, acabo de restaurar postSign (que ahora se llama "signatureSuffix") y pronto intentaré restaurar textSign. Sin embargo nótese que no es posible ingresar data-prev-sign-custom="{{ejemplo| ya que las llaves y el pipe son recogidos por el parser y hacen desastres. Hay que usar Plantilla:! y Plantilla:(( o quizás <nowiki> (todavía no logré que funcione). En cualquier caso estoy de acuerdo en hacer la herramienta lo más configurable posible para permitir usos inesperados.
También agregué la posibilidad de firmar anónimamente, véase Plantilla:Firmar/casos de prueba#Anónimos.
En cuanto a renombrar a Gadget-Wikisign, no estoy seguro ya que esto no sería un gadget (ni siquiera un gadget activado por default) ya que a diferencia de todo gadget, se liga directamente con una plantilla y por ende su ejecución debería depender de la presencia de la plantilla y no de las preferencias del usuario. En esto se parece más a mi viejo proyecto de WikiWidgets.
Por otra parte, tu idea de crear una familia de acciones además de esta me parece genial, y de hecho hace tiempo que quiero crear una acción similar para agregar argumentos y objeciones a Wikidebate. Creo por lo tanto que Wikisign quizás no sea el nombre definitivo, ya que si todas estas acciones se combinan en una sola herramienta, necesitará un nombre más genérico, como Wikiactions. De nuevo, me encantaría conversar esta y otras posibilidades por llamada, ya que son complejas y el texto quizás no sea la mejor manera. ¡Saludos! Sophivorus (discusión) 17:46 26 feb 2022 (UTC)Responder

Comportamiento botón editar

Hola:

A partir de un informe de error he ido a probar una llamada a la plantilla firmar en Wikipedia:Wikiconcurso/¡Alto! Mujeres trabajando/Participantes y he visto que si no estoy conectado con mi usuario no me abre la ventana emergente en Windows (Firefox, Edge y Chrome). En Android no me la abre nunca (Opera y Chrome). Lo mismo en Wikipedia:Wikiconcurso/WikiPorLosDerechosHumanos2022/Participantes, por ejemplo.

Creo que lo estoy dejando en buen lugar, otra opción me quedaría en el Café de técnica pero a lo mejor es algo evidente (o algo que hago yo mal, o es una feature y no un error).

Gracias por adelantado, un saludo Kirchhoff (discusión) 17:23 22 mar 2022 (UTC)Responder

¿Será la opción "permitir-anons=1" y tenía que haber leido antes de dejar el mensaje? ;) quizás, gracias en todo caso. Saludos --Kirchhoff (discusión) 17:28 22 mar 2022 (UTC)Responder
La opción permitir-anons=1 no está operativa porque el código tuvo que ser restaurado a un estado anterior por problemas de funcionamiento (este estado es el correspondiente al hilo precedente de Mejoras). Actualmente en esa versión estable no estaba permitida la firma de usuarios anónimos, por lo que es necesario estar conectado con la cuenta de usuario y no funcionan algunos comandos avanzados descritos en la documentación (y que se implementaron como parte del hilo de la Nueva versión). Por otro lado, no consta que la herramienta fuera activada en MediaWiki:Mobile.js para funcionar en dispositivos móviles. A ver si Sophivorus puede revisar todo esto y recuperar la nueva versión sin sus problemas de funcionamiento. -- Leoncastro (discusión) 18:17 22 mar 2022 (UTC)Responder
@Kirchhoff @Leoncastro @Ezarate ¡Hola! Finalmente dediqué unas horas a reparar (y mejorar) la herramienta. Al parecer, los usuarios anónimos no tienen permitido editar via JavaScript, de modo que ahora, si hacen click en el botón de firmar, simplemente les carga el editor manual. Además introduje una verificación adicional que invita a firmar manualmente si ocurre algún otro error. Por cierto, si lo pueden probar un poco e informar de cualquier error o problema, lo agradecería. En cuanto a móviles, agregué el código a MediaWiki:Mobile.js pero no parece estar funcionando y tampoco dispara ningún error. @Leoncastro ¿Alguna idea de cuál puede ser la causa? Sophivorus (discusión) 14:05 23 mar 2022 (UTC)Responder
No tengo mucha idea de programación en dispositivos móviles y no sé si en determinados sistemas el JS está limitado. Lo que sí puedo ver es que la herramienta sí funciona usando la versión para dispositivos móviles en Windows. Por otro lado, Sophivorus, ¿desde cuando «los usuarios anónimos no tienen permitido editar via JavaScript»? Esta fue una edición anónima usando esta misma herramienta. -- Leoncastro (discusión) 19:58 23 mar 2022 (UTC)Responder
@Leoncastro ¡Hmm! Bueno parece que hay algo que me impide firmar de manera anónima y que cargue correctamente en mi móvil (ahora que lo pienso esto probablemente sea mi adblocker en Firefox para Android). Espero poder investigarlo pronto, pero esta semana ya tengo que dar prioridad a otras cosas. Si quieres meter mano antes, bienvenido sea, ¡saludos! Sophivorus (discusión) 00:59 24 mar 2022 (UTC)Responder

Fallo al reconocer las secciones editar

He agregado los botones de firma a la votación Wikipedia:Votaciones/2024/Desactivación de la palabra mágica INDEX, pero por lo visto no reconoce adecuadamente las secciones y agrega la firma al final de la primera sección, donde se explica el asunto de la votación, en lugar de agregarla en la sección correspondiente de la votación. @Sophivorus, a ver si le puedes echar un vistazo. -- Leoncastro (discusión) 14:47 1 ene 2024 (UTC)Responder

@Leoncastro Gracias por el aviso, el problema se debía a que mw:Extension:DiscussionTools modifica el HTML de los títulos de secciones. Ya lo solucioné, saludos! Sophivorus (discusión) 21:10 3 ene 2024 (UTC)Responder
@Sophivorus, revisa headingÑ en la última. -- Leoncastro (discusión) 21:20 3 ene 2024 (UTC)Responder
@Leoncastro Gracias, qué distraído. Sophivorus (discusión) 23:28 3 ene 2024 (UTC)Responder
Volver a la página «Gadget-WikiSign.js».