From 6aefdfd2c27fb8349e261c0c2fa60a24d9d30cb1 Mon Sep 17 00:00:00 2001 From: Cellou Diallo Date: Thu, 6 Jun 2024 19:01:00 +0200 Subject: [PATCH 1/8] Overview and single page of icons library --- .../src/Controller/IconsetsController.php | 70 +++++++++++++++++++ .../ui_icons_library.info.yml | 8 +++ .../ui_icons_library.routing.yml | 24 +++++++ src/Controller/IconDisplayController.php | 39 ----------- src/Controller/IconsetsController.php | 0 src/Plugin/IconHandler/CustomIconHandler.php | 1 - ui_icons.iconset.yml | 31 ++++++-- ui_icons.routing.yml | 25 +++++-- 8 files changed, 148 insertions(+), 50 deletions(-) create mode 100644 modules/ui_icons_library/src/Controller/IconsetsController.php create mode 100644 modules/ui_icons_library/ui_icons_library.info.yml create mode 100644 modules/ui_icons_library/ui_icons_library.routing.yml delete mode 100644 src/Controller/IconDisplayController.php create mode 100644 src/Controller/IconsetsController.php delete mode 100644 src/Plugin/IconHandler/CustomIconHandler.php diff --git a/modules/ui_icons_library/src/Controller/IconsetsController.php b/modules/ui_icons_library/src/Controller/IconsetsController.php new file mode 100644 index 0000000..143e871 --- /dev/null +++ b/modules/ui_icons_library/src/Controller/IconsetsController.php @@ -0,0 +1,70 @@ +getIconsets(); + foreach ($iconsets as $iconset_id => $label) { + $iconset = \Drupal::service('strategy.manager.iconset')->getInstance($iconset_id); + $icons = $iconset->getIcons(); + $icons = array_slice($icons, 0, static::OVERVIEW_SLICE); + $build[] = [ + '#type' => 'html_tag', + '#tag' => 'h2', + '#value' => $label, + ]; + foreach ($icons as $icon_id => $icon) { + $build[] = $iconset->build($icon_id); + } + $build[] = [ + '#type' => 'html_tag', + '#tag' => 'p', + 0 => [ + '#type' => 'link', + '#title' => $this->t("View more"), + '#url' => Url::fromRoute('ui_icons.single', ["iconset_id" => $iconset_id]), + ] + ]; + } + return $build; + } + + + /** + * Display icons. + * + * @return array + * Return render array. + */ + public function single(string $iconset_id) + { + $build = []; + $iconset = \Drupal::service('strategy.manager.iconset')->getInstance($iconset_id); + $icons = $iconset->getIcons(); + foreach ($icons as $icon_id => $icon) { + $build[] = $iconset->build($icon_id); + } + return $build; + } + +} diff --git a/modules/ui_icons_library/ui_icons_library.info.yml b/modules/ui_icons_library/ui_icons_library.info.yml new file mode 100644 index 0000000..f989583 --- /dev/null +++ b/modules/ui_icons_library/ui_icons_library.info.yml @@ -0,0 +1,8 @@ +name: Iconset Library +type: module +description: 'A sous module of UI Icons to display icons library' +core_version_requirement: ^9 || ^10 +package: Custom +dependencies: + - iconset:iconset + - ui_icons:ui_icons diff --git a/modules/ui_icons_library/ui_icons_library.routing.yml b/modules/ui_icons_library/ui_icons_library.routing.yml new file mode 100644 index 0000000..6d937a2 --- /dev/null +++ b/modules/ui_icons_library/ui_icons_library.routing.yml @@ -0,0 +1,24 @@ +#ui_suite.index: +# path: '/admin/appearance/ui-libraries' +# defaults: +# _controller: '\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage' +# _title: 'UI libraries' +# requirements: +# _permission: 'access content' + +ui_icons.overview: + path: '/icons' + defaults: + _controller: '\Drupal\ui_icons_library\Controller\IconsetsController::overview' + _title: 'Iconsets library' + requirements: + _permission: 'access content' + +ui_icons.single: + path: '/icons/{iconset_id}' + defaults: + _controller: '\Drupal\ui_icons_library\Controller\IconsetsController::single' + _title: 'Iconset details' + requirements: + _permission: 'access content' + diff --git a/src/Controller/IconDisplayController.php b/src/Controller/IconDisplayController.php deleted file mode 100644 index 44258ab..0000000 --- a/src/Controller/IconDisplayController.php +++ /dev/null @@ -1,39 +0,0 @@ -getIconsets(); - foreach ($iconsets as $iconset_id=>$label) { - $iconset = \Drupal::service('strategy.manager.iconset')->getInstance($iconset_id); - $icons = $iconset->getIcons(); - $build[] = [ - '#type' => 'html_tag', - '#tag' => 'h2', - '#value' => $label, -]; - foreach ($icons as $icon_id => $icon) { - $build[] = $iconset->build($icon_id); - } -} - return $build; - } - -} diff --git a/src/Controller/IconsetsController.php b/src/Controller/IconsetsController.php new file mode 100644 index 0000000..e69de29 diff --git a/src/Plugin/IconHandler/CustomIconHandler.php b/src/Plugin/IconHandler/CustomIconHandler.php deleted file mode 100644 index b3d9bbc..0000000 --- a/src/Plugin/IconHandler/CustomIconHandler.php +++ /dev/null @@ -1 +0,0 @@ - Date: Thu, 6 Jun 2024 22:42:21 +0200 Subject: [PATCH 2/8] Create tests module and move a dataset in --- .../modules/ui_icons_test/ui_icons_test.iconset.yml | 0 .../tests/modules/ui_icons_test/ui_icons_test.info.yml | 10 ++++++++++ 2 files changed, 10 insertions(+) rename ui_icons.iconset.yml => modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml (100%) create mode 100644 modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.info.yml diff --git a/ui_icons.iconset.yml b/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml similarity index 100% rename from ui_icons.iconset.yml rename to modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml diff --git a/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.info.yml b/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.info.yml new file mode 100644 index 0000000..b97111d --- /dev/null +++ b/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.info.yml @@ -0,0 +1,10 @@ +name: 'UI Icons Test' +type: module +description: 'A custom module to display icons using Iconset' +core_version_requirement: ^9 || ^10 +package: Custom +dependencies: + - iconset:iconset + - ui_icons:ui_icons + - ui_icons_library:ui_icons_library + From 0cafa392a33016865fa2ac8640a40d95423e998a Mon Sep 17 00:00:00 2001 From: Cellou Diallo Date: Thu, 6 Jun 2024 22:42:21 +0200 Subject: [PATCH 3/8] Create tests module and move a dataset in --- modules/ui_icons_library/ui_icons_library.info.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ui_icons_library/ui_icons_library.info.yml b/modules/ui_icons_library/ui_icons_library.info.yml index f989583..d26f39c 100644 --- a/modules/ui_icons_library/ui_icons_library.info.yml +++ b/modules/ui_icons_library/ui_icons_library.info.yml @@ -4,5 +4,4 @@ description: 'A sous module of UI Icons to display icons library' core_version_requirement: ^9 || ^10 package: Custom dependencies: - - iconset:iconset - ui_icons:ui_icons From d5ec8f087203ba6f2e4529f5ea34bfd052269894 Mon Sep 17 00:00:00 2001 From: Cellou Diallo Date: Fri, 7 Jun 2024 13:58:14 +0200 Subject: [PATCH 4/8] Create custom handler for codepoints --- .../src/Controller/IconsetsController.php | 22 +++-- .../ui_icons_test/ui_icons_test.iconset.yml | 5 ++ .../ui_icons_test/ui_icons_test.libraries.yml | 4 + src/Asset/CodepointsAsset.php | 68 ++++++++++++++++ src/Plugin/Iconset/CodepointsHandler.php | 80 +++++++++++++++++++ 5 files changed, 166 insertions(+), 13 deletions(-) create mode 100644 modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.libraries.yml create mode 100644 src/Asset/CodepointsAsset.php create mode 100644 src/Plugin/Iconset/CodepointsHandler.php diff --git a/modules/ui_icons_library/src/Controller/IconsetsController.php b/modules/ui_icons_library/src/Controller/IconsetsController.php index 143e871..6f7afce 100644 --- a/modules/ui_icons_library/src/Controller/IconsetsController.php +++ b/modules/ui_icons_library/src/Controller/IconsetsController.php @@ -1,6 +1,5 @@ getIconsets(); foreach ($iconsets as $iconset_id => $label) { $iconset = \Drupal::service('strategy.manager.iconset')->getInstance($iconset_id); $icons = $iconset->getIcons(); - $icons = array_slice($icons, 0, static::OVERVIEW_SLICE); + $icons_id = array_keys($icons); + $icons_id = array_slice($icons_id, 0, static::OVERVIEW_SLICE); $build[] = [ '#type' => 'html_tag', '#tag' => 'h2', '#value' => $label, ]; - foreach ($icons as $icon_id => $icon) { + foreach ($icons_id as $icon_id) { $build[] = $iconset->build($icon_id); } $build[] = [ @@ -43,27 +41,25 @@ public function overview() '#type' => 'link', '#title' => $this->t("View more"), '#url' => Url::fromRoute('ui_icons.single', ["iconset_id" => $iconset_id]), - ] + ], ]; } return $build; } - /** * Display icons. * * @return array * Return render array. */ - public function single(string $iconset_id) - { + public function single(string $iconset_id) { $build = []; $iconset = \Drupal::service('strategy.manager.iconset')->getInstance($iconset_id); $icons = $iconset->getIcons(); foreach ($icons as $icon_id => $icon) { - $build[] = $iconset->build($icon_id); - } + $build[] = $iconset->build($icon_id); + } return $build; } diff --git a/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml b/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml index 59f52cd..b4775e0 100644 --- a/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml +++ b/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml @@ -26,6 +26,11 @@ uswsd: - '/libraries/uswds/packages/usa-icon/src/img/usa-icons-bg' - '/libraries/uswds/packages/usa-icon/src/img/uswds-icons' +material_icons: + label: 'Material icons' + plugin: 'codepoints' + assets: + - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIconsOutlined-Regular.codepoints' diff --git a/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.libraries.yml b/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.libraries.yml new file mode 100644 index 0000000..23b6b70 --- /dev/null +++ b/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.libraries.yml @@ -0,0 +1,4 @@ +material: + css: + base: + https://cdn.jsdelivr.net/npm/material-icons@1.13.12/iconfont/material-icons.min.css: {} diff --git a/src/Asset/CodepointsAsset.php b/src/Asset/CodepointsAsset.php new file mode 100644 index 0000000..354b645 --- /dev/null +++ b/src/Asset/CodepointsAsset.php @@ -0,0 +1,68 @@ +icons = $this->fetchCodepoints($url); + } + + /** + * + */ + protected function fetchCodepoints(string $url): array { + $icons = []; + + $data = file_get_contents($url); + if ($data === FALSE) { + return []; + } + + $lines = explode("\n", $data); + foreach ($lines as $line) { + if (empty($line)) { + continue; + } + [$icon_id, $codepoint] = explode(' ', $line); + $icons[$icon_id] = [ + 'label' => $icon_id, + ]; + } + return $icons; + } + + /** + * {@inheritdoc} + */ + public function getIcons() { + return $this->icons; + } + + /** + * {@inheritdoc} + */ + public function getIcon($icon_id) { + return $this->icons[$icon_id] ?? FALSE; + } + +} diff --git a/src/Plugin/Iconset/CodepointsHandler.php b/src/Plugin/Iconset/CodepointsHandler.php new file mode 100644 index 0000000..4607ddd --- /dev/null +++ b/src/Plugin/Iconset/CodepointsHandler.php @@ -0,0 +1,80 @@ +getType() === 'codepoints'; + } + + /** + * + */ + public function build($icon_id, AssetInterface $iconset, array $options = []) { + // @todo don't hardcode this here + return [ + "#type" => "html_tag", + "#tag" => "span", + "#value" => $icon_id, + "#attributes" => [ + "class" => [ + "material-icons-outlined", + ], + ], + "#attached" => [ + "library" => [ + "ui_icons_test/material", + ], + ], + ]; + } + + /** + * + */ + public function getJsSettings() { + // @todo Implement getJsSettings() method. + return []; + } + + /** + * + */ + public function formatJson(AssetInterface $asset) { + // @todo Implement formatJson() method. + return []; + } + +} From 3607ba4ec30aa8b66bccd3997bacaa816cc787aa Mon Sep 17 00:00:00 2001 From: Cellou Diallo Date: Mon, 10 Jun 2024 15:55:20 +0200 Subject: [PATCH 5/8] adding configuration information to avoid hardcoding data --- .../src/Controller/IconsetsController.php | 1 + .../ui_icons_test/ui_icons_test.iconset.yml | 15 ++++++- src/Plugin/Iconset/CodepointsHandler.php | 44 ++++++++----------- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/modules/ui_icons_library/src/Controller/IconsetsController.php b/modules/ui_icons_library/src/Controller/IconsetsController.php index 6f7afce..40f69f8 100644 --- a/modules/ui_icons_library/src/Controller/IconsetsController.php +++ b/modules/ui_icons_library/src/Controller/IconsetsController.php @@ -44,6 +44,7 @@ public function overview() { ], ]; } + return $build; } diff --git a/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml b/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml index b4775e0..66a6580 100644 --- a/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml +++ b/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml @@ -26,11 +26,22 @@ uswsd: - '/libraries/uswds/packages/usa-icon/src/img/usa-icons-bg' - '/libraries/uswds/packages/usa-icon/src/img/uswds-icons' -material_icons: - label: 'Material icons' +material_icons_outlined: + label: 'Material icons Outlined' plugin: 'codepoints' + config: + template : '{{ icon_id }}' + library: 'ui_icons_test/material' assets: - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIconsOutlined-Regular.codepoints' +material_icons_round: + label: 'Material Icon Round' + plugin: 'codepoints' + config: + template: '{{ icon_id }}' + library: 'ui_icons_test/material' + assets: + - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIconsRound-Regular.codepoints' diff --git a/src/Plugin/Iconset/CodepointsHandler.php b/src/Plugin/Iconset/CodepointsHandler.php index 4607ddd..c80d446 100644 --- a/src/Plugin/Iconset/CodepointsHandler.php +++ b/src/Plugin/Iconset/CodepointsHandler.php @@ -18,44 +18,27 @@ */ class CodepointsHandler extends PluginBase implements IconHandlerInterface { - /** - * URL to the codepoints file. - */ - const CODEPOINTS_URL = 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIconsOutlined-Regular.codepoints'; - /** * {@inheritdoc} */ public function createAssets($asset_info, IconsetInterface $iconset) { - // @todo get url from $asset_info, - return new CodepointsAsset(static::CODEPOINTS_URL); - } - - /** - * {@inheritdoc} - */ - public function supports(IconsetInterface $iconset) { - // Check if the iconset supports this handler. - return $iconset->getType() === 'codepoints'; + return new CodepointsAsset($asset_info); } /** * */ public function build($icon_id, AssetInterface $iconset, array $options = []) { - // @todo don't hardcode this here + $config = $this->configuration; return [ - "#type" => "html_tag", - "#tag" => "span", - "#value" => $icon_id, - "#attributes" => [ - "class" => [ - "material-icons-outlined", - ], + '#type' => 'inline_template', + "#template" => $config['template'], + "#context" => [ + 'icon_id' => $icon_id, ], "#attached" => [ "library" => [ - "ui_icons_test/material", + $config['library'], ], ], ]; @@ -74,7 +57,18 @@ public function getJsSettings() { */ public function formatJson(AssetInterface $asset) { // @todo Implement formatJson() method. - return []; + // return []; + $icons = $asset->getIcons(); + $formatted_icons = []; + + foreach ($icons as $icon_id => $icon_data) { + $formatted_icons[] = [ + 'id' => $icon_id, + 'label' => $icon_data['label'], + ]; + } + + return json_encode($formatted_icons); } } From 9e19687a1eb6bef102434b13ff5c5b3c9318c031 Mon Sep 17 00:00:00 2001 From: Cellou Diallo Date: Mon, 10 Jun 2024 16:12:22 +0200 Subject: [PATCH 6/8] Move tests folder to the right place --- .../modules/ui_icons_test/ui_icons_test.iconset.yml | 0 .../tests => tests}/modules/ui_icons_test/ui_icons_test.info.yml | 0 .../modules/ui_icons_test/ui_icons_test.libraries.yml | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {modules/ui_icons_library/tests => tests}/modules/ui_icons_test/ui_icons_test.iconset.yml (100%) rename {modules/ui_icons_library/tests => tests}/modules/ui_icons_test/ui_icons_test.info.yml (100%) rename {modules/ui_icons_library/tests => tests}/modules/ui_icons_test/ui_icons_test.libraries.yml (100%) diff --git a/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml b/tests/modules/ui_icons_test/ui_icons_test.iconset.yml similarity index 100% rename from modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.iconset.yml rename to tests/modules/ui_icons_test/ui_icons_test.iconset.yml diff --git a/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.info.yml b/tests/modules/ui_icons_test/ui_icons_test.info.yml similarity index 100% rename from modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.info.yml rename to tests/modules/ui_icons_test/ui_icons_test.info.yml diff --git a/modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.libraries.yml b/tests/modules/ui_icons_test/ui_icons_test.libraries.yml similarity index 100% rename from modules/ui_icons_library/tests/modules/ui_icons_test/ui_icons_test.libraries.yml rename to tests/modules/ui_icons_test/ui_icons_test.libraries.yml From dc1ce475b8d29405d5b8ad86d44e9e4fadd2c148 Mon Sep 17 00:00:00 2001 From: Cellou Diallo Date: Sat, 15 Jun 2024 06:00:42 +0200 Subject: [PATCH 7/8] Rename DSFR Remix Icons to Remix Icons and add DSFR Icons --- tests/modules/ui_icons_test/ui_icons_test.iconset.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/modules/ui_icons_test/ui_icons_test.iconset.yml b/tests/modules/ui_icons_test/ui_icons_test.iconset.yml index 66a6580..b1b13b3 100644 --- a/tests/modules/ui_icons_test/ui_icons_test.iconset.yml +++ b/tests/modules/ui_icons_test/ui_icons_test.iconset.yml @@ -4,8 +4,14 @@ bootstrap_icons: assets: - '/libraries/bootstrap-icons/icons' -dsfr_remixicons: - label: 'DSFR Remix Icons' +dsfr: + label: 'DSFR' + plugin: 'svg' + assets: + - '/libraries/dsfr/src/core/icon/buildings' + +remixicons: + label: 'Remix Icons' plugin: 'svg' assets: - '/libraries/remixicons/icons' From bb0b48d39493d788aeb2c31dc5d9605d1406934b Mon Sep 17 00:00:00 2001 From: Cellou Diallo Date: Sat, 15 Jun 2024 07:45:53 +0200 Subject: [PATCH 8/8] Implement five iconsets of Material icons --- .../ui_icons_test/ui_icons_test.iconset.yml | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/tests/modules/ui_icons_test/ui_icons_test.iconset.yml b/tests/modules/ui_icons_test/ui_icons_test.iconset.yml index b1b13b3..a8bb271 100644 --- a/tests/modules/ui_icons_test/ui_icons_test.iconset.yml +++ b/tests/modules/ui_icons_test/ui_icons_test.iconset.yml @@ -8,7 +8,7 @@ dsfr: label: 'DSFR' plugin: 'svg' assets: - - '/libraries/dsfr/src/core/icon/buildings' + - '/libraries/dsfr/src/core/icon' remixicons: label: 'Remix Icons' @@ -33,7 +33,7 @@ uswsd: - '/libraries/uswds/packages/usa-icon/src/img/uswds-icons' material_icons_outlined: - label: 'Material icons Outlined' + label: 'Material Icons Outlined' plugin: 'codepoints' config: template : '{{ icon_id }}' @@ -42,7 +42,7 @@ material_icons_outlined: - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIconsOutlined-Regular.codepoints' material_icons_round: - label: 'Material Icon Round' + label: 'Material Icons Round' plugin: 'codepoints' config: template: '{{ icon_id }}' @@ -50,4 +50,29 @@ material_icons_round: assets: - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIconsRound-Regular.codepoints' +material_icons_sharp: + label: 'Material Icons Sharp' + plugin: 'codepoints' + config: + template: '{{ icon_id }}' + library: 'ui_icons_test/material' + assets: + - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIconsSharp-Regular.codepoints' +material_icons_two_tone: + label: 'Material Icons Two Tone' + plugin: 'codepoints' + config: + template: '{{ icon_id }}' + library: 'ui_icons_test/material' + assets: + - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIconsTwoTone-Regular.codepoints' + +material_icons_filled: + label: 'Material Icons' + plugin: 'codepoints' + config: + template: '{{ icon_id }}' + library: 'ui_icons_test/material' + assets: + - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIcons-Regular.codepoints'