Diferencia entre revisiones de «MediaWiki discusión:Gadget-WikiSign.js»

Contenido eliminado Contenido añadido
m Sophivorus trasladó la página Módulo discusión:Sign.js a MediaWiki discusión:Sign.js sin dejar una redirección
Línea 5:
 
:@[[Usuario:Leoncastro|Leoncastro]] Hecho lo de <code>ui-action-sign</code>. En cuanto al diálogo para comentarios y la validación de requisitos, me parecen excelentes ideas que espero incorporar pronto. ¡Saludos! [[Usuario:Sophivorus|Sophivorus]] ([[Usuario Discusión:Sophivorus|discusión]]) 17:06 22 feb 2022 (UTC)
 
:: Además de la protección de la clase <code>ui-action-sign</code> 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 <syntaxhighlight inline lang="js">button.closest( 'p' )</syntaxhighlight> no es acertada, pues el botón puede no estar en un párrafo sino en una definición (como usando <code><nowiki>: {{Firmar}}</nowiki></code>) 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 [[Wikipedia:Administradores de interfaz|administrador de interfaz]], así que aquí la dejo).
:: <syntaxhighlight lang="js">
( 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 ) );
</syntaxhighlight>
:: 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):
:: <syntaxhighlight lang="js">
mw.loader.load('/w/index.php?title=MediaWiki:Sign.js&action=raw&ctype=text/javascript');
</syntaxhighlight>
:: Y en la plantilla {{ep|Firmar}} se puede prescindir del enlace al código (ya que se cargará por defecto), quedando de la forma:
:: <syntaxhighlight lang="text">
<span class="mw-ui-button mw-ui-progressive ui-action-sign" {{{2|}}}>{{{1|Firmar}}}</span><noinclude>{{Documentación}}</noinclude>
</syntaxhighlight>
:: Con esto, en las encuestas y votaciones se puede reemplazar el clásico comentario de «''Para votar, añade <nowiki># ~~~~</nowiki> al final de esta sección''» por un botón de {{ep|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 [[Wikipedia:Votaciones#Cómo_participar|los requisitos]]: el primero es utilizar una cuenta de usuario registrada, que se puede comprobar mediante <code>mw.config.get('wgUserName') !== null</code>; el tercero son 180 días de antigüedad, chequeable mediante <code>mw.config.get('wgUserRegistration') < Date.now() - 180*24*60*60*1000</code>; pero el segundo son 500 contribuciones en espacios de <u>contenido</u>, ya sea principal o anexo. Se puede comprobar el total de contribuciones con <code>mw.config.get('wgUserEditCount')</code>, pero no se pueden filtrar por espacios de nombre. -- [[Usuario:Leoncastro|Leoncastro]] ([[Usuario Discusión:Leoncastro|discusión]]) 00:25 23 feb 2022 (UTC)
Volver a la página «Gadget-WikiSign.js».