http://www.mediawiki.org/wiki/Special:Code/MediaWiki/73026
Revision: 73026
Author: tparscal
Date: 2010-09-14 22:28:14 +0000 (Tue, 14 Sep 2010)
Log Message:
-----------
* Refactored mediaWiki.msg to use the configuration prototype
* Made basic parser extendable without having to replace the msg object
* Cleaned up whitespace and comments
Modified Paths:
--------------
trunk/phase3/resources/mediawiki/mediawiki.js
Modified: trunk/phase3/resources/mediawiki/mediawiki.js
===================================================================
--- trunk/phase3/resources/mediawiki/mediawiki.js 2010-09-14 21:48:23 UTC
(rev 73025)
+++ trunk/phase3/resources/mediawiki/mediawiki.js 2010-09-14 22:28:14 UTC
(rev 73026)
@@ -55,8 +55,11 @@
* An object which allows single and multiple get/set/exists
functionality on a list of key / value pairs
*
* @param {boolean} global whether to get/set/exists values on
the window object or a private object
+ * @param {function} parser function to perform extra
processing before while getting a value which accepts
+ * value and options parameters where value is a string to be
parsed and options is an object of options for the
+ * parser
*/
- 'configuration': function( global ) {
+ 'configuration': function( global, parser ) {
/* Private Members */
@@ -66,52 +69,78 @@
/* Public Methods */
/**
- * Gets one or multiple configuration values using a
key and an optional fallback or an array of keys
+ * Gets one or more values
+ *
+ * If called with no arguments, all values will be
returned. If a parser is in use, no parsing will take
+ * place when calling with no arguments or calling with
an array of names.
+ *
+ * @param {mixed} selection string name of value to
get, array of string names of values to get, or object
+ * of name/option pairs
+ * @param {object} options optional set of options
which are also passed to a parser if in use; only used
+ * when selection is a string
+ * @format options
+ * {
+ * // Value to use if key does not exist
+ * 'fallback': ''
+ * }
*/
- this.get = function( keys, fallback ) {
- if ( typeof keys === 'object' ) {
- var result = {};
- for ( var k = 0; k < keys.length; k++ )
{
- if ( typeof values[keys[k]] !==
'undefined' ) {
- result[keys[k]] =
values[keys[k]];
+ this.get = function( selection, options ) {
+ if ( typeof selection === 'object' ) {
+ var results = {};
+ for ( s in selection ) {
+ if ( selection.hasOwnProperty(
s ) ) {
+ if ( typeof s ===
'string' ) {
+ return
that.get( values[s], selection[s] );
+ } else {
+ return
that.get( selection[s] );
+ }
}
}
- return result;
- } else if ( typeof keys === 'string' ) {
- if ( typeof values[keys] ===
'undefined' ) {
- return typeof fallback !==
'undefined' ? fallback : null;
+ return results;
+ } else if ( typeof selection === 'string' ) {
+ if ( typeof values[selection] ===
'undefined' ) {
+ return 'fallback' in options
!== 'undefined' ? options.fallback : null;
} else {
- return values[keys];
+ if ( typeof parser ===
'function' ) {
+ return parser(
values[selection], options );
+ } else {
+ return
values[selection];
+ }
}
} else {
return values;
}
};
+
/**
* Sets one or multiple configuration values using a
key and a value or an object of keys and values
+ *
+ * @param {mixed} key string of name by which value
will be made accessible, or object of name/value pairs
+ * @param {mixed} value optional value to set, only in
use when key is a string
*/
- this.set = function( keys, value ) {
- if ( typeof keys === 'object' ) {
- for ( var k in keys ) {
- values[k] = keys[k];
+ this.set = function( selection, value ) {
+ if ( typeof selection === 'object' ) {
+ for ( var s in selection ) {
+ values[s] = selection[s];
}
- } else if ( typeof keys === 'string' && typeof
value !== 'undefined' ) {
- values[keys] = value;
+ } else if ( typeof selection === 'string' &&
typeof value !== 'undefined' ) {
+ values[selection] = value;
}
};
+
/**
* Checks if one or multiple configuration fields exist
*/
- this.exists = function( keys ) {
+ this.exists = function( selection ) {
if ( typeof keys === 'object' ) {
- for ( var k = 0; k < keys.length; k++ )
{
- if ( !( keys[k] in values ) ) {
+ for ( var s = 0; s < selection.length;
s++ ) {
+ if ( !( selection[s] in values
) ) {
return false;
}
}
return true;
} else {
- return keys in values;
+ return selection in values;
}
};
}
@@ -123,12 +152,14 @@
* Dummy function which in debug mode can be replaced with a function
that does something clever
*/
this.log = function() { };
+
/*
* List of configuration values
*
* In legacy mode the values this object wraps will be in the global
space
*/
this.config = new this.prototypes.configuration( LEGACY_GLOBALS );
+
/*
* Information about the current user
*/
@@ -138,44 +169,31 @@
this.options = new that.prototypes.configuration();
} )();
+
/*
- * Localization system
+ * Basic parser, can be replaced with something more robust
*/
- this.msg = new ( function() {
-
- /* Private Members */
-
- var that = this;
- // List of localized messages
- var messages = {};
-
- /* Public Methods */
-
- this.set = function( keys, value ) {
- if ( typeof keys === 'object' ) {
- for ( var k in keys ) {
- messages[k] = keys[k];
- }
- } else if ( typeof keys === 'string' && typeof value
!== 'undefined' ) {
- messages[keys] = value;
+ this.parser = function( key, args ) {
+ if ( !( key in messages ) ) {
+ return '<' + key + '>';
+ }
+ var msg = messages[key];
+ if ( typeof args == 'object' || typeof args == 'array' ) {
+ for ( var a = 0; a < args.length; a++ ) {
+ msg = msg.replace( '\$' + ( parseInt( a ) + 1
), args[a] );
}
- };
- this.get = function( key, args ) {
- if ( !( key in messages ) ) {
- return '<' + key + '>';
- }
- var msg = messages[key];
- if ( typeof args == 'object' || typeof args == 'array'
) {
- for ( var a = 0; a < args.length; a++ ) {
- msg = msg.replace( '\$' + ( parseInt( a
) + 1 ), args[a] );
- }
- } else if ( typeof args == 'string' || typeof args ==
'number' ) {
- msg = msg.replace( '$1', args );
- }
- return msg;
- };
- } )();
+ } else if ( typeof args == 'string' || typeof args == 'number'
) {
+ msg = msg.replace( '$1', args );
+ }
+ return msg;
+ };
+
/*
+ * Localization system
+ */
+ this.msg = new that.prototypes.configuration( false, this.parser );
+
+ /*
* Client-side module loader which integrates with the MediaWiki
ResourceLoader
*/
this.loader = new ( function() {
@@ -236,6 +254,7 @@
pad1( date.getUTCSeconds() ) +
'Z';
}
+
/**
* Recursively resolves dependencies and detects circular
references
*/
@@ -263,6 +282,7 @@
resolved[resolved.length] = module;
unresolved.splice( unresolved.indexOf( module ), 1 );
}
+
/**
* Gets a list of modules names that a module dependencies in
their proper dependency order
*
@@ -292,6 +312,7 @@
}
throw new Error( 'Invalid module argument: ' + module );
};
+
/**
* Narrows a list of module names down to those matching a
specific state. Possible states are 'undefined',
* 'registered', 'loading', 'loaded', or 'ready'
@@ -326,6 +347,7 @@
}
return list;
}
+
/**
* Executes a loaded module, making it ready to use
*
@@ -393,6 +415,7 @@
}
}
}
+
/**
* Adds a dependencies to the queue with optional callbacks to
be run when the dependencies are ready or fail
*
@@ -518,6 +541,7 @@
}
}
};
+
/**
* Registers a module, letting the system know about it and
it's dependencies. loader.js files contain calls
* to this function.
@@ -555,6 +579,7 @@
registry[module].dependencies = dependencies;
}
};
+
/**
* Implements a module, giving the system a course of action to
take upon loading. Results of a request for
* one or more modules contain calls to this function.
@@ -594,6 +619,7 @@
request( module );
}
};
+
/**
* Executes a function as soon as one or more required modules
are ready
*
@@ -630,6 +656,7 @@
request( dependencies, ready, error );
}
};
+
/**
* Loads one or more modules for future use
*/
@@ -658,6 +685,7 @@
return true;
}
};
+
/**
* Flushes the request queue and begin executing load requests
on demand
*/
@@ -665,6 +693,7 @@
suspended = false;
that.work();
};
+
/**
* Changes the state of a module
*
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs