* @param LoggerInterface|null $logger [optional]
*/
public function __construct( Config $config = null, LoggerInterface $logger = null ) {
- global $IP;
-
$this->logger = $logger ?: new NullLogger();
if ( !$config ) {
// Add 'local' source first
$this->addSource( 'local', $config->get( 'LoadScript' ) );
- // Register core modules
- $this->register( include "$IP/resources/Resources.php" );
+ // Special module that always exists
+ $this->register( 'startup', [ 'class' => ResourceLoaderStartUpModule::class ] );
+
// Register extension modules
$this->register( $config->get( 'ResourceModules' ) );
* @throws MWException If a duplicate module registration is attempted
* @throws MWException If a module name contains illegal characters (pipes or commas)
* @throws MWException If something other than a ResourceLoaderModule is being registered
- * @return bool False if there were any errors, in which case one or more modules were
- * not registered
*/
public function register( $name, $info = null ) {
$moduleSkinStyles = $this->config->get( 'ResourceModuleSkinStyles' );
// Use a linebreak between module script and state script (T162719)
$out = $this->ensureNewline( $out ) . $stateScript;
}
- } else {
- if ( $states ) {
- $this->errors[] = 'Problematic modules: '
- . self::encodeJsonForScript( $states );
- }
+ } elseif ( $states ) {
+ $this->errors[] = 'Problematic modules: '
+ . self::encodeJsonForScript( $states );
}
return $out;
*/
private function ensureNewline( $str ) {
$end = substr( $str, -1 );
- if ( $end === false || $end === "\n" ) {
+ if ( $end === false || $end === '' || $end === "\n" ) {
return $str;
}
return $str . "\n";
}
}
- array_walk( $modules, [ 'self', 'trimArray' ] );
+ array_walk( $modules, [ self::class, 'trimArray' ] );
return Xml::encodeJsCall(
'mw.loader.register',
* For example, `[ 'foo.bar', 'foo.baz', 'bar.baz', 'bar.quux' ]`
* becomes `'foo.bar,baz|bar.baz,quux'`.
*
- * This process is reversed by ResourceLoaderContext::expandModuleNames().
+ * This process is reversed by ResourceLoader::expandModuleNames().
* See also mw.loader#buildModulesString() which is a port of this, used
* on the client-side.
*
return implode( '|', $arr );
}
+ /**
+ * Expand a string of the form `jquery.foo,bar|jquery.ui.baz,quux` to
+ * an array of module names like `[ 'jquery.foo', 'jquery.bar',
+ * 'jquery.ui.baz', 'jquery.ui.quux' ]`.
+ *
+ * This process is reversed by ResourceLoader::makePackedModulesString().
+ *
+ * @since 1.33
+ * @param string $modules Packed module name list
+ * @return array Array of module names
+ */
+ public static function expandModuleNames( $modules ) {
+ $retval = [];
+ $exploded = explode( '|', $modules );
+ foreach ( $exploded as $group ) {
+ if ( strpos( $group, ',' ) === false ) {
+ // This is not a set of modules in foo.bar,baz notation
+ // but a single module
+ $retval[] = $group;
+ } else {
+ // This is a set of modules in foo.bar,baz notation
+ $pos = strrpos( $group, '.' );
+ if ( $pos === false ) {
+ // Prefixless modules, i.e. without dots
+ $retval = array_merge( $retval, explode( ',', $group ) );
+ } else {
+ // We have a prefix and a bunch of suffixes
+ $prefix = substr( $group, 0, $pos ); // 'foo'
+ $suffixes = explode( ',', substr( $group, $pos + 1 ) ); // [ 'bar', 'baz' ]
+ foreach ( $suffixes as $suffix ) {
+ $retval[] = "$prefix.$suffix";
+ }
+ }
+ }
+ }
+ return $retval;
+ }
+
/**
* Determine whether debug mode was requested
* Order of priority is 1) request param, 2) cookie, 3) $wg setting