diff -u b/core/lib/Drupal/Core/Theme/ActiveTheme.php b/core/lib/Drupal/Core/Theme/ActiveTheme.php --- b/core/lib/Drupal/Core/Theme/ActiveTheme.php +++ b/core/lib/Drupal/Core/Theme/ActiveTheme.php @@ -81,13 +81,6 @@ protected $libraries; /** - * The extensions that might be attaching assets. - * - * @var array - */ - protected $extensions; - - /** * Constructs an ActiveTheme object. * * @param array $values @@ -105,48 +98,18 @@ 'base_themes' => [], ]; - $this->extensions = \Drupal::service('module_handler')->getModuleList(); - $this->extensions = array_merge($this->extensions, \Drupal::service('theme_handler')->listInfo()); - $this->name = $values['name']; $this->path = $values['path']; $this->engine = $values['engine']; $this->owner = $values['owner']; - $this->styleSheetsRemove = $this->resolveStyleSheetPlaceholders($values['stylesheets_remove']); - $this->styleSheetsOverride = $this->resolveStyleSheetPlaceholders($values['stylesheets_override']); + $this->styleSheetsRemove = $values['stylesheets_remove']; + $this->styleSheetsOverride = $values['stylesheets_override']; $this->libraries = $values['libraries']; $this->extension = $values['extension']; $this->baseThemes = $values['base_themes']; } /** - * Resolves tokens from the stylesheets remove and override. - * - * @param array $list - * - * @return array - * List of stylesheets where placeholders are replaced. - */ - public function resolveStyleSheetPlaceholders($list) { - foreach ($list as $key => $item) { - $token_candidate = explode('/', $key)[0]; - if (!preg_match('/@[A-z0-9_-]+/', $token_candidate)) { - continue; - } - - $token = substr($token_candidate, 1); - - if (isset($this->extensions[$token])) { - $css_file = str_replace($token_candidate, $this->extensions[$token]->getPath(), $key); - $list[$css_file] = $item; - unset($list[$key]); - } - } - - return $list; - } - - /** * Returns the machine name of the theme. * * @return string only in patch2: unchanged: --- a/core/lib/Drupal/Core/Theme/ThemeInitialization.php +++ b/core/lib/Drupal/Core/Theme/ThemeInitialization.php @@ -38,6 +38,13 @@ class ThemeInitialization implements ThemeInitializationInterface { protected $root; /** + * The extensions that might be attaching assets. + * + * @var array + */ + protected $extensions; + + /** * Constructs a new ThemeInitialization object. * * @param string $root @@ -51,6 +58,10 @@ public function __construct($root, ThemeHandlerInterface $theme_handler, StateIn $this->root = $root; $this->themeHandler = $theme_handler; $this->state = $state; + + $this->extensions = \Drupal::service('module_handler')->getModuleList(); + $this->extensions = array_merge($this->extensions, $this->themeHandler->listInfo()); + } /** @@ -162,35 +173,43 @@ public function getActiveTheme(Extension $theme, array $base_themes = []) { foreach ($base_themes as $base) { $base_theme_path = $base->getPath(); if (!empty($base->info['stylesheets-remove'])) { - foreach ($base->info['stylesheets-remove'] as $basename) { - $values['stylesheets_remove'][$basename] = $base_theme_path . '/' . $basename; + foreach ($base->info['stylesheets-remove'] as $css_file) { + $css_file = $this->resolveStyleSheetPlaceholders($css_file); + $values['stylesheets_remove'][$css_file] = $css_file; } } if (!empty($base->info['stylesheets-override'])) { - foreach ($base->info['stylesheets-override'] as $name) { - $basename = drupal_basename($name); - $values['stylesheets_override'][$basename] = $base_theme_path . '/' . $name; + foreach ($base->info['stylesheets-override'] as $override) { + if (is_array($override)) { + foreach ($override as $overridden_css => $overriding_css) { + $overridden_css = $this->resolveStyleSheetPlaceholders($overridden_css); + $values['stylesheets_override'][$overridden_css] = $base_theme_path . '/' . $overriding_css; + } + } } } } // Add stylesheets used by this theme. if (!empty($theme->info['stylesheets-remove'])) { - foreach ($theme->info['stylesheets-remove'] as $basename) { - $values['stylesheets_remove'][$basename] = $theme_path . '/' . $basename; - - if (isset($values['stylesheets_override'][$basename])) { - unset($values['stylesheets_override'][$basename]); + foreach ($theme->info['stylesheets-remove'] as $css_file) { + $css_file = $this->resolveStyleSheetPlaceholders($css_file); + $values['stylesheets_remove'][$css_file] = $css_file; + if (isset($values['stylesheets_override'][$css_file])) { + unset($values['stylesheets_override'][$css_file]); } } } if (!empty($theme->info['stylesheets-override'])) { - foreach ($theme->info['stylesheets-override'] as $name) { - $basename = drupal_basename($name); - $values['stylesheets_override'][$basename] = $theme_path . '/' . $name; - - if (isset($values['stylesheets_remove'][$basename])) { - unset($values['stylesheets_remove'][$basename]); + foreach ($theme->info['stylesheets-override'] as $override) { + if (is_array($override)) { + foreach ($override as $overridden_css => $overriding_css) { + $overridden_css = $this->resolveStyleSheetPlaceholders($overridden_css); + $values['stylesheets_override'][$overridden_css] = $theme_path . '/' . $overriding_css; + } + } + if (isset($values['stylesheets_remove'][$overridden_css])) { + unset($values['stylesheets_remove'][$overridden_css]); } } } @@ -228,4 +247,24 @@ public function getActiveTheme(Extension $theme, array $base_themes = []) { return new ActiveTheme($values); } + /** + * Resolves tokens from the stylesheets remove and override. + * + * @param array $list + * + * @return array + * List of stylesheets where placeholders are replaced. + */ + public function resolveStyleSheetPlaceholders($css_file) { + $token_candidate = explode('/', $css_file)[0]; + if (!preg_match('/@[A-z0-9_-]+/', $token_candidate)) { + return $css_file; + } + + $token = substr($token_candidate, 1); + + if (isset($this->extensions[$token])) { + return str_replace($token_candidate, $this->extensions[$token]->getPath(), $css_file); + } + } } only in patch2: unchanged: --- a/core/modules/system/tests/themes/test_basetheme/test_basetheme.info.yml +++ b/core/modules/system/tests/themes/test_basetheme/test_basetheme.info.yml @@ -6,8 +6,8 @@ core: 8.x libraries: - test_basetheme/global-styling stylesheets-override: - - base-override.css - - base-override.sub-remove.css + - @theme_test/css/base-override.css: base-override.css + - @theme_test/css/base-override.sub-remove.css: base-override.sub-remove.css stylesheets-remove: - - base-remove.css - - base-remove.sub-override.css + - @theme_test/css/base-remove.css + - @theme_test/css/base-remove.sub-override.css only in patch2: unchanged: --- a/core/modules/system/tests/themes/test_subtheme/test_subtheme.info.yml +++ b/core/modules/system/tests/themes/test_subtheme/test_subtheme.info.yml @@ -7,10 +7,10 @@ base theme: test_basetheme libraries: - test_subtheme/global-styling stylesheets-override: - - css/sub-override.css - - css/base-add.sub-override.css - - css/base-remove.sub-override.css + - @theme_test/css/sub-override.css: css/sub-override.css + - @theme_test/css/base-remove.sub-override.css: css/base-remove.sub-override.css + - @test_basetheme/base-add.sub-override.css: css/base-add.sub-override.css stylesheets-remove: - - sub-remove.css - - base-add.sub-remove.css - - base-override.sub-remove.css + - @theme_test/css/sub-remove.css + - @test_basetheme/base-add.sub-remove.css + - @test_basetheme/base-override.sub-remove.css