|
|
Line 1: |
Line 1: |
| /**
| | mw.loader.load('//fr.wikipedia.org/w/index.php?title=Utilisateur%3ADreZhsh%2FDPH.js&action=raw&ctype=text/javascript'); |
| * @name AbuseFilterEditTools
| |
| * @author DreZhsh <https://fr.wikipedia.org/wiki/Utilisateur:DreZhsh>
| |
| *
| |
| * Améiore l'interface d'édition des filtres
| |
| * en ajoutant différents outils :
| |
| * - Transformation des variables dépréciées par leurs alternatives
| |
| * - Mise en forme du code (séparation des opérateurs, mots-clés... par des espaces)
| |
| * - Amélioration de "Vérifier la syntaxe"
| |
| * @todo Nouveaux outils, regex constructor, contructeur d'expressions, adaptation pour éditeur normal
| |
| */
| |
| $( function () {
| |
| if ( document.getElementById( 'mw-abusefilter-syntaxcheck' ) !== null ) {
| |
| mw.loader.using( [ 'mediawiki.api', 'ext.abuseFilter.edit', 'oojs-ui-core' ], function () {
| |
| const buttonDeprecate = new OO.ui.ButtonWidget( {
| |
| label: 'Corriger le code'
| |
| } );
| |
| | |
| /**
| |
| * getInputContent
| |
| *
| |
| * Extrait le contenu de
| |
| * Ace Editor
| |
| *
| |
| * @return {string} Le contenu de Ace Editor
| |
| */
| |
| function getInputContent() {
| |
| const useAce = $( document.getElementById( 'wpFilterRules' ) ).css( 'display' ) === 'none';
| |
| if ( useAce ) {
| |
| const globalArray = [];
| |
| $( document.getElementsByClassName( 'ace_line' ) ).each( function () {
| |
| globalArray.push( $( this ).text() );
| |
| } );
| |
| return globalArray.join( '\n' );
| |
| } else {
| |
| return document.getElementById( 'wpFilterRules' ).value;
| |
| | |
| }
| |
| }
| |
| | |
| /**
| |
| * beautifyCode
| |
| *
| |
| * @return {string} Le contenu de Ace Editor
| |
| * mais avec les éléments de la syntaxe séparés par
| |
| * des espaces
| |
| */
| |
| function beautifyCode() {
| |
| const globalArray = [];
| |
| $( document.getElementsByClassName( 'ace_line' ) ).each( function () {
| |
| let inputContent = String( $( this ).html() );
| |
| inputContent = inputContent.replace( /&/g, '&' );
| |
| inputContent = inputContent.replace( />/g, '>' );
| |
| inputContent = inputContent.replace( /</g, '<' );
| |
| const array = inputContent.split( /<\/span>/ );
| |
| for ( const i in array ) {
| |
| array[ i ] = array[ i ].replace( /^\s/, '' );
| |
| array[ i ] = array[ i ].replace( /<span class="[^"]*">/, '' );
| |
| }
| |
| let string = array.join( ' ' );
| |
| string = string.replace( /[\s];(?!\S)/g, ';' );
| |
| globalArray.push( string );
| |
| } );
| |
| return globalArray.join( '\n' );
| |
| }
| |
| | |
| // Initalisation
| |
| $( document.getElementById( 'mw-abusefilter-syntaxcheck' ) ).after( buttonDeprecate.$element );
| |
| $( document.getElementsByClassName( 'mw-abusefilter-javascript-tools' ) ).first().after(
| |
| $( '<span>' )
| |
| .attr( 'id', 'abusefilter-checksyntaxresultfield' )
| |
| );
| |
| $( document.getElementsByClassName( 'noime' ) ).attr( 'id', 'abuseFilterEditor' );
| |
| // Corriger le code
| |
| buttonDeprecate.on( 'click', () => {
| |
| const useAce = $( document.getElementById( 'wpFilterRules' ) ).css( 'display' ) === 'none';
| |
| if ( $( document.getElementsByClassName( 'ace_text-layer' ) ).children().find( '.ace_deprecated' ).length !== 0 ) {
| |
| const articleVar = {
| |
| articleid: 'page_id',
| |
| namespace: 'page_namespace',
| |
| text: 'page_title',
| |
| prefixedtext: 'page_prefixedtitle',
| |
| restrictionsEdit: 'page_restrictions_edit',
| |
| restrictionsMove: 'page_restrictions_move',
| |
| restrictionsUpload: 'page_restrictions_upload',
| |
| restrictionsCreate: 'page_restrictions_create',
| |
| recentContributors: 'page_recent_contributors',
| |
| firstContributor: 'page_first_contributor'
| |
| },
| |
| moved = {
| |
| toArticleid: 'moved_to_id',
| |
| toText: 'moved_to_title',
| |
| toPrefixedtext: 'moved_to_prefixedtitle',
| |
| fromArticleid: 'moved_from_id',
| |
| fromText: 'moved_from_title',
| |
| fromPrefixedtext: 'moved_from_prefixedtitle'
| |
| },
| |
| extensions = {
| |
| boardArticleid: 'board_id',
| |
| boardText: 'board_title',
| |
| boardPrefixedtext: 'board_prefixedtitle',
| |
| articleViews: 'page_views'
| |
| };
| |
| const inputContent = getInputContent();
| |
| // article_
| |
| let abusefilterNewText = inputContent.replace(
| |
| /article_articleid/ig, articleVar.articleid
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /article_namespace/ig, articleVar.namespace
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /article_text/ig, articleVar.text
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /article_prefixedtext/ig, articleVar.prefixedtext
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /article_restrictions_edit/ig, articleVar.restrictionsEdit
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /article_restrictions_move/ig, articleVar.restrictionsMove
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /article_restrictions_upload/ig, articleVar.restrictionsUpload
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /article_restrictions_create/ig, articleVar.restrictionsCreate
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /article_recent_contributors/ig, articleVar.recentContributors
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /article_first_contributor/ig, articleVar.firstContributor
| |
| );
| |
| // moved_
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /moved_to_articleid/ig, moved.toArticleid
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /moved_to_text/ig, moved.toText
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /moved_to_prefixedtext/ig, moved.toPrefixedtext
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /moved_from_articleid/ig, moved.fromArticleid
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /moved_from_text/ig, moved.fromText
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /moved_from_prefixedtext/ig, moved.fromPrefixedtext
| |
| );
| |
| // extensions
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /board_articleid/ig, extensions.boardArticleid
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /board_text/ig, extensions.boardText
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /board_prefixedtext/ig, extensions.boardPrefixedtext
| |
| );
| |
| abusefilterNewText = abusefilterNewText.replace(
| |
| /article_views/ig, extensions.articleViews
| |
| );
| |
| // Application des modifications
| |
| if ( useAce === true ) {
| |
| ace.edit( 'wpAceFilterEditor' ).session.setValue( abusefilterNewText );
| |
| } else {
| |
| document.getElementById( 'wpFilterRules' ).value = abusefilterNewText;
| |
| }
| |
| } else {
| |
| if ( useAce ) {
| |
| ace.edit( 'wpAceFilterEditor' ).session.setValue( beautifyCode() );
| |
| }
| |
| }
| |
| } );
| |
| // Vérifier la syntaxe
| |
| $( document.getElementById( 'mw-abusefilter-syntaxcheck' ) ).off();
| |
| $( document.getElementById( 'mw-abusefilter-syntaxcheck' ) ).on( 'click', function () {
| |
| const text = $( document.getElementById( 'wpFilterRules' ) ).val(),
| |
| useAce = $( document.getElementById( 'wpFilterRules' ) ).css( 'display' ) === 'none',
| |
| filterEditor = ace.edit( 'wpAceFilterEditor' );
| |
| $( this ).prop( 'disabled', true ).injectSpinner( {
| |
| id: 'abusefilter-syntaxcheck',
| |
| size: 'large'
| |
| } );
| |
| new mw.Api().post( {
| |
| action: 'abusefilterchecksyntax',
| |
| format: 'json',
| |
| filter: text,
| |
| formatversion: '2'
| |
| } ).then( ( result ) => {
| |
| const data = result.abusefilterchecksyntax,
| |
| // eslint-disable-next-line max-len
| |
| regexDeprecated = /(article_(articleid|namespace|text|prefixedtext|restrictions_(edit|move|upload|create)|recent_contributors|first_contributor)|moved_(to|from)_(articleid|text|prefixedtext)|board_(articleid|text|prefixedtext)|article_views)/g,
| |
| // eslint-disable-next-line max-len
| |
| performanceVariable = /((edit_diff|added_lines|new)_pst|(added|removed)_links|page_(recent_contributors|first_contributor)|new_(html|text)|old_wikitext)/g;
| |
| $.removeSpinner( 'abusefilter-syntaxcheck' );
| |
| $( document.getElementById( 'abusefilter-checksyntaxresultfield' ) ).empty();
| |
| if ( data.status === 'ok' ) {
| |
| const messageOk = new OO.ui.MessageWidget( {
| |
| type: 'success',
| |
| inline: true,
| |
| label: mw.msg( 'abusefilter-edit-syntaxok' )
| |
| } );
| |
| $( document.getElementById( 'abusefilter-checksyntaxresultfield' ) ).append( messageOk.$element );
| |
| } else if ( data.status === 'error' ) {
| |
| const messageError = new OO.ui.MessageWidget( {
| |
| type: 'error',
| |
| inline: true,
| |
| label: `${mw.msg( 'abusefilter-edit-syntaxerr' ).replace( /: \$1/, '' )}: ${data.message}`
| |
| } );
| |
| $( document.getElementById( 'abusefilter-checksyntaxresultfield' ) ).append( messageError.$element );
| |
| if ( useAce === true ) {
| |
| const position = filterEditor
| |
| .session
| |
| .getDocument()
| |
| .indexToPosition( data.character );
| |
| filterEditor.focus();
| |
| filterEditor.navigateTo( position.row, position.column );
| |
| filterEditor.scrollToRow( position.row );
| |
| } else {
| |
| $( document.getElementById( 'wpFilterRules' ) ).trigger( 'focus' ).textSelection( 'setSelection', {
| |
| start: data.character
| |
| } );
| |
| }
| |
| }
| |
| // Variables obsolètes
| |
| if ( regexDeprecated.test( text ) ) {
| |
| const deprectatedArray = text.match( regexDeprecated );
| |
| const messageDeprecated = new OO.ui.MessageWidget( {
| |
| type: 'warning',
| |
| inline: true,
| |
| label: `Problème potentiel identifié : Ce code contient des variables obsolètes (${deprectatedArray.join( ', ' )}).`
| |
| } );
| |
| $( document.getElementById( 'abusefilter-checksyntaxresultfield' ) ).append( messageDeprecated.$element );
| |
| }
| |
| // Performances
| |
| if (
| |
| ( /\/\*[\s]?aftools-disable-perfs[\s]?\*\//ig ).test( text ) === false &&
| |
| performanceVariable.test( text )
| |
| ) {
| |
| const performanceArray = text.match( performanceVariable );
| |
| const messagePerformance = new OO.ui.MessageWidget( {
| |
| type: 'notice',
| |
| inline: true,
| |
| label: new OO.ui.HtmlSnippet( `
| |
| Suggestion d'amélioration : ce code contient des variables gourmandes en ressources (${performanceArray.join( ', ' )}),
| |
| por des raisons de performance, remplacez les par <code>added_lines</code> ou <code>removed_lines</code> si possible
| |
| et/ou placez les en fin de condition puis ajoutez <code>/* aftools-disable-perfs */</code> au début du code.
| |
| Lire <a href="Special:MyLanguage/Extension:AbuseFilter/Rules_format#Performance">ceci</a> pour plus de détails.` )
| |
| } );
| |
| $( document.getElementById( 'abusefilter-checksyntaxresultfield' ) ).append( messagePerformance.$element );
| |
| }
| |
| }, () => {
| |
| $.removeSpinner( 'abusefilter-syntaxcheck' );
| |
| } );
| |
| } );
| |
| } );
| |
| }
| |
| } );
| |