WMDE-leszek has submitted this change and it was merged. Change subject: Create module for Revision type. ......................................................................
Create module for Revision type. This pulls out some of the code around revisions into a decoupled and tested module. Change-Id: Ib2a4f96f0e0b9a96ec85d300d97cd52dcaffe89e --- M RevisionSlider.hooks.php M extension.json A modules/ext.RevisionSlider.Revision.js M modules/ext.RevisionSlider.init.js A tests/RevisionSlider.Revision.test.js 5 files changed, 136 insertions(+), 22 deletions(-) Approvals: WMDE-Fisch: Verified; Looks good to me, but someone else must approve WMDE-leszek: Verified; Looks good to me, approved jenkins-bot: Verified diff --git a/RevisionSlider.hooks.php b/RevisionSlider.hooks.php index 0efe5a3..2c9246a 100755 --- a/RevisionSlider.hooks.php +++ b/RevisionSlider.hooks.php @@ -17,4 +17,18 @@ private static function isRevisionPage( WebRequest $request ) { return $request->getVal( 'action' ) === 'history' || $request->getVal( 'type' ) === 'revision'; } + + public static function onResourceLoaderTestModules( array &$testModules, ResourceLoader $rl ) { + $testModules['qunit']['ext.RevisionSlider.tests'] = [ + 'scripts' => [ + 'tests/RevisionSlider.Revision.test.js', + ], + 'dependencies' => [ + 'ext.RevisionSlider.Revision' + ], + 'localBasePath' => __DIR__, + ]; + + return true; + } } diff --git a/extension.json b/extension.json index 9f77063..d67f149 100755 --- a/extension.json +++ b/extension.json @@ -27,6 +27,7 @@ "modules/ext.RevisionSlider.css" ], "dependencies": [ + "ext.RevisionSlider.Revision", "ext.RevisionSlider.rainbow", "ext.RevisionSlider.fetchRevisions" ], @@ -41,6 +42,11 @@ "scripts": [ "modules/ext.RevisionSlider.fetchRevisions.js" ] + }, + "ext.RevisionSlider.Revision": { + "scripts": [ + "modules/ext.RevisionSlider.Revision.js" + ] } }, "ResourceFileModulePaths": { @@ -49,6 +55,9 @@ "Hooks": { "BeforePageDisplay": [ "RevisionSliderHooks::onBeforePageDisplay" + ], + "ResourceLoaderTestModules": [ + "RevisionSliderHooks::onResourceLoaderTestModules" ] } } diff --git a/modules/ext.RevisionSlider.Revision.js b/modules/ext.RevisionSlider.Revision.js new file mode 100644 index 0000000..b8202a8 --- /dev/null +++ b/modules/ext.RevisionSlider.Revision.js @@ -0,0 +1,72 @@ +( function ( mw, $ ) { + + var Revision = function ( data ) { + this.size = data.size; + this.comment = data.comment; + this.parsedComment = data.parsedcomment; + this.timestamp = data.timestamp; + this.user = data.user; + }; + + $.extend( Revision.prototype, { + /** + * @type {int} + */ + size: 0, + + /** + * @type {string} + */ + comment: '', + + /** + * @type {string} + */ + parsedComment: '', + + /** + * @type {string} + */ + timestamp: '', + + /** + * @type {string} + */ + user: '', + + getSize: function () { + return this.size; + }, + + getParsedComment: function () { + return this.parsedComment; + }, + + getComment: function () { + return this.comment; + }, + + formatDate: function ( rawDate ) { + var MONTHS = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec' ], + f = new Date( rawDate ), + fDate = f.getUTCDate(), + fMonth = f.getUTCMonth(), + fYear = f.getUTCFullYear(), + fHours = ( '0' + f.getUTCHours() ).slice( -2 ), + fMinutes = ( '0' + f.getUTCMinutes() ).slice( -2 ); + + return fHours + ':' + fMinutes + ', ' + fDate + ' ' + MONTHS[ fMonth ] + ' ' + fYear; + }, + + getFormattedDate: function () { + return this.formatDate( this.timestamp ); + }, + + getUser: function () { + return this.user; + } + } ); + + mw.libs.revisionSlider = mw.libs.revisionSlider || {}; + mw.libs.revisionSlider.Revision = Revision; +}( mediaWiki, jQuery ) ); diff --git a/modules/ext.RevisionSlider.init.js b/modules/ext.RevisionSlider.init.js index 4798bcd..1189408 100755 --- a/modules/ext.RevisionSlider.init.js +++ b/modules/ext.RevisionSlider.init.js @@ -17,19 +17,6 @@ // location.href = $url; // } - // Formating date in JS - function formatDate( rawDate ) { - var months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec' ], - f = new Date( rawDate ), - fDate = f.getUTCDate(), - fMonth = f.getUTCMonth(), - fYear = f.getUTCFullYear(), - fHours = ( '0' + f.getUTCHours() ).slice( -2 ), - fMinutes = ( '0' + f.getUTCMinutes() ).slice( -2 ); - - return ( fHours + ':' + fMinutes + ', ' + fDate + ' ' + months[ fMonth ] + ' ' + fYear ).toString(); - } - function getSection( text ) { text = text.match( new RegExp( '(/\\* [^\\*]* \\*/)', 'gi' ) @@ -53,8 +40,8 @@ sectionName; for ( i = 1; i < revs.length; i++ ) { - changeSize = Math.abs( revs[ i ].size - revs[ i - 1 ].size ); - section = getSection( revs[ i ].comment ); + changeSize = Math.abs( revs[ i ].getSize() - revs[ i - 1 ].getSize() ); + section = getSection( revs[ i ].getComment() ); if ( changeSize > max ) { max = changeSize; } @@ -86,14 +73,14 @@ i, diffSize, relativeChangeSize, section, html; for ( i = 1; i < revs.length; i++ ) { - diffSize = revs[ i ].size - revs[ i - 1 ].size; + diffSize = revs[ i ].getSize() - revs[ i - 1 ].getSize(); relativeChangeSize = Math.ceil( 65.0 * Math.log( Math.abs( diffSize ) ) / maxChangeSizeLogged ) + 5; - section = getSection( revs[ i ].comment ); - html = '<b>' + formatDate( revs[ i ].timestamp ) + '</b><br>'; + section = getSection( revs[ i ].getComment() ); + html = '<b>' + revs[ i ].getFormattedDate() + '</b><br>'; - html += mw.html.escape( revs[ i ].user ) + '<br>'; - if ( revs[ i ].comment !== '' ) { - html += '<br><i>' + mw.html.escape( revs[ i ].parsedcomment ) + '</i>'; + html += mw.html.escape( revs[ i ].getUser() ) + '<br>'; + if ( revs[ i ].getComment() !== '' ) { + html += '<br><i>' + mw.html.escape( revs[ i ].getParsedComment() ) + '</i>'; } html += '<br>' + diffSize + ' byte'; @@ -201,6 +188,17 @@ return ( ( numberOfTicks >= maxNumberOfTicks ? maxNumberOfTicks : numberOfTicks ) * maxWidthPerTick ); } + function initializeRevs( revs ) { + var revisions = [], + i; + + for ( i = 0; i < revs.length; i++ ) { + revisions.push( new mw.libs.revisionSlider.Revision( revs[ i ] ) ); + } + + return revisions; + } + function addSlider( revs ) { var $revisions = $( '<div class="revisions"></div>' ).css( 'width', revs.length * revisionWidth ), $leftPointer = $( '<div class="pointer left-pointer" />' ), @@ -298,7 +296,7 @@ } revs.reverse(); - addSlider( revs ); + addSlider( initializeRevs( revs ) ); } } ); } ); diff --git a/tests/RevisionSlider.Revision.test.js b/tests/RevisionSlider.Revision.test.js new file mode 100644 index 0000000..45b09fb --- /dev/null +++ b/tests/RevisionSlider.Revision.test.js @@ -0,0 +1,21 @@ +(function ( mw, $ ) { + QUnit.module( 'ext.RevisionSlider.Revision' ); + + QUnit.test( 'create Revision', function ( assert ) { + var data = { + size: 5, + comment: 'hello', + parsedcomment: '<b>hello</b>', + timestamp: '2016-04-26T10:27:14Z', // 10:27, 26 Apr 2016 + user: 'meh' + }, + rev = new mw.libs.revisionSlider.Revision( data ); + + assert.equal( rev.getSize(), data.size ); + assert.equal( rev.getComment(), data.comment ); + assert.equal( rev.getParsedComment(), data.parsedcomment ); + assert.equal( rev.getFormattedDate(), '10:27, 26 Apr 2016' ); + assert.equal( rev.getUser(), data.user ); + } ); + +})( mediaWiki, jQuery ); -- To view, visit https://gerrit.wikimedia.org/r/285923 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ib2a4f96f0e0b9a96ec85d300d97cd52dcaffe89e Gerrit-PatchSet: 3 Gerrit-Project: mediawiki/extensions/RevisionSlider Gerrit-Branch: master Gerrit-Owner: Jakob <jakob.warkot...@wikimedia.de> Gerrit-Reviewer: Addshore <addshorew...@gmail.com> Gerrit-Reviewer: WMDE-Fisch <christoph.fisc...@wikimedia.de> Gerrit-Reviewer: WMDE-leszek <leszek.mani...@wikimedia.de> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits