Moved more generated javascript to ResourceLoader functions. Cleaned some things...
authorTrevor Parscal <tparscal@users.mediawiki.org>
Fri, 24 Sep 2010 21:03:29 +0000 (21:03 +0000)
committerTrevor Parscal <tparscal@users.mediawiki.org>
Fri, 24 Sep 2010 21:03:29 +0000 (21:03 +0000)
includes/ResourceLoader.php
includes/ResourceLoaderModule.php

index 6da7ffa..c6f9ce2 100644 (file)
@@ -437,4 +437,47 @@ class ResourceLoader {
                        return "mediaWiki.loader.state( '$name', '$state' );\n";
                }
        }
+       
+       public static function makeCustomLoaderScript( $name, $version, $dependencies, $group, $script ) {
+               $name = Xml::escapeJsString( $name );
+               $version = (int) $version > 1 ? (int) $version : 1;
+               if ( is_array( $dependencies ) ) {
+                       $dependencies = FormatJson::encode( $dependencies );
+               } else if ( is_string( $dependencies ) ) {
+                       $dependencies = "'" . Xml::escapeJsString( $dependencies ) . "'";
+               } else {
+                       $dependencies = 'null';
+               }
+               if ( is_string( $group ) ) {
+                       $group = "'" . Xml::escapeJsString( $group ) . "'";
+               } else {
+                       $group = 'null';
+               }
+               $script = str_replace( "\n", "\n\t", trim( $script ) );
+               return "( function( name, version, dependencies ) {\t$script\t} )" .
+                       "( '$name', $version, $dependencies, $group );\n";
+       }
+       
+       public static function makeLoaderRegisterScript( $name, $version = null, $dependencies = null, $group = null ) {
+               if ( is_array( $name ) ) {
+                       $registrations = FormatJson::encode( $name );
+                       return "mediaWiki.loader.register( $registrations );\n";
+               } else {
+                       $name = Xml::escapeJsString( $name );
+                       $version = (int) $version > 1 ? (int) $version : 1;
+                       if ( is_array( $dependencies ) ) {
+                               $dependencies = FormatJson::encode( $dependencies );
+                       } else if ( is_string( $dependencies ) ) {
+                               $dependencies = "'" . Xml::escapeJsString( $dependencies ) . "'";
+                       } else {
+                               $dependencies = 'null';
+                       }
+                       if ( is_string( $group ) ) {
+                               $group = "'" . Xml::escapeJsString( $group ) . "'";
+                       } else {
+                               $group = 'null';
+                       }
+                       return "mediaWiki.loader.register( '$name', $version, $dependencies, $group );\n";
+               }
+       }
 }
index a27502b..5b9f900 100644 (file)
@@ -1048,7 +1048,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        public static function getModuleRegistrations( ResourceLoaderContext $context ) {
                wfProfileIn( __METHOD__ );
                
-               $scripts = '';
+               $out = '';
                $registrations = array();
                foreach ( ResourceLoader::getModules() as $name => $module ) {
                        // Support module loader scripts
@@ -1056,8 +1056,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                $deps = FormatJson::encode( $module->getDependencies() );
                                $group = FormatJson::encode( $module->getGroup() );
                                $version = wfTimestamp( TS_ISO_8601, round( $module->getModifiedTime( $context ), -2 ) );
-                               $scripts .= "( function( name, version, dependencies ) { $loader } )\n" . 
-                                       "( '$name', '$version', $deps, $group );\n";
+                               $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $loader );
                        }
                        // Automatically register module
                        else {
@@ -1080,7 +1079,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                }
                        }
                }
-               $out = $scripts . "mediaWiki.loader.register( " . FormatJson::encode( $registrations ) . " );";
+               $out .= ResourceLoader::makeLoaderRegisterScript( $registrations );
                
                wfProfileOut( __METHOD__ );
                return $out;
@@ -1091,14 +1090,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        public function getScript( ResourceLoaderContext $context ) {
                global $IP, $wgLoadScript;
 
-               $scripts = file_get_contents( "$IP/resources/startup.js" );
+               $out = file_get_contents( "$IP/resources/startup.js" );
                if ( $context->getOnly() === 'scripts' ) {
-                       // Get all module registrations
-                       $registration = self::getModuleRegistrations( $context );
-                       // Build configuration
-                       $config = FormatJson::encode( $this->getConfig( $context ) );
-                       // Add a well-known start-up function
-                       $scripts .= "window.startUp = function() {\n\t$registration\n\tmediaWiki.config.set( $config );\n};\n";
                        // Build load query for jquery and mediawiki modules
                        $query = array(
                                'modules' => implode( '|', array( 'jquery', 'mediawiki' ) ),
@@ -1111,17 +1104,20 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                        ResourceLoader::getModule( 'mediawiki' )->getModifiedTime( $context )
                                ), -2 ) )
                        );
-                       // Uniform query order
+                       // Ensure uniform query order
                        ksort( $query );
-                       // Build HTML code for loading jquery and mediawiki modules
-                       $loadScript = Html::linkedScript( $wgLoadScript . '?' . wfArrayToCGI( $query ) );
-                       // Add code to add jquery and mediawiki loading code; only if the current client is compatible
-                       $scripts .= "if ( isCompatible() ) {\n\tdocument.write( " . FormatJson::encode( $loadScript ) . ");\n}\n";
-                       // Delete the compatible function - it's not needed anymore
-                       $scripts .= "delete window['isCompatible'];\n";
+                       
+                       // Startup function
+                       $configuration = FormatJson::encode( $this->getConfig( $context ) );
+                       $registrations = self::getModuleRegistrations( $context );
+                       $out .= "window.startUp = function() {\n\t$registrations\n\tmediaWiki.config.set( $configuration );\n};";
+                       
+                       // Conditional script injection
+                       $scriptTag = Xml::escapeJsString( Html::linkedScript( $wgLoadScript . '?' . wfArrayToCGI( $query ) ) );
+                       $out .= "if ( isCompatible() ) {\n\tdocument.write( '$scriptTag' );\n}\ndelete window['isCompatible'];";
                }
 
-               return $scripts;
+               return $out;
        }
 
        public function getModifiedTime( ResourceLoaderContext $context ) {