From 5acfda8ae5acb58d527189a2457f16e49b3ec3eb Mon Sep 17 00:00:00 2001 From: "Angelo D. Moura" Date: Tue, 20 Oct 2020 23:38:56 +0100 Subject: [PATCH] [TWIG] Add SVG icon embed function --- .../icons/{attach.svg => attach.svg.twig} | 2 +- .../icons/{avatar.svg => avatar.svg.twig} | 2 +- .../{checkmark.svg => checkmark.svg.twig} | 1 + .../assets/icons/{drop.svg => drop.svg.twig} | 1 + .../icons/{heart.svg => heart.svg.twig} | 2 +- .../assets/icons/{logo.svg => logo.svg.twig} | 2 +- .../assets/icons/{menu.svg => menu.svg.twig} | 2 +- .../icons/{repeat.svg => repeat.svg.twig} | 2 +- .../icons/{reply.svg => reply.svg.twig} | 2 +- .../icons/{search.svg => search.svg.twig} | 2 +- src/Twig/Extension.php | 2 +- src/Twig/IconsExtension.php | 78 +++++++++++++++++++ src/Twig/Runtime.php | 31 ++++++++ templates/base.html.twig | 40 +--------- templates/network/public.html.twig | 4 +- tests/Twig/IconsExtensionTest.php | 68 ++++++++++++++++ 16 files changed, 190 insertions(+), 51 deletions(-) rename public/assets/icons/{attach.svg => attach.svg.twig} (83%) rename public/assets/icons/{avatar.svg => avatar.svg.twig} (65%) rename public/assets/icons/{checkmark.svg => checkmark.svg.twig} (97%) rename public/assets/icons/{drop.svg => drop.svg.twig} (97%) rename public/assets/icons/{heart.svg => heart.svg.twig} (98%) rename public/assets/icons/{logo.svg => logo.svg.twig} (92%) rename public/assets/icons/{menu.svg => menu.svg.twig} (82%) rename public/assets/icons/{repeat.svg => repeat.svg.twig} (89%) rename public/assets/icons/{reply.svg => reply.svg.twig} (75%) rename public/assets/icons/{search.svg => search.svg.twig} (83%) create mode 100644 src/Twig/IconsExtension.php create mode 100644 tests/Twig/IconsExtensionTest.php diff --git a/public/assets/icons/attach.svg b/public/assets/icons/attach.svg.twig similarity index 83% rename from public/assets/icons/attach.svg rename to public/assets/icons/attach.svg.twig index 825b9c3aa0..0cf4b6aedc 100644 --- a/public/assets/icons/attach.svg +++ b/public/assets/icons/attach.svg.twig @@ -1,5 +1,5 @@ - + attach diff --git a/public/assets/icons/avatar.svg b/public/assets/icons/avatar.svg.twig similarity index 65% rename from public/assets/icons/avatar.svg rename to public/assets/icons/avatar.svg.twig index 30d6aae496..6e65450877 100644 --- a/public/assets/icons/avatar.svg +++ b/public/assets/icons/avatar.svg.twig @@ -1,5 +1,5 @@ - + avatar diff --git a/public/assets/icons/checkmark.svg b/public/assets/icons/checkmark.svg.twig similarity index 97% rename from public/assets/icons/checkmark.svg rename to public/assets/icons/checkmark.svg.twig index 9ab653dcf0..75cf0a4b65 100644 --- a/public/assets/icons/checkmark.svg +++ b/public/assets/icons/checkmark.svg.twig @@ -1,5 +1,6 @@ - + heart diff --git a/public/assets/icons/logo.svg b/public/assets/icons/logo.svg.twig similarity index 92% rename from public/assets/icons/logo.svg rename to public/assets/icons/logo.svg.twig index f6d762caef..2507072608 100644 --- a/public/assets/icons/logo.svg +++ b/public/assets/icons/logo.svg.twig @@ -1,5 +1,5 @@ - + logo diff --git a/public/assets/icons/menu.svg b/public/assets/icons/menu.svg.twig similarity index 82% rename from public/assets/icons/menu.svg rename to public/assets/icons/menu.svg.twig index e823add6d9..f47d8eb29b 100644 --- a/public/assets/icons/menu.svg +++ b/public/assets/icons/menu.svg.twig @@ -1,5 +1,5 @@ - + menu diff --git a/public/assets/icons/repeat.svg b/public/assets/icons/repeat.svg.twig similarity index 89% rename from public/assets/icons/repeat.svg rename to public/assets/icons/repeat.svg.twig index 958fca98d7..c16b283a10 100644 --- a/public/assets/icons/repeat.svg +++ b/public/assets/icons/repeat.svg.twig @@ -1,5 +1,5 @@ - + repeat diff --git a/public/assets/icons/reply.svg b/public/assets/icons/reply.svg.twig similarity index 75% rename from public/assets/icons/reply.svg rename to public/assets/icons/reply.svg.twig index 57a3d202a8..462239b9a7 100644 --- a/public/assets/icons/reply.svg +++ b/public/assets/icons/reply.svg.twig @@ -1,5 +1,5 @@ - + reply diff --git a/public/assets/icons/search.svg b/public/assets/icons/search.svg.twig similarity index 83% rename from public/assets/icons/search.svg rename to public/assets/icons/search.svg.twig index 1e00048540..ddc037d4e7 100644 --- a/public/assets/icons/search.svg +++ b/public/assets/icons/search.svg.twig @@ -1,5 +1,5 @@ - + search diff --git a/src/Twig/Extension.php b/src/Twig/Extension.php index 49971fb5cd..3932c4b120 100644 --- a/src/Twig/Extension.php +++ b/src/Twig/Extension.php @@ -31,7 +31,6 @@ namespace App\Twig; use Twig\Extension\AbstractExtension; -use Twig\TwigFilter; use Twig\TwigFunction; class Extension extends AbstractExtension @@ -51,6 +50,7 @@ class Extension extends AbstractExtension new TwigFunction('is_route', [Runtime::class, 'isCurrentRoute']), new TwigFunction('get_note_actions', [Runtime::class, 'getNoteActions']), new TwigFunction('config', [Runtime::class, 'getConfig']), + new TwigFunction('icon', [Runtime::class, 'embedSvgIcon'], ['needs_environment' => true]), ]; } } diff --git a/src/Twig/IconsExtension.php b/src/Twig/IconsExtension.php new file mode 100644 index 0000000000..8e0178595a --- /dev/null +++ b/src/Twig/IconsExtension.php @@ -0,0 +1,78 @@ +. +// }}} + +/** + * GNU social Twig extensions + * + * @package GNUsocial + * @category Twig + * + * @author Ângelo D. Moura + * @copyright 2020 Free Software Foundation, Inc http://www.fsf.org + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later + */ + +namespace App\Twig; + +use Twig\Environment; +use Twig\Error\LoaderError; +use Twig\Error\RuntimeError; +use Twig\Error\SyntaxError; +use Twig\Extension\AbstractExtension; +use Twig\TwigFunction; + +class IconsExtension extends AbstractExtension +{ + public function getFunctions() + { + return [ + new TwigFunction('icon', + [$this, 'embedSvgIcon'], + ['needs_environment' => true] + ), + ]; + } + + /** + * Renders the Svg Icon template and returns it. + * + * @param Environment $twig + * @param string $icon_name + * @param string $icon_css_class + * + * @return string + * + * @author Ângelo D. Moura + */ + public function embedSvgIcon(Environment $twig, string $icon_name = '', string $icon_css_class = '') + { + try { + return $twig->render('@public_path/assets/icons/' . $icon_name . '.svg.twig', ['iconClass' => $icon_css_class]); + } catch (LoaderError $e) { + //return an empty string (a missing icon is not that important of an error) + return ''; + } catch (RuntimeError $e) { + //return an empty string (a missing icon is not that important of an error) + return ''; + } catch (SyntaxError $e) { + //return an empty string (a missing icon is not that important of an error) + return ''; + } + } +} \ No newline at end of file diff --git a/src/Twig/Runtime.php b/src/Twig/Runtime.php index 9b975619ac..9dc5589764 100644 --- a/src/Twig/Runtime.php +++ b/src/Twig/Runtime.php @@ -39,6 +39,10 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\KernelEvents; +use Twig\Environment; +use Twig\Error\LoaderError; +use Twig\Error\RuntimeError; +use Twig\Error\SyntaxError; use Twig\Extension\RuntimeExtensionInterface; class Runtime implements RuntimeExtensionInterface, EventSubscriberInterface @@ -84,4 +88,31 @@ class Runtime implements RuntimeExtensionInterface, EventSubscriberInterface { return [KernelEvents::REQUEST => 'onKernelRequest']; } + + /** + * Renders the Svg Icon template and returns it. + * + * @param Environment $twig + * @param string $icon_name + * @param string $icon_css_class + * + * @return string + * + * @author Ângelo D. Moura + */ + public function embedSvgIcon(Environment $twig, string $icon_name = '', string $icon_css_class = '') + { + try { + return $twig->render('@public_path/assets/icons/' . $icon_name . '.svg.twig', ['iconClass' => $icon_css_class]); + } catch (LoaderError $e) { + //return an empty string (a missing icon is not that important of an error) + return ''; + } catch (RuntimeError $e) { + //return an empty string (a missing icon is not that important of an error) + return ''; + } catch (SyntaxError $e) { + //return an empty string (a missing icon is not that important of an error) + return ''; + } + } } diff --git a/templates/base.html.twig b/templates/base.html.twig index 688e8b5e9b..aa1f8110a3 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -17,42 +17,6 @@ {% endblock %} - {% block icons %} - - {% endblock %}
{% block header %}