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