diff --git a/phpBB/config/default/container/services.yml b/phpBB/config/default/container/services.yml index 9b01005852..d34a1ded9f 100644 --- a/phpBB/config/default/container/services.yml +++ b/phpBB/config/default/container/services.yml @@ -1,4 +1,5 @@ imports: + - { resource: services_assets.yml } - { resource: services_attachment.yml } - { resource: services_auth.yml } - { resource: services_avatar.yml } diff --git a/phpBB/config/default/container/services_assets.yml b/phpBB/config/default/container/services_assets.yml new file mode 100644 index 0000000000..1370a62062 --- /dev/null +++ b/phpBB/config/default/container/services_assets.yml @@ -0,0 +1,7 @@ +services: + assets.iconify_bundler: + class: phpbb\assets\iconify_bundler + arguments: + - '@dbal.conn' + - '@ext.manager' + - '%core.root_path%' diff --git a/phpBB/develop/create_iconify_bundle.php b/phpBB/develop/create_iconify_bundle.php index f7b444b1d5..8d1c33fe8d 100644 --- a/phpBB/develop/create_iconify_bundle.php +++ b/phpBB/develop/create_iconify_bundle.php @@ -21,18 +21,22 @@ define('IN_PHPBB', true); $phpbb_root_path = dirname(__FILE__) . '/../'; $phpEx = substr(strrchr(__FILE__, '.'), 1); -include($phpbb_root_path . 'vendor/autoload.php'); -include($phpbb_root_path . 'includes/constants.' . $phpEx); -require($phpbb_root_path . 'phpbb/class_loader.' . $phpEx); -$phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx); -$phpbb_class_loader->register(); +include($phpbb_root_path . 'common.' . $phpEx); + +/** @var \phpbb\assets\iconify_bundler $iconify_bundler */ +$iconify_bundler = $phpbb_container->get('assets.iconify_bundler'); // JS file to save bundle to $target = $phpbb_root_path . 'assets/iconify/iconify-bundle.js'; // Icons to bundle, the list of iconify icons used in phpBB -$iconify_bundler = new \phpbb\assets\iconify_bundler($phpbb_root_path); -$output = $iconify_bundler->run(); +$iconify_bundler->find_icons([ + $phpbb_root_path . 'styles/', + $phpbb_root_path . 'adm/style/', +]); +$output = $iconify_bundler->with_extensions() + ->with_styles() + ->run(); // Save to file file_put_contents($target, $output); diff --git a/phpBB/phpbb/assets/iconify_bundler.php b/phpBB/phpbb/assets/iconify_bundler.php index 7e68d56309..8bb77ea605 100644 --- a/phpBB/phpbb/assets/iconify_bundler.php +++ b/phpBB/phpbb/assets/iconify_bundler.php @@ -19,17 +19,24 @@ use Symfony\Component\Finder\Finder; class iconify_bundler { + protected $db; + + protected $ext_manager; + protected $root_path = ''; protected $icons_list = []; - public function __construct(string $root_path) + public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\extension\manager $ext_manager, string $root_path) { + $this->db = $db; + $this->ext_manager = $ext_manager; $this->root_path = $root_path; } public function run() { - $this->find_icons(); + // Sort icons first + sort($this->icons_list, SORT_NATURAL); $organized_icons = $this->organize_icons_list(); @@ -55,12 +62,27 @@ class iconify_bundler return $output; } - protected function find_icons() + /** + * @param array $paths Icon paths + * + * @return void + */ + public function find_icons(array $paths): void { + if (!count($paths)) + { + return; + } + $finder = new Finder(); - $finder->files()->in($this->root_path . '/styles/') - ->in($this->root_path . '/adm/style/') - ->name('*.html') + $finder->files(); + + foreach ($paths as $cur_path) + { + $finder->in($cur_path); + } + + $finder->name('*.html') ->name('*.twig') ->contains("Icon('iconify',"); @@ -95,8 +117,44 @@ class iconify_bundler } } } + } - sort($this->icons_list, SORT_NATURAL); + public function with_extensions(): iconify_bundler + { + $extensions = $this->ext_manager->all_enabled(); + + $search_paths = []; + + foreach ($extensions as $path) + { + if (file_exists($path)) + { + $search_paths[] = $path; + } + } + + $this->find_icons($search_paths); + + return $this; + } + + public function with_styles(): iconify_bundler + { + $sql = 'SELECT * + FROM ' . STYLES_TABLE; + $result = $this->db->sql_query($sql); + + $style_paths = []; + + while ($row = $this->db->sql_fetchrow($result)) + { + $style_paths[] = $this->root_path . 'styles/' . $row['style_path']; + } + $this->db->sql_freeresult($result); + + $this->find_icons($style_paths); + + return $this; } protected function add_icon(string $icon_name): void @@ -111,6 +169,8 @@ class iconify_bundler * Organize icons list by prefix * * Result is an object, where key is prefix, value is array of icon names + * + * @return array Organized icons list */ protected function organize_icons_list(): array { @@ -156,7 +216,8 @@ class iconify_bundler * This function was converted to PHP from @iconify/utils/src/icon/name.ts * See https://github.com/iconify/iconify/blob/master/packages/utils/src/icon/name.ts * - * @param string $icon_name + * @param string $icon_name Icon name + * @return array|null Icon data or null if icon is invalid */ protected function name_to_icon(string $icon_name): ?array { @@ -216,7 +277,7 @@ class iconify_bundler // Load icon set $collection = new Collection($prefix); if (!$collection->loadIconifyCollection($prefix)) { - throw new Error( + throw new \Error( 'Icons with prefix "' . $prefix . '" do not exist in Iconify. Update iconify/json?' ); }