http://www.mediawiki.org/wiki/Special:Code/MediaWiki/90918

Revision: 90918
Author:   salvatoreingala
Date:     2011-06-27 22:52:59 +0000 (Mon, 27 Jun 2011)
Log Message:
-----------
Added delivering of user-defined messages with proper prefix.
Messages for preferences of gadget 'foo' are stored as MediaWiki:Gadget-foo-*.

Modified Paths:
--------------
    branches/salvatoreingala/Gadgets/Gadgets.php
    branches/salvatoreingala/Gadgets/backend/GadgetHooks.php
    branches/salvatoreingala/Gadgets/backend/GadgetPrefs.php
    branches/salvatoreingala/Gadgets/ui/resources/ext.gadgets.preferences.js
    branches/salvatoreingala/Gadgets/ui/resources/jquery.formBuilder.js

Modified: branches/salvatoreingala/Gadgets/Gadgets.php
===================================================================
--- branches/salvatoreingala/Gadgets/Gadgets.php        2011-06-27 22:43:27 UTC 
(rev 90917)
+++ branches/salvatoreingala/Gadgets/Gadgets.php        2011-06-27 22:52:59 UTC 
(rev 90918)
@@ -82,18 +82,3 @@
        'localBasePath' => $dir . 'ui/resources/',
        'remoteExtPath' => 'Gadgets/ui/resources'
 );
-
-$wgResourceModules['ext.gadgets.preferences'] = array(
-       'scripts'               => array( 'ext.gadgets.preferences.js' ),
-       'styles'        => array( 'ext.gadgets.preferences.css' ),
-       'dependencies'  => array(
-               'jquery', 'jquery.json', 'jquery.ui.dialog', 
'jquery.formBuilder',
-               'mediawiki.htmlform', 'ext.gadgets'
-       ),
-       'messages'      => array(
-               'gadgets-configure', 'gadgets-configuration-of', 
'gadgets-prefs-save', 'gadgets-prefs-cancel',
-               'gadgets-unexpected-error', 'gadgets-save-success', 
'gadgets-save-failed'
-       ),
-       'localBasePath' => $dir . 'ui/resources/',
-       'remoteExtPath' => 'Gadgets/ui/resources'
-);

Modified: branches/salvatoreingala/Gadgets/backend/GadgetHooks.php
===================================================================
--- branches/salvatoreingala/Gadgets/backend/GadgetHooks.php    2011-06-27 
22:43:27 UTC (rev 90917)
+++ branches/salvatoreingala/Gadgets/backend/GadgetHooks.php    2011-06-27 
22:52:59 UTC (rev 90918)
@@ -102,12 +102,50 @@
                if ( !$gadgets ) {
                        return true;
                }
+               
+               wfProfileIn( __METHOD__ );
+
+               //Recover messages for gadget preferences
+               $messages = array();
+               foreach ( $gadgets as $gadget ) {
+                       $prefsDescription = $gadget->getPrefsDescription();
+                       if ( $prefsDescription !== null ) {
+                               $msgs = GadgetPrefs::getMessages( 
$prefsDescription );
+                               
+                               //Adds a prefix to messages of each gadget
+                               foreach( $msgs as $idx => $val ) {
+                                       $messages[] = 
"Gadget-{$gadget->getName()}-" . $msgs[$idx];
+                               }
+                       }
+               }
+               
+               //Register the ext.gadgets.preferences module
+               //TODO: fix caching issues for user-defined messages
+               $resourceLoader->register( 'ext.gadgets.preferences', array(
+                       'scripts'               => array( 
'ext.gadgets.preferences.js' ),
+                       'styles'        => array( 'ext.gadgets.preferences.css' 
),
+                       'dependencies'  => array(
+                               'jquery', 'jquery.json', 'jquery.ui.dialog', 
'jquery.formBuilder',
+                               'mediawiki.htmlform', 'ext.gadgets'
+                       ),
+                       'messages'      => array_merge( $messages, array(
+                               'gadgets-configure', 
'gadgets-configuration-of', 'gadgets-prefs-save', 'gadgets-prefs-cancel',
+                               'gadgets-unexpected-error', 
'gadgets-save-success', 'gadgets-save-failed'
+                       ) ),
+                       'localBasePath' => dirname( dirname( __FILE__ ) ) . 
'/ui/resources/',
+                       'remoteExtPath' => 'Gadgets/ui/resources'
+               ) );
+
+               //Register gadgets modules
                foreach ( $gadgets as $g ) {
                        $module = $g->getModule();
                        if ( $module ) {
                                $resourceLoader->register( $g->getModuleName(), 
$module );
                        }
                }
+               
+               wfProfileOut( __METHOD__ );
+
                return true;
        }
 
@@ -120,17 +158,17 @@
                
                wfProfileIn( __METHOD__ );
 
