From 671bae46099df1b12527198ab6c264fc26058627 Mon Sep 17 00:00:00 2001 From: WouterRademaker Date: Tue, 29 Jul 2025 23:03:32 +0200 Subject: [PATCH 01/10] styles and power transforms --- README.md | 41 +++++++++++++++++++++++- src/IconRenderers/JavascriptRenderer.php | 20 ++++++++++-- src/IconRenderers/WebfontRenderer.php | 16 +++++++-- 3 files changed, 70 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 92c3c96..c9fcd26 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,46 @@ For valid icon names see https://fontawesome.com/v7/search. **Example:** `{{#fab:wikipedia-w fa-spin}}` will insert a spinning Wikipedia-W -For valid Font Awesome class names see https://docs.fontawesome.com/web/style/styling. +* `{{#far:...|...}}` to insert an icon from the FontAwesome Regular font with additional styling +* `{{#fas:...|...}}` to insert an icon from the FontAwesome Solid font with additional styling +* `{{#fab:...|...}}` to insert an icon from the FontAwesome Brands font with additional styling + +**Example:** +`{{#fab:wikipedia-w|background:MistyRose;color:Tomato;}}` will insert a red Wikipedia-W on a pink background +`{{#fab:wikipedia-w fa-rotate-by|--fa-rotate-angle:45deg;}}` will insert a 45 degrees rotated Wikipedia-W + +For valid Font Awesome class names and custom properties see https://docs.fontawesome.com/web/style/style-cheatsheet. + +### Power Transforms +Only SVG with JavaScript render mode. +* `{{#far:...|...|...}}` to insert an icon from the FontAwesome Regular font with Power Transforms +* `{{#fas:...|...|...}}` to insert an icon from the FontAwesome Solid font with Power Transforms +* `{{#fab:...|...|...}}` to insert an icon from the FontAwesome Brands font with Power Transforms + +**Example:** +`{{#fab:wikipedia-w||up-6 shrink-8 }}` will insert a scaled-down and shifted-upward Wikipedia-W + +For valid Font Awesome Power Transforms see https://docs.fontawesome.com/web/style/power-transform + +### Stacking +Some HTML code is required for stacking. In MediaWiki code, spaces and new lines do matter. + +**Example:** +`{{#fas:camera fa-stack-1x}}{{#fas:ban fa-stack-2x|color:Tomato}}` will insert a no photography sign + +For further explanation, see https://docs.fontawesome.com/web/style/stack + +### Layering +Only SVG with JavaScript render mode. Some HTML code is required for stacking. In MediaWiki code, spaces and new lines do matter. + +**Example:** +`{{#fas:circle|color:Tomato}}{{#fas:times fa-inverse||shrink-6}}` will insert a white X on a red circle. + +For further explanation, see https://docs.fontawesome.com/web/style/layer + +**Comprehensive example:** +`
{{#fas:circle|color:Tomato}}{{#fas:times fa-inverse||shrink-6}}{{#fas:bookmark}}{{#fas:heart fa-inverse|color:Tomato|shrink-10 up-2}}{{#fas:play||rotate--90 grow-4}}{{#fas:sun fa-inverse||shrink-10 up-2}}{{#fas:moon fa-inverse||shrink-11 down-4.2 left-4}}{{#fas:star fa-inverse||shrink-11 down-4.2 right-4}}{{#fas:calendar}}27{{#fas:certificate}}NEW{{#fas:envelope}}1,419
` +Only SVG with JavaScript render mode. ## Professional Support diff --git a/src/IconRenderers/JavascriptRenderer.php b/src/IconRenderers/JavascriptRenderer.php index ed3618f..222395a 100644 --- a/src/IconRenderers/JavascriptRenderer.php +++ b/src/IconRenderers/JavascriptRenderer.php @@ -37,11 +37,16 @@ * @ingroup FontAwesome */ class JavascriptRenderer implements IconRenderer { - + /** + * @var bool Tracks whether the ResourceLoader module has been registered + */ private bool $isModuleRegistered = false; private string $magicWord; + /** + * @var string CSS class for the font + */ private string $fontClass; public function __construct( @@ -61,8 +66,17 @@ public function __construct( */ public function render( Parser $parser, PPFrame $frame, array $args ): string { $this->registerRlModule( $parser ); - - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + switch (count($args)) { + case 1: + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + case 2: + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] , + 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); + default: + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] , + 'style' => trim( $frame->expand( $args[ 1 ] ) ) , + 'data-fa-transform' => trim( $frame->expand( $args[ 2 ] ) ) ] ); + } } private function registerRlModule( Parser $parser ): void { diff --git a/src/IconRenderers/WebfontRenderer.php b/src/IconRenderers/WebfontRenderer.php index a2cb4e3..4849889 100644 --- a/src/IconRenderers/WebfontRenderer.php +++ b/src/IconRenderers/WebfontRenderer.php @@ -37,11 +37,16 @@ * @ingroup FontAwesome */ class WebfontRenderer implements IconRenderer { - + /** + * @var bool Tracks whether the ResourceLoader module has been registered + */ private bool $isModuleRegistered = false; private string $magicWord; + /** + * @var string CSS class for the font + */ private string $fontClass; public function __construct( @@ -61,8 +66,13 @@ public function __construct( */ public function render( Parser $parser, PPFrame $frame, array $args ): string { $this->registerRlModule( $parser ); - - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + switch (count($args)) { + case 1: + return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + default: + return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); + } } /** From de077114d52e64f1198b6b5ce4e026f746cb7c99 Mon Sep 17 00:00:00 2001 From: WouterRademaker Date: Tue, 29 Jul 2025 23:24:24 +0200 Subject: [PATCH 02/10] typo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c9fcd26..be63007 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ Only SVG with JavaScript render mode. For valid Font Awesome Power Transforms see https://docs.fontawesome.com/web/style/power-transform ### Stacking -Some HTML code is required for stacking. In MediaWiki code, spaces and new lines do matter. +Some HTML code is required for stacking. Remember in MediaWiki code, spaces and new lines do matter. **Example:** `{{#fas:camera fa-stack-1x}}{{#fas:ban fa-stack-2x|color:Tomato}}` will insert a no photography sign @@ -107,7 +107,7 @@ Some HTML code is required for stacking. In MediaWiki code, spaces and new lines For further explanation, see https://docs.fontawesome.com/web/style/stack ### Layering -Only SVG with JavaScript render mode. Some HTML code is required for stacking. In MediaWiki code, spaces and new lines do matter. +Only SVG with JavaScript render mode. Some HTML code is required for layering. Remember in MediaWiki code, spaces and new lines do matter. **Example:** `{{#fas:circle|color:Tomato}}{{#fas:times fa-inverse||shrink-6}}` will insert a white X on a red circle. From 9c9d10a2c120f6aca5d0c38a789730fb8a0502ec Mon Sep 17 00:00:00 2001 From: WouterRademaker Date: Wed, 30 Jul 2025 22:15:51 +0200 Subject: [PATCH 03/10] layout --- README.md | 8 +++++--- src/IconRenderers/JavascriptRenderer.php | 3 +++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index be63007..cc0a1eb 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ Only SVG with JavaScript render mode. For valid Font Awesome Power Transforms see https://docs.fontawesome.com/web/style/power-transform ### Stacking -Some HTML code is required for stacking. Remember in MediaWiki code, spaces and new lines do matter. +Some HTML code is required for stacking. Remember, in MediaWiki code, spaces and new lines do matter. **Example:** `{{#fas:camera fa-stack-1x}}{{#fas:ban fa-stack-2x|color:Tomato}}` will insert a no photography sign @@ -107,7 +107,7 @@ Some HTML code is required for stacking. Remember in MediaWiki code, spaces and For further explanation, see https://docs.fontawesome.com/web/style/stack ### Layering -Only SVG with JavaScript render mode. Some HTML code is required for layering. Remember in MediaWiki code, spaces and new lines do matter. +Only SVG with JavaScript render mode. Some HTML code is required for layering. Remember, in MediaWiki code, spaces and new lines do matter. **Example:** `{{#fas:circle|color:Tomato}}{{#fas:times fa-inverse||shrink-6}}` will insert a white X on a red circle. @@ -115,9 +115,11 @@ Only SVG with JavaScript render mode. Some HTML code is required for layering. R For further explanation, see https://docs.fontawesome.com/web/style/layer **Comprehensive example:** -`
{{#fas:circle|color:Tomato}}{{#fas:times fa-inverse||shrink-6}}{{#fas:bookmark}}{{#fas:heart fa-inverse|color:Tomato|shrink-10 up-2}}{{#fas:play||rotate--90 grow-4}}{{#fas:sun fa-inverse||shrink-10 up-2}}{{#fas:moon fa-inverse||shrink-11 down-4.2 left-4}}{{#fas:star fa-inverse||shrink-11 down-4.2 right-4}}{{#fas:calendar}}27{{#fas:certificate}}NEW{{#fas:envelope}}1,419
` Only SVG with JavaScript render mode. +`
{{#fas:circle|color:Tomato}}{{#fas:times fa-inverse||shrink-6}}{{#fas:bookmark}}{{#fas:heart fa-inverse|color:Tomato|shrink-10 up-2}}{{#fas:play||rotate--90 grow-4}}{{#fas:sun fa-inverse||shrink-10 up-2}}{{#fas:moon fa-inverse||shrink-11 down-4.2 left-4}}{{#fas:star fa-inverse||shrink-11 down-4.2 right-4}}{{#fas:calendar}}27{{#fas:certificate}}NEW{{#fas:envelope}}1,419
` + + ## Professional Support The FontAwesome extension is maintained by [Professional Wiki](https://professional.wiki). diff --git a/src/IconRenderers/JavascriptRenderer.php b/src/IconRenderers/JavascriptRenderer.php index 222395a..78caee1 100644 --- a/src/IconRenderers/JavascriptRenderer.php +++ b/src/IconRenderers/JavascriptRenderer.php @@ -79,6 +79,9 @@ public function render( Parser $parser, PPFrame $frame, array $args ): string { } } + /** + * @param Parser + */ private function registerRlModule( Parser $parser ): void { if ( $this->isModuleRegistered ) { return; From ba079fa81a5af0e74c310fc303a50fe6e850184a Mon Sep 17 00:00:00 2001 From: WouterRademaker Date: Wed, 30 Jul 2025 23:04:20 +0200 Subject: [PATCH 04/10] Run phpcbf --- src/IconRenderers/JavascriptRenderer.php | 160 ++++++++++++++--------- src/IconRenderers/WebfontRenderer.php | 148 ++++++++++++--------- 2 files changed, 181 insertions(+), 127 deletions(-) diff --git a/src/IconRenderers/JavascriptRenderer.php b/src/IconRenderers/JavascriptRenderer.php index 78caee1..9991167 100644 --- a/src/IconRenderers/JavascriptRenderer.php +++ b/src/IconRenderers/JavascriptRenderer.php @@ -1,6 +1,6 @@ magicWord = $magicWord; - $this->fontClass = $fontClass; - } - - /** - * @param Parser $parser - * @param PPFrame $frame - * @param string[] $args - * - * @return string - */ - public function render( Parser $parser, PPFrame $frame, array $args ): string { - $this->registerRlModule( $parser ); - switch (count($args)) { - case 1: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); - case 2: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] , - 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); - default: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] , - 'style' => trim( $frame->expand( $args[ 1 ] ) ) , - 'data-fa-transform' => trim( $frame->expand( $args[ 2 ] ) ) ] ); - } - } - - /** - * @param Parser - */ - private function registerRlModule( Parser $parser ): void { - if ( $this->isModuleRegistered ) { - return; - } - - $this->isModuleRegistered = true; - $parser->getOutput()->addModules( $this->getFontModules() ); - } - - /** - * @return string[] - */ - private function getFontModules(): array { - return [ 'ext.fontawesome.' . $this->magicWord ]; - } - -} +class JavascriptRenderer implements IconRenderer +{ + + /** + * @var boolean Tracks whether the ResourceLoader module has been registered + */ + private bool $isModuleRegistered = false; + + private string $magicWord; + + /** + * @var string CSS class for the font + */ + private string $fontClass; + + + public function __construct( + string $magicWord, + string $fontClass + ) { + $this->magicWord = $magicWord; + $this->fontClass = $fontClass; + + }//end __construct() + + + /** + * @param Parser $parser + * @param PPFrame $frame + * @param string[] $args + * + * @return string + */ + public function render(Parser $parser, PPFrame $frame, array $args): string + { + $this->registerRlModule($parser); + switch (count($args)) { + case 1: + return Html::element('i', [ 'class' => [ $this->fontClass, 'fa-'.trim($frame->expand($args[0])) ] ]); + case 2: + return Html::element( + 'i', + [ + 'class' => [ + $this->fontClass, + 'fa-'.trim($frame->expand($args[0])), + ], + 'style' => trim($frame->expand($args[1])), + ] + ); + default: + return Html::element( + 'i', + [ + 'class' => [ + $this->fontClass, + 'fa-'.trim($frame->expand($args[0])), + ], + 'style' => trim($frame->expand($args[1])), + 'data-fa-transform' => trim($frame->expand($args[2])), + ] + ); + }//end switch + + }//end render() + + + /** + * @param Parser + */ + private function registerRlModule(Parser $parser): void + { + if ($this->isModuleRegistered) { + return; + } + + $this->isModuleRegistered = true; + $parser->getOutput()->addModules($this->getFontModules()); + + }//end registerRlModule() + + + /** + * @return string[] + */ + private function getFontModules(): array + { + return [ 'ext.fontawesome.'.$this->magicWord ]; + + }//end getFontModules() + + +}//end class diff --git a/src/IconRenderers/WebfontRenderer.php b/src/IconRenderers/WebfontRenderer.php index 4849889..52a30a0 100644 --- a/src/IconRenderers/WebfontRenderer.php +++ b/src/IconRenderers/WebfontRenderer.php @@ -1,6 +1,6 @@ magicWord = $magicWord; - $this->fontClass = $fontClass; - } - - /** - * @param Parser $parser - * @param PPFrame $frame - * @param string[] $args - * - * @return string - */ - public function render( Parser $parser, PPFrame $frame, array $args ): string { - $this->registerRlModule( $parser ); - switch (count($args)) { - case 1: - return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); - default: - return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], - 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); - } - } - - /** - * @param Parser $parser - */ - private function registerRlModule( Parser $parser ) { - if ( $this->isModuleRegistered ) { - return; - } - - $this->isModuleRegistered = true; - - $parser->getOutput()->addModuleStyles( $this->getFontModules() ); - } - - /** - * @return string[] - */ - private function getFontModules(): array { - return [ 'ext.fontawesome' => 'ext.fontawesome', 'ext.fontawesome.' . $this->magicWord ]; - } - -} +class WebfontRenderer implements IconRenderer +{ + + /** + * @var boolean Tracks whether the ResourceLoader module has been registered + */ + private bool $isModuleRegistered = false; + + private string $magicWord; + + /** + * @var string CSS class for the font + */ + private string $fontClass; + + + public function __construct( + string $magicWord, + string $fontClass + ) { + $this->magicWord = $magicWord; + $this->fontClass = $fontClass; + + }//end __construct() + + + /** + * @param Parser $parser + * @param PPFrame $frame + * @param string[] $args + * + * @return string + */ + public function render(Parser $parser, PPFrame $frame, array $args): string + { + $this->registerRlModule($parser); + switch (count($args)) { + case 1: + return Html::element('i', ['class' => [ $this->fontClass, 'fa-'.trim($frame->expand($args[0])) ] ]); + default: + return Html::element( + 'i', + [ + 'class' => [ + $this->fontClass, + 'fa-'.trim($frame->expand($args[0])), + ], + 'style' => trim($frame->expand($args[1])), + ] + ); + } + + }//end render() + + + /** + * @param Parser $parser + */ + private function registerRlModule(Parser $parser) + { + if ($this->isModuleRegistered) { + return; + } + + $this->isModuleRegistered = true; + + $parser->getOutput()->addModuleStyles($this->getFontModules()); + + }//end registerRlModule() + + + /** + * @return string[] + */ + private function getFontModules(): array + { + return [ + 'ext.fontawesome' => 'ext.fontawesome', 'ext.fontawesome.'.$this->magicWord + ]; + + }//end getFontModules() + + +}//end class From 1b14ca2be30e1dba9aa549901dd891f67f32c303 Mon Sep 17 00:00:00 2001 From: WouterRademaker Date: Thu, 31 Jul 2025 00:09:25 +0200 Subject: [PATCH 05/10] fix errors by hand --- src/IconRenderers/JavascriptRenderer.php | 157 +++++++++-------------- src/IconRenderers/WebfontRenderer.php | 148 +++++++++------------ 2 files changed, 124 insertions(+), 181 deletions(-) diff --git a/src/IconRenderers/JavascriptRenderer.php b/src/IconRenderers/JavascriptRenderer.php index 9991167..a75916a 100644 --- a/src/IconRenderers/JavascriptRenderer.php +++ b/src/IconRenderers/JavascriptRenderer.php @@ -1,6 +1,6 @@ magicWord = $magicWord; - $this->fontClass = $fontClass; - - }//end __construct() - - - /** - * @param Parser $parser - * @param PPFrame $frame - * @param string[] $args - * - * @return string - */ - public function render(Parser $parser, PPFrame $frame, array $args): string - { - $this->registerRlModule($parser); - switch (count($args)) { - case 1: - return Html::element('i', [ 'class' => [ $this->fontClass, 'fa-'.trim($frame->expand($args[0])) ] ]); - case 2: - return Html::element( - 'i', - [ - 'class' => [ - $this->fontClass, - 'fa-'.trim($frame->expand($args[0])), - ], - 'style' => trim($frame->expand($args[1])), - ] - ); - default: - return Html::element( - 'i', - [ - 'class' => [ - $this->fontClass, - 'fa-'.trim($frame->expand($args[0])), - ], - 'style' => trim($frame->expand($args[1])), - 'data-fa-transform' => trim($frame->expand($args[2])), - ] - ); - }//end switch - - }//end render() - - - /** - * @param Parser - */ - private function registerRlModule(Parser $parser): void - { - if ($this->isModuleRegistered) { - return; - } - - $this->isModuleRegistered = true; - $parser->getOutput()->addModules($this->getFontModules()); - - }//end registerRlModule() - - - /** - * @return string[] - */ - private function getFontModules(): array - { - return [ 'ext.fontawesome.'.$this->magicWord ]; - - }//end getFontModules() - - -}//end class +class JavascriptRenderer implements IconRenderer { + /** + * @var bool Tracks whether the ResourceLoader module has been registered + */ + private bool $isModuleRegistered = false; + + private string $magicWord; + + /** + * @var string CSS class for the font + */ + private string $fontClass; + + public function __construct( + string $magicWord, + string $fontClass + ) { + $this->magicWord = $magicWord; + $this->fontClass = $fontClass; + } + + /** + * @param Parser $parser + * @param PPFrame $frame + * @param string[] $args + * + * @return string + */ + public function render( Parser $parser, PPFrame $frame, array $args ): string { + $this->registerRlModule( $parser ); + switch (count($args)) { + case 1: + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + case 2: + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); + default: + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + 'style' => trim( $frame->expand( $args[ 1 ] ) ), + 'data-fa-transform' => trim( $frame->expand( $args[ 2 ] ) ) ] ); + } + } + + private function registerRlModule( Parser $parser ): void { + if ( $this->isModuleRegistered ) { + return; + } + + $this->isModuleRegistered = true; + $parser->getOutput()->addModules( $this->getFontModules() ); + } + + /** + * @return string[] + */ + private function getFontModules(): array { + return [ 'ext.fontawesome.' . $this->magicWord ]; + } + +} diff --git a/src/IconRenderers/WebfontRenderer.php b/src/IconRenderers/WebfontRenderer.php index 52a30a0..0af722e 100644 --- a/src/IconRenderers/WebfontRenderer.php +++ b/src/IconRenderers/WebfontRenderer.php @@ -1,6 +1,6 @@ magicWord = $magicWord; - $this->fontClass = $fontClass; - - }//end __construct() - - - /** - * @param Parser $parser - * @param PPFrame $frame - * @param string[] $args - * - * @return string - */ - public function render(Parser $parser, PPFrame $frame, array $args): string - { - $this->registerRlModule($parser); - switch (count($args)) { - case 1: - return Html::element('i', ['class' => [ $this->fontClass, 'fa-'.trim($frame->expand($args[0])) ] ]); - default: - return Html::element( - 'i', - [ - 'class' => [ - $this->fontClass, - 'fa-'.trim($frame->expand($args[0])), - ], - 'style' => trim($frame->expand($args[1])), - ] - ); - } - - }//end render() - - - /** - * @param Parser $parser - */ - private function registerRlModule(Parser $parser) - { - if ($this->isModuleRegistered) { - return; - } - - $this->isModuleRegistered = true; - - $parser->getOutput()->addModuleStyles($this->getFontModules()); - - }//end registerRlModule() - - - /** - * @return string[] - */ - private function getFontModules(): array - { - return [ - 'ext.fontawesome' => 'ext.fontawesome', 'ext.fontawesome.'.$this->magicWord - ]; - - }//end getFontModules() - - -}//end class +class WebfontRenderer implements IconRenderer { + /** + * @var bool Tracks whether the ResourceLoader module has been registered + */ + private bool $isModuleRegistered = false; + + private string $magicWord; + + /** + * @var string CSS class for the font + */ + private string $fontClass; + + public function __construct( + string $magicWord, + string $fontClass + ) { + $this->magicWord = $magicWord; + $this->fontClass = $fontClass; + } + + /** + * @param Parser $parser + * @param PPFrame $frame + * @param string[] $args + * + * @return string + */ + public function render( Parser $parser, PPFrame $frame, array $args ): string { + $this->registerRlModule( $parser ); + switch (count($args)) { + case 1: + return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + default: + return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); + } + } + + /** + * @param Parser $parser + */ + private function registerRlModule( Parser $parser ) { + if ( $this->isModuleRegistered ) { + return; + } + + $this->isModuleRegistered = true; + + $parser->getOutput()->addModuleStyles( $this->getFontModules() ); + } + + /** + * @return string[] + */ + private function getFontModules(): array { + return [ 'ext.fontawesome' => 'ext.fontawesome', 'ext.fontawesome.' . $this->magicWord ]; + } + +} From 53c1f4cca4fb9f702cdec364f2d13b01e86e6404 Mon Sep 17 00:00:00 2001 From: WouterRademaker Date: Thu, 31 Jul 2025 00:31:23 +0200 Subject: [PATCH 06/10] fix errors by hand 2 --- src/IconRenderers/WebfontRenderer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/IconRenderers/WebfontRenderer.php b/src/IconRenderers/WebfontRenderer.php index 0af722e..db51ebf 100644 --- a/src/IconRenderers/WebfontRenderer.php +++ b/src/IconRenderers/WebfontRenderer.php @@ -68,9 +68,9 @@ public function render( Parser $parser, PPFrame $frame, array $args ): string { $this->registerRlModule( $parser ); switch (count($args)) { case 1: - return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); default: - return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); } } From 3898fd3aea69699527857134919e705b2dea4eb1 Mon Sep 17 00:00:00 2001 From: WouterRademaker Date: Thu, 31 Jul 2025 00:42:31 +0200 Subject: [PATCH 07/10] fix errors by hand 3 --- src/IconRenderers/JavascriptRenderer.php | 16 ++++++++-------- src/IconRenderers/WebfontRenderer.php | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/IconRenderers/JavascriptRenderer.php b/src/IconRenderers/JavascriptRenderer.php index a75916a..a50b2f1 100644 --- a/src/IconRenderers/JavascriptRenderer.php +++ b/src/IconRenderers/JavascriptRenderer.php @@ -66,17 +66,17 @@ public function __construct( */ public function render( Parser $parser, PPFrame $frame, array $args ): string { $this->registerRlModule( $parser ); - switch (count($args)) { - case 1: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); - case 2: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + switch (count($args)) { + case 1: + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + case 2: + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); - default: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + default: + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], 'style' => trim( $frame->expand( $args[ 1 ] ) ), 'data-fa-transform' => trim( $frame->expand( $args[ 2 ] ) ) ] ); - } + } } private function registerRlModule( Parser $parser ): void { diff --git a/src/IconRenderers/WebfontRenderer.php b/src/IconRenderers/WebfontRenderer.php index db51ebf..b6cf269 100644 --- a/src/IconRenderers/WebfontRenderer.php +++ b/src/IconRenderers/WebfontRenderer.php @@ -68,9 +68,9 @@ public function render( Parser $parser, PPFrame $frame, array $args ): string { $this->registerRlModule( $parser ); switch (count($args)) { case 1: - return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); default: - return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); } } From 771c5efa7daa2242ff1afc36626b1831936f9066 Mon Sep 17 00:00:00 2001 From: WouterRademaker Date: Thu, 31 Jul 2025 00:55:03 +0200 Subject: [PATCH 08/10] fix warnings by hand --- src/IconRenderers/JavascriptRenderer.php | 12 ++++++------ src/IconRenderers/WebfontRenderer.php | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/IconRenderers/JavascriptRenderer.php b/src/IconRenderers/JavascriptRenderer.php index a50b2f1..ebddca0 100644 --- a/src/IconRenderers/JavascriptRenderer.php +++ b/src/IconRenderers/JavascriptRenderer.php @@ -66,16 +66,16 @@ public function __construct( */ public function render( Parser $parser, PPFrame $frame, array $args ): string { $this->registerRlModule( $parser ); - switch (count($args)) { + switch ( count( $args ) ) { case 1: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); case 2: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], - 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); default: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], 'style' => trim( $frame->expand( $args[ 1 ] ) ), - 'data-fa-transform' => trim( $frame->expand( $args[ 2 ] ) ) ] ); + 'data-fa-transform' => trim( $frame->expand( $args[ 2 ] ) ) ] ); } } diff --git a/src/IconRenderers/WebfontRenderer.php b/src/IconRenderers/WebfontRenderer.php index b6cf269..9e58703 100644 --- a/src/IconRenderers/WebfontRenderer.php +++ b/src/IconRenderers/WebfontRenderer.php @@ -66,11 +66,11 @@ public function __construct( */ public function render( Parser $parser, PPFrame $frame, array $args ): string { $this->registerRlModule( $parser ); - switch (count($args)) { + switch ( count( $args ) ) { case 1: - return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); default: - return Html::element( 'i', ['class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); } } From e860fe1c639ac66ca27790bceb5e8ca2ad1bd3d9 Mon Sep 17 00:00:00 2001 From: WouterRademaker Date: Thu, 31 Jul 2025 01:07:09 +0200 Subject: [PATCH 09/10] fix warnings by hand 2 --- src/IconRenderers/JavascriptRenderer.php | 15 +++++++++------ src/IconRenderers/WebfontRenderer.php | 8 +++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/IconRenderers/JavascriptRenderer.php b/src/IconRenderers/JavascriptRenderer.php index ebddca0..af9d8cc 100644 --- a/src/IconRenderers/JavascriptRenderer.php +++ b/src/IconRenderers/JavascriptRenderer.php @@ -68,14 +68,17 @@ public function render( Parser $parser, PPFrame $frame, array $args ): string { $this->registerRlModule( $parser ); switch ( count( $args ) ) { case 1: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + return Html::element( 'i', [ 'class' => [ $this->fontClass, + 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); case 2: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], - 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); + return Html::element( 'i', [ 'class' => [ $this->fontClass, + 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); default: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], - 'style' => trim( $frame->expand( $args[ 1 ] ) ), - 'data-fa-transform' => trim( $frame->expand( $args[ 2 ] ) ) ] ); + return Html::element( 'i', [ 'class' => [ $this->fontClass, + 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + 'style' => trim( $frame->expand( $args[ 1 ] ) ), + 'data-fa-transform' => trim( $frame->expand( $args[ 2 ] ) ) ] ); } } diff --git a/src/IconRenderers/WebfontRenderer.php b/src/IconRenderers/WebfontRenderer.php index 9e58703..295ea0c 100644 --- a/src/IconRenderers/WebfontRenderer.php +++ b/src/IconRenderers/WebfontRenderer.php @@ -68,10 +68,12 @@ public function render( Parser $parser, PPFrame $frame, array $args ): string { $this->registerRlModule( $parser ); switch ( count( $args ) ) { case 1: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); + return Html::element( 'i', [ 'class' => [ $this->fontClass, + 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); default: - return Html::element( 'i', [ 'class' => [ $this->fontClass, 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], - 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); + return Html::element( 'i', [ 'class' => [ $this->fontClass, + 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], + 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); } } From 20f5bd16c1778586e2f3700a74c27c6f8d1b186f Mon Sep 17 00:00:00 2001 From: WouterRademaker Date: Thu, 31 Jul 2025 11:19:03 +0200 Subject: [PATCH 10/10] Refactor --- src/IconRenderers/JavascriptRenderer.php | 28 +++++++++++++----------- src/IconRenderers/WebfontRenderer.php | 17 +++++++------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/IconRenderers/JavascriptRenderer.php b/src/IconRenderers/JavascriptRenderer.php index af9d8cc..68bd32d 100644 --- a/src/IconRenderers/JavascriptRenderer.php +++ b/src/IconRenderers/JavascriptRenderer.php @@ -66,20 +66,22 @@ public function __construct( */ public function render( Parser $parser, PPFrame $frame, array $args ): string { $this->registerRlModule( $parser ); - switch ( count( $args ) ) { - case 1: - return Html::element( 'i', [ 'class' => [ $this->fontClass, - 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); - case 2: - return Html::element( 'i', [ 'class' => [ $this->fontClass, - 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], - 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); - default: - return Html::element( 'i', [ 'class' => [ $this->fontClass, - 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], - 'style' => trim( $frame->expand( $args[ 1 ] ) ), - 'data-fa-transform' => trim( $frame->expand( $args[ 2 ] ) ) ] ); + $iconClass = 'fa-' . trim( $frame->expand( $args[0] ) ); + $attributes = [ 'class' => [ $this->fontClass, $iconClass ] ]; + + if ( count( $args ) > 1 ) { + $style = trim( $frame->expand( $args[1] ) ); + // Consider adding HTML sanitization for the style attribute + $attributes['style'] = $style; + } + + if ( count( $args ) > 2 ) { + $transform = trim( $frame->expand( $args[2] ) ); + // Consider adding validation for FontAwesome transform syntax + $attributes['data-fa-transform'] = $transform; } + + return Html::element( 'i', $attributes ); } private function registerRlModule( Parser $parser ): void { diff --git a/src/IconRenderers/WebfontRenderer.php b/src/IconRenderers/WebfontRenderer.php index 295ea0c..7d11c42 100644 --- a/src/IconRenderers/WebfontRenderer.php +++ b/src/IconRenderers/WebfontRenderer.php @@ -66,15 +66,16 @@ public function __construct( */ public function render( Parser $parser, PPFrame $frame, array $args ): string { $this->registerRlModule( $parser ); - switch ( count( $args ) ) { - case 1: - return Html::element( 'i', [ 'class' => [ $this->fontClass, - 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ] ] ); - default: - return Html::element( 'i', [ 'class' => [ $this->fontClass, - 'fa-' . trim( $frame->expand( $args[ 0 ] ) ) ], - 'style' => trim( $frame->expand( $args[ 1 ] ) ) ] ); + $iconClass = 'fa-' . trim( $frame->expand( $args[0] ) ); + $attributes = [ 'class' => [ $this->fontClass, $iconClass ] ]; + + if ( count( $args ) > 1 ) { + $style = trim( $frame->expand( $args[1] ) ); + // Consider adding HTML sanitization for the style attribute + $attributes['style'] = $style; } + + return Html::element( 'i', $attributes ); } /**