diff --git a/modules/insertlink/TitleInputField.js b/modules/insertlink/TitleInputField.js index 149291ef..899eb697 100644 --- a/modules/insertlink/TitleInputField.js +++ b/modules/insertlink/TitleInputField.js @@ -49,7 +49,7 @@ TitleInputField.prototype.reset = function () { * Set the URL mode and disable automatic detection of external URLs. * * @public - * @param {string} urlMode One of the `TitleInputField.urlModes.*` values. + * @param {string} urlMode One of the `LinkTypeField.static.LINK_MODE_*` values. */ TitleInputField.prototype.setUrlMode = function ( urlMode ) { this.urlMode = urlMode === LinkTypeField.static.LINK_MODE_EXTERNAL ? @@ -90,8 +90,9 @@ TitleInputField.prototype.makeMessage = function ( kind, text ) { TitleInputField.prototype.setMessage = function ( icon, message, type ) { this.setNotices( [ message ] ); // Note that setNotices() must be called before this.message is available. - this.message.setType( type || 'notice' ); - this.message.setIcon( icon ); + this.message + .setIcon( icon ) + .setType( type ); }; /** @@ -130,29 +131,24 @@ TitleInputField.prototype.validate = function ( value ) { * @param {TitleOptionWidget} item */ TitleInputField.prototype.onSelect = function ( item ) { + var icon, msg; if ( this.urlMode === LinkTypeField.static.LINK_MODE_EXTERNAL || ( !this.urlModeManual && this.urlMode === LinkTypeField.static.LINK_MODE_INTERNAL && item.isExternal() ) ) { - this.setMessage( - 'linkExternal', - mw.message( 'wikieditor-toolbar-tool-link-int-target-status-external' ).parse() - ); + icon = 'linkExternal'; + msg = 'wikieditor-toolbar-tool-link-int-target-status-external'; } else if ( item.isDisambiguation() ) { - this.setMessage( - 'articleDisambiguation', - mw.message( 'wikieditor-toolbar-tool-link-int-target-status-disambig' ).parse() - ); + icon = 'articleDisambiguation'; + msg = 'wikieditor-toolbar-tool-link-int-target-status-disambig'; } else if ( !item.isMissing() && !item.isExternal() ) { - this.setMessage( - 'article', - mw.message( 'wikieditor-toolbar-tool-link-int-target-status-exists' ).parse() - ); + icon = 'article'; + msg = 'wikieditor-toolbar-tool-link-int-target-status-exists'; } else { - this.setMessage( - 'articleNotFound', - mw.message( 'wikieditor-toolbar-tool-link-int-target-status-notexists' ).parse() - ); + icon = 'articleNotFound'; + msg = 'wikieditor-toolbar-tool-link-int-target-status-notexists'; } + // eslint-disable-next-line mediawiki/msg-doc + this.setMessage( icon, mw.message( msg ).parse() ); }; module.exports = TitleInputField; diff --git a/modules/insertlink/TitleInputWidget.js b/modules/insertlink/TitleInputWidget.js index 01222233..64274aa9 100644 --- a/modules/insertlink/TitleInputWidget.js +++ b/modules/insertlink/TitleInputWidget.js @@ -133,11 +133,10 @@ TitleInputWidget.prototype.onLookupMenuChoose = function ( item ) { */ TitleInputWidget.prototype.getOverlay = function () { // Overlay z-index must be greater than the jQuery UI dialog's of 1002. - var $overlay = OO.ui.getDefaultOverlay() + return OO.ui.getDefaultOverlay() .clone() - .css( 'z-index', '1010' ); - $( document.body ).append( $overlay ); - return $overlay; + .css( 'z-index', '1010' ) + .appendTo( document.body ); }; /** @@ -149,8 +148,7 @@ TitleInputWidget.prototype.getOverlay = function () { * @return {boolean} */ TitleInputWidget.prototype.looksLikeExternalLink = function ( urlString ) { - var matches = urlString.match( this.constructor.static.urlRegex ); - return matches !== null && matches.length > 0; + this.constructor.static.urlRegex.test( urlString ); }; module.exports = TitleInputWidget; diff --git a/modules/insertlink/TitleOptionWidget.js b/modules/insertlink/TitleOptionWidget.js index 0b1d6e4c..787e0232 100644 --- a/modules/insertlink/TitleOptionWidget.js +++ b/modules/insertlink/TitleOptionWidget.js @@ -17,7 +17,7 @@ function InsertLinkTitleOptionWidget( config ) { config.data = config.url; // Prepend http:// if there is no protocol (i.e. if it starts with "www."). // @TODO This is repeated when the link is inserted (in jquery.wikiEditor.dialogs.config.js). - if ( !config.url.match( /^[a-z]+:\/\/./ ) ) { + if ( !/^[a-z]+:\/\/./.test( config.url ) ) { config.url = 'http://' + config.url; } config.missing = false; diff --git a/modules/jquery.wikiEditor.dialogs.config.js b/modules/jquery.wikiEditor.dialogs.config.js index 4d7626ab..1c4688af 100644 --- a/modules/jquery.wikiEditor.dialogs.config.js +++ b/modules/jquery.wikiEditor.dialogs.config.js @@ -189,7 +189,7 @@ } else { target = target.trim(); // Prepend http:// if there is no protocol - if ( !target.match( /^[a-z]+:\/\/./ ) ) { + if ( !/^[a-z]+:\/\/./.test( target ) ) { target = 'http://' + target; } @@ -247,8 +247,9 @@ // Blank form insertLinkTitleInputField.reset(); - insertLinkLinkTextField.getField().setValue( '' ); - insertLinkLinkTypeField.getField().selectItem( null ); + insertLinkLinkTextField.getField() + .setValue( '' ) + .selectItem( null ); } }, 'wikieditor-toolbar-tool-link-cancel': function () { @@ -498,9 +499,6 @@ if ( !match ) { return false; } - var result = {}; - result.pre = match[ 1 ]; - result.post = match[ 3 ]; // Escape pipes inside links and templates, // then split the parameters at the remaining pipes var params = match[ 2 ].replace( /\[\[[^[\]]*\]\]|\{\{[^{}]\}\}/g, function ( link ) { @@ -510,7 +508,11 @@ if ( !file || file.getNamespaceId() !== 6 ) { return false; } - result.fileName = file.getMainText(); + var result = { + pre: match[ 1 ], + post: match[ 3 ], + fileName: file.getMainText() + }; for ( var i = 1; i < params.length; i++ ) { var paramOrig = params[ i ]; var param = paramOrig.toLowerCase(); @@ -811,11 +813,7 @@ var match = false; var offset, textRemainder; if ( mode !== 'replaceAll' ) { - if ( mode === 'replace' ) { - offset = $( this ).data( 'matchIndex' ); - } else { - offset = $( this ).data( 'offset' ); - } + offset = $( this ).data( mode === 'replace' ? 'matchIndex' : 'offset' ); textRemainder = text.slice( offset ); match = textRemainder.match( regex ); } @@ -865,28 +863,20 @@ offset = offset + match.index + actualReplacement.length; textRemainder = text.slice( offset ); match = textRemainder.match( regex ); - - if ( match ) { - start = offset + match.index; - end = start + match[ 0 ].length; - } else { + if ( !match ) { // If no new string was found, try searching from the beginning. // TODO: Add a "Wrap around" option. + offset = 0; textRemainder = text; match = textRemainder.match( regex ); - if ( match ) { - start = match.index; - end = start + match[ 0 ].length; - } else { - // Give up - start = 0; - end = 0; - } } - } else { - start = offset + match.index; - end = start + match[ 0 ].length; + if ( !match ) { + // Give up + match = { index: 0, 0: { length: 0 } }; + } } + start = offset + match.index; + end = start + match[ 0 ].length; $( this ).data( 'matchIndex', start ); @@ -922,8 +912,7 @@ }, open: function () { var that = this; - $( this ).data( 'offset', 0 ); - $( this ).data( 'matchIndex', 0 ); + $( this ).data( { offset: 0, matchIndex: 0 } ); $( '#wikieditor-toolbar-replace-search' ).trigger( 'focus' ); $( '#wikieditor-toolbar-replace-nomatch, #wikieditor-toolbar-replace-success, #wikieditor-toolbar-replace-emptysearch, #wikieditor-toolbar-replace-invalidregex' ).hide(); @@ -945,10 +934,7 @@ } var $dialog = $( this ).closest( '.ui-dialog' ); that = this; - var context = $( this ).data( 'context' ); - var $textbox = context.$textarea; - - $textbox + $( this ).data( 'context' ).$textarea .on( 'keypress.srdialog', function ( e ) { if ( e.which === 13 ) { // Enter @@ -961,9 +947,8 @@ } ); }, close: function () { - var context = $( this ).data( 'context' ), - $textbox = context.$textarea; - $textbox.off( 'keypress.srdialog' ); + $( this ).data( 'context' ).$textarea + .off( 'keypress.srdialog' ); $( this ).closest( '.ui-dialog' ).data( 'dialogaction', false ); } } diff --git a/modules/jquery.wikiEditor.js b/modules/jquery.wikiEditor.js index c3e72f92..1965bbd5 100644 --- a/modules/jquery.wikiEditor.js +++ b/modules/jquery.wikiEditor.js @@ -222,7 +222,7 @@ // where we left off var context = $( this ).data( 'wikiEditor-context' ); // On first call, we need to set things up, but on all following calls we can skip right to the API handling - if ( !context || typeof context === 'undefined' ) { + if ( !context ) { // Star filling the context with useful data - any jQuery selections, as usual should be named with a preceding $ context = { @@ -315,13 +315,9 @@ */ trigger: function ( name, event ) { // Event is an optional argument, but from here on out, at least the type field should be dependable - if ( typeof event === 'undefined' ) { - event = { type: 'custom' }; - } + event = event || { type: 'custom' }; // Ensure there's a place for extra information to live - if ( typeof event.data === 'undefined' ) { - event.data = {}; - } + event.data = event.data || {}; // Allow filtering to occur if ( name in context.evt ) { @@ -329,7 +325,7 @@ return false; } } - var returnFromModules = null; // they return null by default + var returnFromModules = true; // Pass the event around to all modules activated on this context for ( var module in context.modules ) { @@ -341,19 +337,11 @@ var ret = $.wikiEditor.modules[ module ].evt[ name ]( context, event ); if ( ret !== null ) { // if 1 returns false, the end result is false - if ( returnFromModules === null ) { - returnFromModules = ret; - } else { - returnFromModules = returnFromModules && ret; - } + returnFromModules = returnFromModules && ret; } } } - if ( returnFromModules !== null ) { - return returnFromModules; - } else { - return true; - } + return returnFromModules; }, /** @@ -484,13 +472,13 @@ context.$ui = context.$textarea.parent().parent().parent().parent().parent(); context.$wikitext = context.$textarea.parent().parent().parent().parent(); // Add in tab and button containers - context.$wikitext - .before( - $( '
' ).addClass( 'wikiEditor-ui-controls' ) - .append( $( '
' ).addClass( 'wikiEditor-ui-tabs' ).hide() ) - .append( $( '
' ).addClass( 'wikiEditor-ui-buttons' ) ) - ) - .before( $( '
' ).addClass( 'wikiEditor-ui-clear' ) ); + context.$wikitext.before( + $( '
' ).addClass( 'wikiEditor-ui-controls' ).append( + $( '
' ).addClass( 'wikiEditor-ui-tabs' ).hide(), + $( '
' ).addClass( 'wikiEditor-ui-buttons' ) + ), + $( '
' ).addClass( 'wikiEditor-ui-clear' ) + ); // Get references to some of the newly created containers context.$controls = context.$ui.find( '.wikiEditor-ui-buttons' ).hide(); context.$buttons = context.$ui.find( '.wikiEditor-ui-buttons' ); @@ -498,8 +486,10 @@ // Clear all floating after the UI context.$ui.after( $( '
' ).addClass( 'wikiEditor-ui-clear' ) ); // Attach a right container - context.$wikitext.append( $( '
' ).addClass( 'wikiEditor-ui-right' ) ); - context.$wikitext.append( $( '
' ).addClass( 'wikiEditor-ui-clear' ) ); + context.$wikitext.append( + $( '
' ).addClass( 'wikiEditor-ui-right' ), + $( '
' ).addClass( 'wikiEditor-ui-clear' ) + ); // Attach a top container to the left pane context.$wikitext.find( '.wikiEditor-ui-left' ).prepend( $( '
' ).addClass( 'wikiEditor-ui-top' ) ); // Setup the initial view @@ -544,7 +534,7 @@ // Handle API calls var callArg = args.shift(); if ( callArg in context.api ) { - context.api[ callArg ]( context, typeof args[ 0 ] === 'undefined' ? {} : args[ 0 ] ); + context.api[ callArg ]( context, args[ 0 ] || {} ); } } diff --git a/modules/jquery.wikiEditor.toolbar.js b/modules/jquery.wikiEditor.toolbar.js index c8cd78ba..7e7f90ce 100644 --- a/modules/jquery.wikiEditor.toolbar.js +++ b/modules/jquery.wikiEditor.toolbar.js @@ -221,7 +221,7 @@ var replace = action.type === 'replace'; if ( 'regex' in action.options && 'regexReplace' in action.options ) { var selection = context.$textarea.textSelection( 'getSelection' ); - if ( selection !== '' && selection.match( action.options.regex ) ) { + if ( selection !== '' && action.options.regex.test( selection ) ) { parts.peri = selection.replace( action.options.regex, action.options.regexReplace ); parts.pre = parts.post = ''; @@ -249,10 +249,7 @@ var $group = $( '
' ).attr( { class: 'group group-' + id, rel: id } ), label = $.wikiEditor.autoMsg( group, 'label' ); if ( label ) { - var $label = $( '' ) - .addClass( 'label' ) - .text( label ); - $group.append( $label ); + $( '' ).addClass( 'label' ).text( label ).appendTo( $group ); } var empty = true; if ( 'tools' in group ) { @@ -297,9 +294,9 @@ } else if ( tool.type === 'toggle' ) { oouiButton = new OO.ui.ToggleButtonWidget( config ); } - $button = oouiButton.$element; - $button.attr( 'rel', id ); - $button.data( 'ooui', oouiButton ); + $button = oouiButton.$element + .attr( 'rel', id ) + .data( 'ooui', oouiButton ); } else { $button = $( '' ) .attr( { @@ -430,16 +427,17 @@ return $select; case 'element': // A raw 'element' type can be {htmlString|Element|Text|Array|jQuery|OO.ui.HTMLSnippet|function}. - var $element = $( '
' ) - .attr( { rel: id, class: 'tool tool-element' } ); + var $element; if ( tool.element instanceof OO.ui.HtmlSnippet ) { - $element.append( tool.element.toString() ); + $element = tool.element.toString(); } else if ( typeof tool.element === 'function' ) { - $element.append( tool.element( context ) ); + $element = tool.element( context ); } else { - $element.append( tool.element ); + $element = tool.element; } - return $element; + return $( '
' ) + .attr( { rel: id, class: 'tool tool-element' } ) + .append( $element ); default: return null; } @@ -461,8 +459,9 @@ .on( 'click', function ( event ) { $( this ).parent().parent().find( '.page' ).hide(); $( this ).parent().parent().find( '.page-' + $( this ).attr( 'rel' ) ).show().trigger( 'loadPage' ); - $( this ).siblings().removeClass( 'current' ); - $( this ).addClass( 'current' ); + $( this ) + .addClass( 'current' ) + .siblings().removeClass( 'current' ); var section = $( this ).parent().parent().attr( 'rel' ); $.cookie( 'wikiEditor-' + $( this ).data( 'context' ).instance + '-booklet-' + section + '-page', @@ -493,8 +492,7 @@ switch ( page.layout ) { case 'table': $page.addClass( 'page-table' ); - var html = - ''; + var html = ''; if ( 'headings' in page ) { html += toolbarModule.fn.buildHeading( context, page.headings ); } @@ -503,7 +501,7 @@ html += toolbarModule.fn.buildRow( context, page.rows[ i ] ); } } - $page.html( html + '
' ); + $page.html( '' + html + '
' ); break; case 'characters': $page.addClass( 'page-characters' ); @@ -549,21 +547,21 @@ } }, buildHeading: function ( context, headings ) { - var html = ''; + var html = ''; for ( var i = 0; i < headings.length; i++ ) { html += '' + $.wikiEditor.autoSafeMsg( headings[ i ], [ 'html', 'text' ] ) + ''; } - return html + ''; + return '' + html + ''; }, buildRow: function ( context, row ) { - var html = ''; + var html = ''; for ( var cell in row ) { // FIXME: This currently needs to use the "unsafe" .text() message because it embeds raw HTML // in the messages (as used exclusively by the 'help' toolbar panel). html += '' + $.wikiEditor.autoMsg( row[ cell ], [ 'html', 'text' ] ) + ''; } - return html + ''; + return '' + html + ''; }, buildCharacter: function ( character, actions ) { if ( typeof character === 'string' ) { @@ -593,23 +591,13 @@ } if ( character && 'action' in character && 'label' in character ) { actions[ character.label ] = character.action; - if ( character.titleMsg !== undefined || character.title !== undefined ) { - var title; - if ( character.titleMsg !== undefined ) { - // eslint-disable-next-line mediawiki/msg-doc - title = mw.msg( character.titleMsg ); - } else { - title = character.title; - } - - return mw.html.element( - 'span', - { rel: character.label, title: title }, - character.label - ); - } else { - return mw.html.element( 'span', { rel: character.label }, character.label ); - } + // eslint-disable-next-line mediawiki/msg-doc + var title = character.titleMsg ? mw.msg( character.titleMsg ) : character.title; + return mw.html.element( + 'span', + { rel: character.label, title: title || false }, + character.label + ); } mw.log( 'A character for the toolbar was undefined. This is not supposed to happen. Double check the config.' ); // bug 31673; also an additional fix for bug 24208... @@ -663,8 +651,9 @@ .removeClass( 'section-visible' ) .addClass( 'section-hidden' ); - $( this ).attr( 'aria-expanded', 'false' ); - $( this ).parent().parent().find( 'a' ).removeClass( 'current' ); + $( this ) + .attr( 'aria-expanded', 'false' ) + .parent().parent().find( 'a' ).removeClass( 'current' ); if ( show ) { $section .removeClass( 'section-hidden' ) @@ -705,13 +694,9 @@ // Show or hide section if ( id !== 'main' && id !== 'secondary' ) { - $section.attr( 'aria-expanded', show ? 'true' : 'false' ); - - if ( show ) { - $section.addClass( 'section-visible' ); - } else { - $section.addClass( 'section-hidden' ); - } + $section + .attr( 'aria-expanded', show.toString() ) + .addClass( show ? 'section-visible' : 'section-hidden' ); } return $section; }, @@ -759,7 +744,7 @@ ); } } - $section.append( $index ).append( $pages ); + $section.append( $index, $pages ); toolbarModule.fn.updateBookletSelection( context, id, $pages, $index ); break; } diff --git a/tests/qunit/ext.wikiEditor.toolbar.test.js b/tests/qunit/ext.wikiEditor.toolbar.test.js index ecfd864e..1e834a7f 100644 --- a/tests/qunit/ext.wikiEditor.toolbar.test.js +++ b/tests/qunit/ext.wikiEditor.toolbar.test.js @@ -1,10 +1,10 @@ ( function () { QUnit.module( 'ext.wikiEditor.toolbar', QUnit.newMwEnvironment( { setup: function () { - var $fixture = $( '#qunit-fixture' ), - $target = $( '