-               //tweaks in Special:Preferences
-               if ( $out->getTitle()->isSpecial( 'Preferences' ) ) {
-                       $out->addModules( 'ext.gadgets.preferences' );
-               }
-
                $gadgets = Gadget::loadList();
                if ( !$gadgets ) {
                        wfProfileOut( __METHOD__ );
                        return true;
                }
 
+               //tweaks in Special:Preferences
+               if ( $out->getTitle()->isSpecial( 'Preferences' ) ) {
+                       $out->addModules( 'ext.gadgets.preferences' );
+               }
+
                $lb = new LinkBatch();
                $lb->setCaller( __METHOD__ );
                $pages = array();
@@ -155,6 +193,7 @@
                        $done[$page] = true;
                        self::applyScript( $page, $out );
                }
+
                wfProfileOut( __METHOD__ );
 
                return true;

Modified: branches/salvatoreingala/Gadgets/backend/GadgetPrefs.php
===================================================================
--- branches/salvatoreingala/Gadgets/backend/GadgetPrefs.php    2011-06-27 
22:43:27 UTC (rev 90917)
+++ branches/salvatoreingala/Gadgets/backend/GadgetPrefs.php    2011-06-27 
22:52:59 UTC (rev 90918)
@@ -376,4 +376,49 @@
                }
        }
        
+       /**
+        * Returns true if $str should be interpreted as a message, false 
otherwise.
+        * 
+        * @param $str String
+        * @return Mixed
+        * 
+        */
+       private static function isMessage( $str ) {
+               return strlen( $str ) >= 2
+                       && $str[0] == '@'
+                       && $str[1] != '@';
+       }
+       
+       /**
+        * Returns a list of (unprefixed) messages mentioned by 
$prefsDescription. It is assumed that
+        * $prefsDescription is valid (i.e.: 
GadgetPrefs::isPrefsDescriptionValid( $prefsDescription ) === true).
+        * 
+        * @param $prefsDescription Array: the preferences description to use.
+        * @return Array: the messages needed by $prefsDescription.
+        */
+       public static function getMessages( $prefsDescription ) {
+               $maybeMsgs = array();
+               
+               if ( isset( $prefsDescription['intro'] ) ) {
+                       $maybeMsgs[] = $prefsDescription['intro'];
+               }
+               
+               foreach ( $prefsDescription['fields'] as $prefName => $prefDesc 
) {
+                       $maybeMsgs[] = $prefDesc['label'];
+                       
+                       if ( $prefDesc['type'] == 'select' ) {
+                               foreach ( $prefDesc['options'] as $optName => 
$value ) {
+                                       $maybeMsgs[] = $optName;
+                               }
+                       }
+               }
+               
+               $msgs = array();
+               foreach ( $maybeMsgs as $msg ) {
+                       if ( self::isMessage( $msg ) ) {
+                               $msgs[] = substr( $msg, 1 );
+                       }
+               }
+               return array_unique( $msgs );
+       }
 }

Modified: 
branches/salvatoreingala/Gadgets/ui/resources/ext.gadgets.preferences.js
===================================================================
--- branches/salvatoreingala/Gadgets/ui/resources/ext.gadgets.preferences.js    
2011-06-27 22:43:27 UTC (rev 90917)
+++ branches/salvatoreingala/Gadgets/ui/resources/ext.gadgets.preferences.js    
2011-06-27 22:52:59 UTC (rev 90918)
@@ -66,7 +66,9 @@
                                                        
                                                        var prefs = 
response.getgadgetprefs;
                                                        
