From 4b31b71cfc637ecde8fd8be27cbb7b66a921867f Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Wed, 11 Dec 2013 00:05:26 +0100 Subject: [PATCH] Clean up existing code and pass jshint Coding style: * Avoid meaningless '_' in variable names, especially when used inconsistently. * Avoid trailing line comments. * Consistent if/else curly brace position. * Consistently use single quotes (there are no magic quotes in js). * Consistently use $ in variable names of jQuery-wrapped elements (as opposed to plain node references). * Avoid using variable names like '_this' or 'that', instead name them after the object. * Too many var statements. * Hoist var statement. * Fix alignment of closing parentheses in initEditPage. Code quality: * Remove commented out code. * Add missing radix parameter for parseInt. * Remove unused private function "printWithRunin". * Remove unused parameters. * Don't call "console.log" in production client-side code because the console doesn't always exist in normal browser modes (and would result in an Uncaught ReferenceError, aborting the script unexpectedly and leaving the user interface in a likely unresponsive state). * Use the Promise.done and Promise.fail handlers of mw.Api, instead of the deprecated 'ok' and 'err' parameters. * Use jQuery#on instead of the deprecated jQuery#bind. * Use a local shared reference to the singleton instead of relying on 'this' context, this way the methods can be called regardless of context. Such as in the $(document).ready(), or when passing around setErrors callback. * Avoid using invalid html shortcuts like
, use for creation, and .. for parsing (per style guide). * Document inputKeydown parameter being jQuery.Event (as oppposed to native Event). Misc: * Renamed '_in' to 'in', and renamed again to 'input' ('in' is an illegal variable name and would've crashed). Change-Id: I283fda1409b1e76db56a939183bdaefc95e60961 --- modules/ext.scribunto.edit.js | 231 ++++++++++++++++++---------------- modules/ext.scribunto.js | 51 ++++---- 2 files changed, 145 insertions(+), 137 deletions(-) diff --git a/modules/ext.scribunto.edit.js b/modules/ext.scribunto.edit.js index 08d36559..19db3e9b 100644 --- a/modules/ext.scribunto.edit.js +++ b/modules/ext.scribunto.edit.js @@ -12,12 +12,12 @@ */ var - histList = [""], + histList = [''], histPos = 0, question, - _in, - _out, - _$spinner, + input, + output, + $spinner, lastError = null, sessionContent = null, sessionKey = null, @@ -25,45 +25,55 @@ clearNextRequest = false; function refocus() { - _in.blur(); // Needed for Mozilla to scroll correctly. - _in.focus(); + // Needed for Mozilla to scroll correctly + input.blur(); + input.focus(); } function initConsole() { - _in = document.getElementById( "mw-scribunto-input" ); - _out = document.getElementById( "mw-scribunto-output" ); - _$spinner = $.createSpinner( { size: 'small', type: 'block' } ); + input = document.getElementById( 'mw-scribunto-input' ); + output = document.getElementById( 'mw-scribunto-output' ); + $spinner = $.createSpinner( { size: 'small', type: 'block' } ); recalculateInputHeight(); println( mw.msg( 'scribunto-console-intro' ), 'mw-scribunto-message' ); } + /** + * Use onkeydown because IE doesn't support onkeypress for arrow keys + * @param {jQuery.Event} e + */ function inputKeydown( e ) { - // Use onkeydown because IE doesn't support onkeypress for arrow keys + /*jshint noempty:false */ - if ( e.shiftKey && e.keyCode === 13 ) { // shift-enter + if ( e.shiftKey && e.keyCode === 13 ) { + // shift-enter // don't do anything; allow the shift-enter to insert a line break as normal - } else if ( e.keyCode === 13 ) { // enter + } else if ( e.keyCode === 13 ) { + // enter // execute the input on enter go(); - } else if ( e.keyCode === 38 ) { // up + } else if ( e.keyCode === 38 ) { + // up // go up in history if at top or ctrl-up - if ( e.ctrlKey || caretInFirstLine( _in ) ) { + if ( e.ctrlKey || caretInFirstLine( input ) ) { hist( 'up' ); } - } else if ( e.keyCode === 40 ) { // down + } else if ( e.keyCode === 40 ) { + // down // go down in history if at end or ctrl-down - if ( e.ctrlKey || caretInLastLine( _in ) ) { + if ( e.ctrlKey || caretInLastLine( input ) ) { hist( 'down' ); } } setTimeout( recalculateInputHeight, 0 ); - - //return true; } - function inputFocus( e ) { + /** + * @param {jQuery.Event} e + */ + function inputFocus() { if ( sessionContent === null ) { // No previous state to clear return; @@ -86,7 +96,7 @@ return true; } - var firstLineBreak = textbox.value.indexOf( "\n" ); + var firstLineBreak = textbox.value.indexOf( '\n' ); return ((firstLineBreak === -1) || (textbox.selectionStart <= firstLineBreak)); } @@ -97,44 +107,39 @@ return true; } - var lastLineBreak = textbox.value.lastIndexOf( "\n" ); + var lastLineBreak = textbox.value.lastIndexOf( '\n' ); return ( textbox.selectionEnd > lastLineBreak ); } function recalculateInputHeight() { - var rows = _in.value.split( /\n/ ).length - + 1 // prevent scrollbar flickering in Mozilla - + ( window.opera ? 1 : 0 ); // leave room for scrollbar in Opera + var rows = input.value.split( /\n/ ).length + + // prevent scrollbar flickering in Mozilla + 1 + + // leave room for scrollbar in Opera + ( window.opera ? 1 : 0 ); // without this check, it is impossible to select text in Opera 7.60 or Opera 8.0. - if ( _in.rows !== rows ) { - _in.rows = rows; + if ( input.rows !== rows ) { + input.rows = rows; } } function println( s, type ) { if ( ( s = String( s ) ) ) { - var newdiv = document.createElement( "div" ); + var newdiv = document.createElement( 'div' ); newdiv.appendChild( document.createTextNode( s ) ); newdiv.className = type; - _out.appendChild( newdiv ); + output.appendChild( newdiv ); return newdiv; } } - function printWithRunin( h, s, type ) { - var div = println( s, type ); - var head = document.createElement( "strong" ); - head.appendChild( document.createTextNode( h + ": " ) ); - div.insertBefore( head, div.firstChild ); - } - function printClearBar( msg ) { - $( '
' ) + $( '
' ) .attr( 'class', 'mw-scribunto-clear' ) .text( mw.msg( msg ) ) - .appendTo( _out ); + .appendTo( output ); } function hist( direction ) { @@ -152,7 +157,7 @@ if ( direction === 'up' ) { if ( histPos === L - 1 ) { // Save this entry in case the user hits the down key. - histList[histPos] = _in.value; + histList[histPos] = input.value; } if ( histPos > 0 ) { @@ -161,65 +166,68 @@ // Set to nothing first for the same reason setTimeout( function () { - _in.value = ''; - _in.value = histList[histPos]; - var caretPos = _in.value.length; - if ( _in.setSelectionRange ) { - _in.setSelectionRange( caretPos, caretPos ); + input.value = ''; + input.value = histList[histPos]; + var caretPos = input.value.length; + if ( input.setSelectionRange ) { + input.setSelectionRange( caretPos, caretPos ); } }, 0 ); } - } - else // down - { + } else { + // direction down if ( histPos < L - 1 ) { histPos++; - _in.value = histList[histPos]; + input.value = histList[histPos]; } else if ( histPos === L - 1 ) { // Already on the current entry: clear but save - if ( _in.value ) { - histList[histPos] = _in.value; + if ( input.value ) { + histList[histPos] = input.value; ++histPos; - _in.value = ""; + input.value = ''; } } } } function printQuestion( q ) { - println( q, "mw-scribunto-input" ); + println( q, 'mw-scribunto-input' ); } function printError( er ) { var lineNumberString; - lastError = er; // for debugging the shell + // for debugging the shell + lastError = er; if ( er.name ) { - // lineNumberString should not be "", to avoid a very wacky bug in IE 6. - lineNumberString = (er.lineNumber !== undefined) ? (" on line " + er.lineNumber + ": ") : ": "; + // lineNumberString should not be '', to avoid a very wacky bug in IE 6. + lineNumberString = (er.lineNumber !== undefined) ? (' on line ' + er.lineNumber + ': ') : ': '; // Because IE doesn't have error.toString. - println( er.name + lineNumberString + er.message, "mw-scribunto-error" ); + println( er.name + lineNumberString + er.message, 'mw-scribunto-error' ); } else { - println( er, "mw-scribunto-error" ); // Because security errors in Moz /only/ have toString. + // Because security errors in Moz /only/ have toString. + println( er, 'mw-scribunto-error' ); } } function setPending() { pending = true; - _in.readOnly = true; - _$spinner.insertBefore( _in ); + input.readOnly = true; + $spinner.insertBefore( input ); } function clearPending() { - _$spinner.remove(); + $spinner.remove(); pending = false; - _in.readOnly = false; + input.readOnly = false; } function go() { + var params, api, content, sentContent; + if ( pending ) { // If there is an XHR request pending, don't send another one // We set readOnly on the textarea to give a UI indication, this is @@ -227,35 +235,36 @@ return; } - question = _in.value; + question = input.value; - if ( question === "" ) { + if ( question === '' ) { return; } histList[histList.length - 1] = question; - histList[histList.length] = ""; + histList[histList.length] = ''; histPos = histList.length - 1; // Unfortunately, this has to happen *before* the script is run, so that // print() output will go in the right place. - _in.value = ''; + input.value = ''; // can't preventDefault on input, so also clear it later setTimeout( function () { - _in.value = ""; + input.value = ''; }, 0 ); recalculateInputHeight(); printQuestion( question ); - var params = { + params = { action: 'scribunto-console', title: mw.config.get( 'wgPageName' ), question: question }; - var content = getContent(); - var sentContent = false; + content = getContent(); + sentContent = false; + if ( !sessionKey || sessionContent !== content ) { params.clear = true; params.content = content; @@ -269,17 +278,17 @@ clearNextRequest = false; } - var api = new mw.Api(); + api = new mw.Api(); setPending(); - api.post( params, { - ok: function ( result ) { + api.post( params ) + .done( function ( result ) { if ( result.sessionIsNew === '' && !sentContent ) { // Session was lost. Resend query, with content printClearBar( 'scribunto-console-cleared-session-lost' ); sessionContent = null; clearPending(); - _in.value = params.question; + input.value = params.question; go(); return; } @@ -292,26 +301,24 @@ println( result.print, 'mw-scribunto-print' ); } if ( result['return'] !== '' ) { - println( result['return'], "mw-scribunto-normalOutput" ); + println( result['return'], 'mw-scribunto-normalOutput' ); } } clearPending(); setTimeout( refocus, 0 ); - }, - - err: function ( code, result ) { - if ( 'error' in result && 'info' in result.error ) { + } ) + .fail( function ( code, result ) { + if ( result.error && result.error.info ) { printError( result.error.info ); - } else if ( 'exception' in result ) { + } else if ( result.exception ) { printError( 'Error sending API request: ' + result.exception ); } else { - console.log( result ); + mw.log( result ); printError( 'error' ); } clearPending(); setTimeout( refocus, 0 ); - } - } ); + } ); } function getContent() { @@ -325,64 +332,68 @@ } } - function onClearClick( e ) { + /** + * @param {jQuery.Event} e + */ + function onClearClick() { $( '#mw-scribunto-output' ).empty(); clearNextRequest = true; refocus(); } mw.scribunto.edit = { - 'init': function () { + init: function () { var action = mw.config.get( 'wgAction' ); if ( action === 'edit' || action === 'submit' || action === 'editredlink' ) { this.initEditPage(); } }, - 'initEditPage': function () { + initEditPage: function () { var console = document.getElementById( 'mw-scribunto-console' ); if ( !console ) { return; } - $( '
' ) + $( '
' ) .attr( 'class', 'mw-scribunto-console-fieldset' ) - .append( $( '' ).text( mw.msg( 'scribunto-console-title' ) ) ) + .append( $( '' ).text( mw.msg( 'scribunto-console-title' ) ) ) .append( $( '
' ) ) .append( - $( '
' ).append( - $( '