diff --git a/includes/Minerva.hooks.php b/includes/Minerva.hooks.php index 61b1995..bb14af4 100644 --- a/includes/Minerva.hooks.php +++ b/includes/Minerva.hooks.php @@ -91,9 +91,11 @@ class MinervaHooks { 'targets' => [ 'mobile', 'desktop' ], 'scripts' => [ // additional scaffolding (minus initialisation scripts) + 'resources/skins.minerva.scripts/utils.js', 'resources/skins.minerva.scripts/DownloadIcon.js', // test files 'tests/qunit/skins.minerva.scripts/test_DownloadIcon.js', + 'tests/qunit/skins.minerva.scripts/test_utils.js', 'tests/qunit/skins.minerva.notifications.badge/test_NotificationBadge.js' ], ]; diff --git a/resources/skins.minerva.icons.images.scripts/issue-content.svg b/resources/skins.minerva.icons.images.scripts/issue-content.svg new file mode 100644 index 0000000..78694c5 --- /dev/null +++ b/resources/skins.minerva.icons.images.scripts/issue-content.svg @@ -0,0 +1 @@ +ambox-content \ No newline at end of file diff --git a/resources/skins.minerva.icons.images.scripts/issue-default.svg b/resources/skins.minerva.icons.images.scripts/issue-default.svg new file mode 100644 index 0000000..95373c6 --- /dev/null +++ b/resources/skins.minerva.icons.images.scripts/issue-default.svg @@ -0,0 +1 @@ +ambox-default \ No newline at end of file diff --git a/resources/skins.minerva.icons.images.scripts/issue-delete.svg b/resources/skins.minerva.icons.images.scripts/issue-delete.svg new file mode 100644 index 0000000..86d6aaa --- /dev/null +++ b/resources/skins.minerva.icons.images.scripts/issue-delete.svg @@ -0,0 +1 @@ +ambox-speedy \ No newline at end of file diff --git a/resources/skins.minerva.icons.images.scripts/issue-move.svg b/resources/skins.minerva.icons.images.scripts/issue-move.svg new file mode 100644 index 0000000..a273342 --- /dev/null +++ b/resources/skins.minerva.icons.images.scripts/issue-move.svg @@ -0,0 +1 @@ +ambox-move \ No newline at end of file diff --git a/resources/skins.minerva.icons.images.scripts/issue-pov.svg b/resources/skins.minerva.icons.images.scripts/issue-pov.svg new file mode 100644 index 0000000..088b5c7 --- /dev/null +++ b/resources/skins.minerva.icons.images.scripts/issue-pov.svg @@ -0,0 +1 @@ +ambox-content.ambox-pov \ No newline at end of file diff --git a/resources/skins.minerva.icons.images.scripts/issue-protection.svg b/resources/skins.minerva.icons.images.scripts/issue-protection.svg new file mode 100644 index 0000000..b3bb12e --- /dev/null +++ b/resources/skins.minerva.icons.images.scripts/issue-protection.svg @@ -0,0 +1 @@ +ambox-protection \ No newline at end of file diff --git a/resources/skins.minerva.icons.images.scripts/issue-speedy.svg b/resources/skins.minerva.icons.images.scripts/issue-speedy.svg new file mode 100644 index 0000000..86d6aaa --- /dev/null +++ b/resources/skins.minerva.icons.images.scripts/issue-speedy.svg @@ -0,0 +1 @@ +ambox-speedy \ No newline at end of file diff --git a/resources/skins.minerva.icons.images.scripts/issue-style.svg b/resources/skins.minerva.icons.images.scripts/issue-style.svg new file mode 100644 index 0000000..ef90285 --- /dev/null +++ b/resources/skins.minerva.icons.images.scripts/issue-style.svg @@ -0,0 +1 @@ +ambox-style \ No newline at end of file diff --git a/resources/skins.minerva.scripts/cleanuptemplates.js b/resources/skins.minerva.scripts/cleanuptemplates.js index 0b69898..c9a934c 100644 --- a/resources/skins.minerva.scripts/cleanuptemplates.js +++ b/resources/skins.minerva.scripts/cleanuptemplates.js @@ -3,6 +3,8 @@ ( function () { var action = mw.config.get( 'wgAction' ), page = M.getCurrentPage(), + getIconFromAmbox = M.require( 'skins.minerva.scripts/utils' ) + .getIconFromAmbox, overlayManager = M.require( 'skins.minerva.scripts/overlayManager' ), CleanupOverlay = M.require( 'mobile.issues/CleanupOverlay' ); @@ -11,7 +13,10 @@ * friendly for mobile display. * @param {Object} $box element to extract the message from * @ignore - * @return {string} html of message. + * @typedef {object} IssueSummary + * @prop {string} icon HTML string. + * @prop {string} text HTML string. + * @return {IssueSummary} */ function extractMessage( $box ) { var selector = '.mbox-text, .ambox-text', @@ -28,7 +33,10 @@ $( '

' ).html( contents ).appendTo( $container ); } } ); - return $container.html(); + return { + icon: getIconFromAmbox( $box ).toHtmlString(), + text: $container.html() + }; } /** @@ -61,16 +69,12 @@ $metadata.find( '.NavFrame' ).remove(); $metadata.each( function () { - var content, + var issue, $this = $( this ); if ( $this.find( selector ).length === 0 ) { - content = extractMessage( $this ); - if ( content ) { - issues.push( { - text: content - } ); - } + issue = extractMessage( $this ); + issues.push( issue ); } } ); diff --git a/resources/skins.minerva.scripts/utils.js b/resources/skins.minerva.scripts/utils.js new file mode 100644 index 0000000..834649a --- /dev/null +++ b/resources/skins.minerva.scripts/utils.js @@ -0,0 +1,44 @@ +( function ( M ) { + + var Icon = M.require( 'mobile.startup/Icon' ); + + function getIconFromAmbox( $box ) { + var glyph, + names = [ + 'speedy', + 'delete', + 'protection', + 'pov', + 'move', + 'style', + 'content' + ]; + + // since objects have no concept of ordering we repeat ourselves here + names.forEach( function ( name ) { + if ( !glyph && $box.hasClass( 'ambox-' + name ) ) { + // with a match, exit + glyph = name; + } + } ); + + glyph = glyph || 'default'; + return new Icon( { + glyphPrefix: 'minerva', + name: 'issue-' + glyph + } ); + } + + /** + * @module skins.minerva.scripts/utils + */ + M.define( 'skins.minerva.scripts/utils', { + /** + * Extract an icon for use with the issue. + * @param {jQuery.Object} $box element to extract the icon from + * @return {Icon} representing the icon + */ + getIconFromAmbox: getIconFromAmbox + } ); + +}( mw.mobileFrontend ) ); diff --git a/skin.json b/skin.json index 6402410..27e31ef 100644 --- a/skin.json +++ b/skin.json @@ -168,6 +168,14 @@ "class": "ResourceLoaderImageModule", "selector": ".mw-ui-icon-minerva-{name}:before", "images": { + "issue-speedy": "resources/skins.minerva.icons.images.scripts/issue-speedy.svg", + "issue-delete": "resources/skins.minerva.icons.images.scripts/issue-delete.svg", + "issue-protection": "resources/skins.minerva.icons.images.scripts/issue-protection.svg", + "issue-default": "resources/skins.minerva.icons.images.scripts/issue-default.svg", + "issue-pov": "resources/skins.minerva.icons.images.scripts/issue-pov.svg", + "issue-style": "resources/skins.minerva.icons.images.scripts/issue-style.svg", + "issue-content": "resources/skins.minerva.icons.images.scripts/issue-content.svg", + "issue-move": "resources/skins.minerva.icons.images.scripts/issue-move.svg", "download": "resources/skins.minerva.icons.images.scripts/download.svg" } }, @@ -279,6 +287,7 @@ "resources/skins.minerva.scripts/mobileRedirect.js", "resources/skins.minerva.scripts/search.js", "resources/skins.minerva.scripts/references.js", + "resources/skins.minerva.scripts/utils.js", "resources/skins.minerva.scripts/cleanuptemplates.js" ] }, diff --git a/tests/qunit/skins.minerva.scripts/test_utils.js b/tests/qunit/skins.minerva.scripts/test_utils.js new file mode 100644 index 0000000..3fa4490 --- /dev/null +++ b/tests/qunit/skins.minerva.scripts/test_utils.js @@ -0,0 +1,47 @@ +( function ( M ) { + var utils = M.require( 'skins.minerva.scripts/utils' ), + getIconFromAmbox = utils.getIconFromAmbox; + + QUnit.module( 'Minerva utils' ); + QUnit.test( 'getIconFromAmbox', function ( assert ) { + var tests = [ + [ + '', 'issue-default' + ], + [ + 'ambox', 'issue-default' + ], + [ + 'ambox-content ambox-speedy', 'issue-speedy' + ], + [ + 'ambox-content ambox-delete', 'issue-delete' + ], + [ + 'ambox-content', 'issue-content' + ], + [ + 'ambox-content ambox-pov', 'issue-pov' + ], + [ + 'ambox-content ambox-style', 'issue-style' + ], + [ + 'ambox-content ambox-move', 'issue-move' + ], + [ + 'ambox-content ambox-protection', 'issue-protection' + ] + ]; + tests.forEach( function ( test, i ) { + var $box = $( '

' ); + $box.addClass( test[0] ); + assert.strictEqual( + getIconFromAmbox( $box ).options.name, + test[1], + i + ); + } ); + } ); + +}( mw.mobileFrontend ) );