-                                                       var dialogBody = $( 
prefs ).formBuilder();
+                                                       var dialogBody = $( 
prefs ).formBuilder( {
+                                                               gadget: gadget
+                                                       } );
                                                        
                                                        $( dialogBody ).submit( 
function() {
                                                                return false; 
//prevent form submission

Modified: branches/salvatoreingala/Gadgets/ui/resources/jquery.formBuilder.js
===================================================================
--- branches/salvatoreingala/Gadgets/ui/resources/jquery.formBuilder.js 
2011-06-27 22:43:27 UTC (rev 90917)
+++ branches/salvatoreingala/Gadgets/ui/resources/jquery.formBuilder.js 
2011-06-27 22:52:59 UTC (rev 90918)
@@ -12,14 +12,14 @@
        //If str starts with "@" the rest of the string is assumed to be
        //a message, and the result of mw.msg is returned.
        //Two "@@" at the beginning escape for a single "@".
-       function preproc( str ) {
+       function preproc( $form, str ) {
                if ( str.length <= 1 || str[0] !== '@' ) {
                        return str;
                } else if ( str.substr( 0, 2 ) == '@@' ) {
                        return str.substr( 1 );
                } else {
                        //TODO: better validation
-                       return mw.msg( str.substring( 1 ) );
+                       return mw.message( $form.data( 'formBuilder' ).prefix + 
str.substring( 1 ) ).plain();
                }
        }
 
@@ -63,12 +63,14 @@
        }
 
        //A field with no content
-       function EmptyField( name, desc ) {
+       function EmptyField( $form, name, desc ) {
                //Check existence of compulsory fields
                if ( typeof name == 'undefined' || !desc.type || !desc.label ) {
                        $.error( "Missing arguments" );
                }
 
+               this.$form = $form;
+
                this.$p = $( '<p/>' );
 
                this.name = name;
@@ -103,11 +105,11 @@
        //A field with just a label
        LabelField.prototype = object( EmptyField.prototype );
        LabelField.prototype.constructor = LabelField;
-       function LabelField( name, desc ) {
-               EmptyField.call( this, name, desc );
+       function LabelField( $form, name, desc ) {
+               EmptyField.call( this, $form, name, desc );
 
                var $label = $( '<label/>' )
-                       .text( preproc( this.desc.label ) )
+                       .text( preproc( this.$form, this.desc.label ) )
                        .attr('for', idPrefix + this.name );
 
                this.$p.append( $label );
@@ -116,8 +118,8 @@
        //A field with a label and a checkbox
        BooleanField.prototype = object( LabelField.prototype );
        BooleanField.prototype.constructor = BooleanField;
-       function BooleanField( name, desc ){ 
-               LabelField.call( this, name, desc );
+       function BooleanField( $form, name, desc ){ 
+               LabelField.call( this, $form, name, desc );
 
                if ( typeof desc.value != 'boolean' ) {
                        $.error( "desc.value is invalid" );
@@ -140,8 +142,8 @@
 
        StringField.prototype = object( LabelField.prototype );
        StringField.prototype.constructor = StringField;
-       function StringField( name, desc ){ 
-               LabelField.call( this, name, desc );
+       function StringField( $form, name, desc ){ 
+               LabelField.call( this, $form, name, desc );
 
                if ( typeof desc.value != 'string' ) {
                        $.error( "desc.value is invalid" );
@@ -192,8 +194,8 @@
        
        NumberField.prototype = object( LabelField.prototype );
        NumberField.prototype.constructor = NumberField;
-       function NumberField( name, desc ){ 
-               LabelField.call( this, name, desc );
+       function NumberField( $form, name, desc ){ 
+               LabelField.call( this, $form, name, desc );
 
                if ( desc.value !== null && typeof desc.value != 'number' ) {
                        $.error( "desc.value is invalid" );
@@ -251,18 +253,19 @@
 
        SelectField.prototype = object( LabelField.prototype );
        SelectField.prototype.constructor = SelectField;
-       function SelectField( name, desc ){ 
-               LabelField.call( this, name, desc );
+       function SelectField( $form, name, desc ){ 
+               LabelField.call( this, $form, name, desc );
 
                var $select = this.$select = $( '<select/>' )
                        .attr( 'id', idPrefix + this.name )
                        .attr( 'name', idPrefix + this.name );
                
                var values = [];
+               var self = this;
                $.each( desc.options, function( optName, optVal ) {
                        var i = values.length;
                        $( '<option/>' )
-                               .text( preproc( optName ) )
+                               .text( preproc( self.$form, optName ) )
                                .val( i )
                                .appendTo( $select );
                        values.push( optVal );
@@ -299,9 +302,10 @@
         * Main method; takes the given preferences description object and 
builds
         * the body of the form with the requested fields.
         * 
+        * @param {Object} options
         * @return {Element} the object with the requested form body.
         */
-       function buildFormBody() {
+       function buildFormBody( options ) {
                var description  = this.get( 0 );
                if ( typeof description != 'object' ) {
                        mw.log( "description should be an object, instead of a 
" + typeof description );
@@ -313,7 +317,7 @@
                //If there is an "intro", adds it to the form as a label
                if ( typeof description.intro == 'string' ) {
                        $( '<p/>' )
-                               .text( preproc( description.intro ) )
+                               .text( preproc( this.$form, description.intro ) 
)
                                .addClass( 'formBuilder-intro' )
                                .appendTo( $form );
                }
@@ -323,6 +327,11 @@
                        return null;
                }
 
+               var prefix = options.gadget === undefined ? '' : ( 'Gadget-' + 
options.gadget + '-' );
+               $form.data( 'formBuilder', {
+                       prefix: prefix, //prefix for messages
+               } );
+
                var fields = [];
 
                var settings = {}; //validator settings
@@ -341,7 +350,7 @@
 
                                var f;
                                try {
-                                       f = new FieldConstructor( fieldName, 
field );
+                                       f = new FieldConstructor( $form, 
fieldName, field );
                                } catch ( e ) {
                                        mw.log( e );
                                        return null; //constructor failed, 
wrong syntax in field description
@@ -362,10 +371,9 @@
 
                var validator = $form.validate( settings );
 
-               $form.data( 'formBuilder', {
-                       fields: fields,
-                       validator: validator
-               } );
+               var data = $form.data( 'formBuilder' );
+               data.fields = fields,
+               data.validator = validator
 
                return $form;
        }


_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to