Esanders has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/333807 )
Change subject: build: Replace jshint/jscs with eslint ...................................................................... build: Replace jshint/jscs with eslint Change-Id: Iaf792a6a4952439bc2ae6ff693dcbfee6218c47e --- A .eslintrc.json D .jscsrc D .jshintignore D .jshintrc M Gruntfile.js M package.json M resources/ext.tmh.OgvJsSupport.js M resources/ext.tmh.embedPlayerIframe.js M resources/ext.tmh.player.js M resources/ext.tmh.transcodetable.js M resources/mw.MediaWikiPlayerSupport.js M resources/mw.PopUpThumbVideo.js 12 files changed, 74 insertions(+), 117 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/TimedMediaHandler refs/changes/07/333807/1 diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..a29fd88 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,11 @@ +{ + "extends": "wikimedia", + "env": { + "browser": true, + "jquery": true + }, + "globals": { + "mediaWiki": false, + "OO": false + } +} diff --git a/.jscsrc b/.jscsrc deleted file mode 100644 index 4cf5f8b..0000000 --- a/.jscsrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "preset": "wikimedia", - "requireVarDeclFirst": null, - "requireMultipleVarDecl": null -} diff --git a/.jshintignore b/.jshintignore deleted file mode 100644 index 0b19ceb..0000000 --- a/.jshintignore +++ /dev/null @@ -1,8 +0,0 @@ -MwEmbedModules -resources/videojs -resources/videojs-resolution-switcher -resources/videojs-responsive-layout -resources/mw-info-button - -node_modules -vendor diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index a2125aa..0000000 --- a/.jshintrc +++ /dev/null @@ -1,44 +0,0 @@ -{ - /* Common */ - - // Enforcing - "camelcase": true, - "curly": true, - "eqeqeq": true, - "immed": true, - "latedef": "nofunc", - "newcap": true, - "noarg": true, - "noempty": true, - "nonew": true, - "quotmark": "single", - "trailing": true, - "undef": true, - "unused": true, - // Legacy - "onevar": true, - - /* Local */ - - // Enforcing - "bitwise": true, - "es3": true, - // Relaxing - "laxbreak": true, - "smarttabs": true, - "multistr": true, - // Environment - "browser": true, - // Legacy - "nomen": true, - - "globals": { - "mediaWiki": false, - "jQuery": false, - "OGVVersion": false, - "OGVSupport": false, - "OGVPlayer": false, - "OGVLoader": false, - "videojs": false - } -} diff --git a/Gruntfile.js b/Gruntfile.js index 2089bd6..32fe844 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,18 +1,14 @@ -/*jshint node:true */ +/* eslint-env node */ module.exports = function ( grunt ) { grunt.loadNpmTasks( 'grunt-banana-checker' ); grunt.loadNpmTasks( 'grunt-contrib-copy' ); - grunt.loadNpmTasks( 'grunt-contrib-jshint' ); + grunt.loadNpmTasks( 'grunt-eslint' ); grunt.loadNpmTasks( 'grunt-exec' ); - grunt.loadNpmTasks( 'grunt-jscs' ); grunt.loadNpmTasks( 'grunt-jsonlint' ); grunt.loadNpmTasks( 'grunt-patcher' ); grunt.initConfig( { - jshint: { - options: { - jshintrc: true - }, + eslint: { all: [ '**/*.js', '!MwEmbedModules/**', @@ -20,9 +16,6 @@ '!resources/mw-info-button/**', '!node_modules/**' ] - }, - jscs: { - src: '<%= jshint.all %>' }, banana: { all: 'i18n/', @@ -104,6 +97,6 @@ } ); grunt.registerTask( 'update-videojs', [ 'exec:npm-update-videojs', 'copy:video.js', 'copy:videojs-resolution-switcher', 'copy:videojs-ogvjs', 'copy:videojs-responsive-layout', 'copy:videojs-replay', 'patch:video.js' ] ); - grunt.registerTask( 'test', [ 'jshint', 'jscs', 'jsonlint', 'banana' ] ); + grunt.registerTask( 'test', [ 'eslint', 'jsonlint', 'banana' ] ); grunt.registerTask( 'default', 'test' ); }; diff --git a/package.json b/package.json index 4662f84..4bfc1db 100644 --- a/package.json +++ b/package.json @@ -5,14 +5,13 @@ }, "devDependencies": { "grunt": "1.0.1", + "eslint-config-wikimedia": "0.3.0", "grunt-banana-checker": "0.5.0", "grunt-contrib-copy": "^0.8.2", + "grunt-eslint": "19.0.0", "grunt-exec": "1.0.1", - "grunt-contrib-jshint": "1.0.0", "grunt-jsonlint": "1.1.0", - "grunt-jscs": "3.0.1", "grunt-patcher": "1.0.0", - "jscs-preset-wikimedia": "~1.0.0", "video.js": "^5.12.2", "videojs-ogvjs": "^1.3.1", "videojs-replay": "^1.1.0", diff --git a/resources/ext.tmh.OgvJsSupport.js b/resources/ext.tmh.OgvJsSupport.js index 7cd2097..1e306a6 100644 --- a/resources/ext.tmh.OgvJsSupport.js +++ b/resources/ext.tmh.OgvJsSupport.js @@ -1,3 +1,4 @@ +/* global OGVLoader */ ( function ( $, mw ) { var support = mw.OgvJsSupport = { @@ -75,10 +76,11 @@ * @return {AudioContext|null} */ initAudioContext: function () { - var AudioContext = window.AudioContext || window.webkitAudioContext; + var context, node, + AudioContext = window.AudioContext || window.webkitAudioContext; if ( AudioContext ) { - var context = new AudioContext(), - node; + context = new AudioContext(); + if ( context.createScriptProcessor ) { node = context.createScriptProcessor( 1024, 0, 2 ); } else if ( context.createJavaScriptNode ) { diff --git a/resources/ext.tmh.embedPlayerIframe.js b/resources/ext.tmh.embedPlayerIframe.js index fbef29f..e5ccc95 100644 --- a/resources/ext.tmh.embedPlayerIframe.js +++ b/resources/ext.tmh.embedPlayerIframe.js @@ -1,14 +1,14 @@ ( function ( mw, $ ) { - // only enable fullscreen if enabled in iframe - mw.setConfig( 'EmbedPlayer.EnableFullscreen', document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || false ); - - mw.setConfig( 'EmbedPlayer.IsIframeServer', true ); - var iframePlayerInit = function () { // rewrite player, normally done by mw.EmbedPlayer.loader upon wikipage.content hook var $players = $( mw.config.get( 'EmbedPlayer.RewriteSelector' ) ); $players.embedPlayer(); }; + // only enable fullscreen if enabled in iframe + mw.setConfig( 'EmbedPlayer.EnableFullscreen', document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || false ); + + mw.setConfig( 'EmbedPlayer.IsIframeServer', true ); + $( iframePlayerInit ); }( mediaWiki, jQuery ) ); diff --git a/resources/ext.tmh.player.js b/resources/ext.tmh.player.js index c01ac32..924171f 100755 --- a/resources/ext.tmh.player.js +++ b/resources/ext.tmh.player.js @@ -1,4 +1,4 @@ - +/* global videojs */ ( function ( $, mw, videojs ) { var globalConfig, audioConfig, playerConfig; @@ -15,7 +15,7 @@ plugins: { videoJsResolutionSwitcher: { sourceOrder: true, - customSourcePicker: function ( player, sources/*, label */ ) { + customSourcePicker: function ( player, sources/* , label */ ) { // Resolution switcher gets confused by preload=none on ogv.js if ( player.preload() === 'none' ) { player.preload( 'metadata' ); @@ -47,11 +47,13 @@ * Load video players for a jQuery collection */ function loadVideoPlayer() { - var videoplayer, $videoplayer, $collection = this; + var $collection = this; function loadSinglePlayer( index ) { - videoplayer = this; - $videoplayer = $( this ); + var i, l, preload, resolutions, playerHeight, defaultRes, + videoplayer = this, + $videoplayer = $( this ); + if ( $videoplayer.closest( '.video-js' ).size() ) { // This player has already been transformed. return; @@ -63,7 +65,7 @@ playerConfig = $.extend( true, {}, playerConfig, audioConfig ); } // Future interactions go faster if we've preloaded a little - var preload = 'metadata'; + preload = 'metadata'; if ( !mw.OgvJsSupport.canPlayNatively() ) { // ogv.js currently is expensive to start up: // https://github.com/brion/ogv.js/issues/438 @@ -74,19 +76,20 @@ preload = 'none'; } - var resolutions = []; + resolutions = []; $( videoplayer ).attr( { preload: preload } ).find( 'source' ).each( function () { // FIXME would be better if we can configure the plugin to make use of our preferred attributes - var $source = $( this ), + var matches, + $source = $( this ), transcodeKey = $source.data( 'transcodekey' ), res = parseInt( $source.data( 'height' ), 10 ), label = $source.data( 'shorttitle' ); if ( transcodeKey ) { - var matches = transcodeKey.match( /^(\d+)p\./ ); + matches = transcodeKey.match( /^(\d+)p\./ ); if ( matches ) { // Video derivative of fixed size. res = parseInt( matches[ 1 ], 10 ); @@ -104,12 +107,12 @@ // Pick the first resolution at least the size of the player, // unless they're all too small. - var playerHeight = $( videoplayer ).height(); + playerHeight = $( videoplayer ).height(); resolutions.sort( function ( a, b ) { return a - b; } ); - var defaultRes; - for ( var i = 0; i < resolutions.length; i++ ) { + defaultRes; + for ( i = 0, l = resolutions.length; i < l; i++ ) { defaultRes = resolutions[ i ]; if ( defaultRes >= playerHeight ) { break; @@ -152,4 +155,4 @@ $( '#videoContainer video,#videoContainer audio' ).loadVideoPlayer(); } ); -} )( jQuery, mediaWiki, videojs ); +}( jQuery, mediaWiki, videojs ) ); diff --git a/resources/ext.tmh.transcodetable.js b/resources/ext.tmh.transcodetable.js index f73d9ba..602be4a 100644 --- a/resources/ext.tmh.transcodetable.js +++ b/resources/ext.tmh.transcodetable.js @@ -1,16 +1,15 @@ /*! * Javascript to support transcode table on image page */ -/*global OO*/ ( function ( mw, $, OO ) { $( document ).ready( function () { function errorPopup( event ) { var tKey = $( event.target ).attr( 'data-transcodekey' ), message = $( [ - document.createTextNode( mw.msg( 'timedmedia-reset-explanation' ) ), - document.createElement( 'br' ), - document.createElement( 'br' ), - document.createTextNode( mw.msg( 'timedmedia-reset-areyousure' ) ) + document.createTextNode( mw.msg( 'timedmedia-reset-explanation' ) ), + document.createElement( 'br' ), + document.createElement( 'br' ), + document.createTextNode( mw.msg( 'timedmedia-reset-areyousure' ) ) ] ); event.preventDefault(); diff --git a/resources/mw.MediaWikiPlayerSupport.js b/resources/mw.MediaWikiPlayerSupport.js index 3993913..06316ba 100644 --- a/resources/mw.MediaWikiPlayerSupport.js +++ b/resources/mw.MediaWikiPlayerSupport.js @@ -17,12 +17,14 @@ /** * Closure function wraps mediaWiki embedPlayer bindings + * + * @param {Object} embedPlayer */ mw.addMediaWikiPlayerSupport = function ( embedPlayer ) { var apiTitleKey, apiProvider, $creditsCache = false; // Set some local variables: if ( !embedPlayer[ 'data-mwtitle' ] ) { - return false; + return; } else { apiTitleKey = embedPlayer[ 'data-mwtitle' ]; // legacy support ( set as attribute ) @@ -57,18 +59,18 @@ for ( i in data.query.pages ) { if ( i === '-1' ) { callback( false ); - return ; + return; } page = data.query.pages[ i ]; } } else { callback( false ); - return ; + return; } // Make sure we have imageinfo: if ( !page.imageinfo || !page.imageinfo[ 0 ] ) { callback( false ); - return ; + return; } imageinfo = page.imageinfo[ 0 ]; @@ -150,7 +152,7 @@ $links.each( function ( i, authorLink ) { $authorLink = $( authorLink ); authUrl = $authorLink.attr( 'href' ); - authUrl = mw.absoluteUrl( authUrl, articleUrl ); + authUrl = mw.absoluteUrl( authUrl, articleUrl ); $authorLink.attr( 'href', authUrl ); } ); } @@ -167,7 +169,7 @@ // remove white space: $date.find( 'br' ).remove(); - $creditLine.append( $( '<br />' ), + $creditLine.append( $( '<br />' ), mw.msg( 'mwe-embedplayer-credit-date', $date.html() ) ); } @@ -198,6 +200,9 @@ /** * Issues a request to populate the credits box + * + * @param {jQuery} $target + * @param {Function} callback */ function showCredits( $target, callback ) { var apiUrl, fileTitle, request; @@ -238,7 +243,7 @@ $( embedPlayer ).bindQueueCallback( 'showCredits', function ( $target, callback ) { if ( $target.data( 'playerId' ) !== embedPlayer.id ) { // bad event trigger - return ; + return; } // Only request the credits once: showCredits( $target, callback ); @@ -246,17 +251,18 @@ // Show credits on clip complete: $( embedPlayer ).bind( 'onEndedDone', function ( event, id ) { + var cb; if ( embedPlayer.id !== id ) { // possible event trigger error. ( skip ) - return ; + return; } // dont show credits for audio elements, // seek to begining instead if ( embedPlayer.isAudio() ) { embedPlayer.setCurrentTime( 0 ); - return ; + return; } - var cb = embedPlayer.controlBuilder; + cb = embedPlayer.controlBuilder; cb.checkMenuOverlay(); cb.showMenuOverlay(); cb.showMenuItem( 'credits' ); @@ -264,7 +270,7 @@ $( embedPlayer ).bind( 'showInlineDownloadLink', function () { // Add recommend HTML5 player if we have non-native playback: - if ( embedPlayer.controlBuilder.checkNativeWarning( ) ) { + if ( embedPlayer.controlBuilder.checkNativeWarning() ) { embedPlayer.controlBuilder.addWarningBinding( 'EmbedPlayer.ShowNativeWarning', mw.msg( 'mwe-embedplayer-for_best_experience', @@ -294,12 +300,12 @@ // check if not already there: if ( $menu.find( '.add-timed-text' ).length ) { // add text link already present - return ; + return; } pageTitle = 'TimedText:' + decodeURIComponent( embedPlayer.apiTitleKey ).replace( /^File:|^Image:/, '' ); - addTextPage = mw.getApiProviderURL( apiProvider ) + addTextPage = mw.getApiProviderURL( apiProvider ) .replace( 'api.php', 'index.php' ) + '?title=' + encodeURIComponent( pageTitle ); @@ -329,12 +335,13 @@ } } ); $( mw ).bindQueueCallback( 'TimedText_LoadTextSource', function ( source, callback ) { + var apiUrl, request; if ( !source.mwtitle || !source.mwprovider ) { callback(); - return ; + return; } // Load via api - var apiUrl = mw.getApiProviderURL( source.mwprovider ), + apiUrl = mw.getApiProviderURL( source.mwprovider ), // Get the image page ( cache for 1 hour ) request = { action: 'parse', @@ -343,10 +350,10 @@ maxage: 3600 }; mw.getJSON( apiUrl, request, function ( data ) { - if ( data && data.parse && data.parse.text && data.parse.text[ '*' ] ) { + if ( data && data.parse && data.parse.text && data.parse.text[ '*' ] ) { source.loaded = true; source.mimeType = 'text/mw-srt'; - source.captions = source.getCaptions( data.parse.text[ '*' ] ); + source.captions = source.getCaptions( data.parse.text[ '*' ] ); callback(); } else { mw.log( 'Error: MediaWiki api error in getting timed text:', data ); @@ -356,17 +363,17 @@ } ); $( embedPlayer ).bind( 'getShareIframeSrc', function ( event, callback, id ) { + var iframeUrl = false; if ( id !== embedPlayer.id ) { embedPlayer = $( '#' + id )[ 0 ]; } - var iframeUrl = false; // Do a special check for wikimediacommons provider as a known shared reop if ( embedPlayer[ 'data-mwprovider' ] === 'wikimediacommons' ) { iframeUrl = '//commons.wikimedia.org/wiki/File:' + decodeURIComponent( embedPlayer.apiTitleKey ).replace( /^(File:|Image:)/, '' ); } else { // use the local wiki: if ( mw.config.get( 'wgServer' ) && mw.config.get( 'wgArticlePath' ) ) { - iframeUrl = mw.config.get( 'wgServer' ) + + iframeUrl = mw.config.get( 'wgServer' ) + mw.config.get( 'wgArticlePath' ).replace( /\$1/, 'File:' + decodeURIComponent( embedPlayer.apiTitleKey ).replace( /^(File:|Image:)/, '' ) ); } diff --git a/resources/mw.PopUpThumbVideo.js b/resources/mw.PopUpThumbVideo.js index ea0ad7a..78a814e 100644 --- a/resources/mw.PopUpThumbVideo.js +++ b/resources/mw.PopUpThumbVideo.js @@ -7,7 +7,7 @@ var link, title, parent = $( this ).parent(); if ( parent.attr( 'videopayload' ) ) { - $( this ).click( function ( /*event*/ ) { + $( this ).click( function ( /* event*/ ) { var thisref = this; mw.loader.using( 'mw.MwEmbedSupport', function () { -- To view, visit https://gerrit.wikimedia.org/r/333807 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iaf792a6a4952439bc2ae6ff693dcbfee6218c47e Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/TimedMediaHandler Gerrit-Branch: master Gerrit-Owner: Esanders <esand...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits