$themes = array_map( 'strtolower', $themes );
$themes['default'] = 'mediawiki';
- $modules = array();
- $modules['oojs-ui'] = array(
- 'scripts' => array(
- 'resources/lib/oojs-ui/oojs-ui.js',
- 'resources/src/oojs-ui-local.js',
- ),
- 'skinScripts' => array_combine(
+ // Helper function to generate paths to files used in 'skinStyles' and 'skinScripts'.
+ $getSkinSpecific = function ( $module, $ext = 'css' ) use ( $themes ) {
+ return array_combine(
array_keys( $themes ),
- array_map( function ( $theme ) {
+ array_map( function ( $theme ) use ( $module, $ext ) {
+ $module = $module ? "$module-" : '';
// TODO Allow extensions to specify this path somehow
- return "resources/lib/oojs-ui/oojs-ui-$theme.js";
+ return "resources/lib/oojs-ui/oojs-ui-$module$theme.$ext";
}, array_values( $themes ) )
- ),
- 'dependencies' => array(
+ );
+ };
+
+ $modules = [];
+
+ // Omnibus module.
+ $modules['oojs-ui'] = [
+ 'dependencies' => [
+ 'oojs-ui-core',
+ 'oojs-ui-widgets',
+ 'oojs-ui-toolbars',
+ 'oojs-ui-windows',
+ ],
+ 'targets' => [ 'desktop', 'mobile' ],
+ ];
+
+ // The core JavaScript library.
+ $modules['oojs-ui-core'] = [
+ 'scripts' => [
+ 'resources/lib/oojs-ui/oojs-ui-core.js',
+ 'resources/src/oojs-ui-local.js',
+ ],
+ 'skinScripts' => $getSkinSpecific( null, 'js' ),
+ 'dependencies' => [
'es5-shim',
'oojs',
- 'oojs-ui.styles',
+ 'oojs-ui-core.styles',
+ 'mediawiki.language',
+ ],
+ 'targets' => [ 'desktop', 'mobile' ],
+ ];
+ // This contains only the styles required by core widgets.
+ $modules['oojs-ui-core.styles'] = [
+ 'position' => 'top',
+ 'styles' => 'resources/src/oojs-ui-local.css', // HACK, see inside the file
+ 'skinStyles' => $getSkinSpecific( 'core' ),
+ 'targets' => [ 'desktop', 'mobile' ],
+ // ResourceLoaderImageModule doesn't support 'skipFunction', so instead we set this up so that
+ // this module is skipped together with its dependencies. Nothing else depends on these modules.
+ 'dependencies' => [
'oojs-ui.styles.icons',
'oojs-ui.styles.indicators',
'oojs-ui.styles.textures',
- 'mediawiki.language',
- ),
- 'messages' => array(
- 'ooui-dialog-message-accept',
- 'ooui-dialog-message-reject',
- 'ooui-dialog-process-continue',
- 'ooui-dialog-process-dismiss',
- 'ooui-dialog-process-error',
- 'ooui-dialog-process-retry',
+ ],
+ 'skipFunction' => 'resources/src/oojs-ui-styles-skip.js',
+ ];
+
+ // Deprecated old name for the module 'oojs-ui-core.styles'.
+ $modules['oojs-ui.styles'] = $modules['oojs-ui-core.styles'];
+
+ // Additional widgets and layouts module.
+ $modules['oojs-ui-widgets'] = [
+ 'scripts' => 'resources/lib/oojs-ui/oojs-ui-widgets.js',
+ 'skinStyles' => $getSkinSpecific( 'widgets' ),
+ 'dependencies' => 'oojs-ui-core',
+ 'messages' => [
'ooui-outline-control-move-down',
'ooui-outline-control-move-up',
'ooui-outline-control-remove',
'ooui-selectfile-dragdrop-placeholder',
'ooui-selectfile-not-supported',
'ooui-selectfile-placeholder',
+ ],
+ 'targets' => [ 'desktop', 'mobile' ],
+ ];
+ // Toolbar and tools module.
+ $modules['oojs-ui-toolbars'] = [
+ 'scripts' => 'resources/lib/oojs-ui/oojs-ui-toolbars.js',
+ 'skinStyles' => $getSkinSpecific( 'toolbars' ),
+ 'dependencies' => 'oojs-ui-core',
+ 'messages' => [
'ooui-toolbar-more',
'ooui-toolgroup-collapse',
'ooui-toolgroup-expand',
- ),
- 'targets' => array( 'desktop', 'mobile' ),
- );
- $modules['oojs-ui.styles'] = array(
- 'position' => 'top',
- 'styles' => 'resources/src/oojs-ui-local.css', // HACK, see inside the file
- 'skinStyles' => array_combine(
- array_keys( $themes ),
- array_map( function ( $theme ) {
- // TODO Allow extensions to specify this path somehow
- return "resources/lib/oojs-ui/oojs-ui-$theme-noimages.css";
- }, array_values( $themes ) )
- ),
- 'targets' => array( 'desktop', 'mobile' ),
- );
+ ],
+ 'targets' => [ 'desktop', 'mobile' ],
+ ];
+ // Windows and dialogs module.
+ $modules['oojs-ui-windows'] = [
+ 'scripts' => 'resources/lib/oojs-ui/oojs-ui-windows.js',
+ 'skinStyles' => $getSkinSpecific( 'windows' ),
+ 'dependencies' => 'oojs-ui-core',
+ 'messages' => [
+ 'ooui-dialog-message-accept',
+ 'ooui-dialog-message-reject',
+ 'ooui-dialog-process-continue',
+ 'ooui-dialog-process-dismiss',
+ 'ooui-dialog-process-error',
+ 'ooui-dialog-process-retry',
+ ],
+ 'targets' => [ 'desktop', 'mobile' ],
+ ];
- $imageSets = array(
+ $imageSets = [
// Comments for greppability
'icons', // oojs-ui.styles.icons
'indicators', // oojs-ui.styles.indicators
'icons-movement', // oojs-ui.styles.icons-movement
'icons-user', // oojs-ui.styles.icons-user
'icons-wikimedia', // oojs-ui.styles.icons-wikimedia
- );
+ ];
$rootPath = 'resources/lib/oojs-ui/themes';
foreach ( $imageSets as $name ) {
- $module = array(
+ $module = [
'position' => 'top',
'class' => 'ResourceLoaderOOUIImageModule',
'name' => $name,
'rootPath' => $rootPath,
- );
+ ];
if ( substr( $name, 0, 5 ) === 'icons' ) {
$module['selectorWithoutVariant'] = '.oo-ui-icon-{name}, .mw-ui-icon-{name}:before';