summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/plugins/modifier.explode.php25
-rw-r--r--libs/plugins/modifier.number_format.php26
-rw-r--r--libs/plugins/shared.mb_str_replace.php2
-rw-r--r--tests/UnitTests/TemplateSource/TagTests/PluginModifier/PluginModifierExplodeTest.php55
-rw-r--r--tests/UnitTests/TemplateSource/TagTests/PluginModifier/PluginModifierNumberFormatTest.php59
-rw-r--r--tests/UnitTests/TemplateSource/TagTests/PluginModifier/PluginModifierReplaceTest.php54
6 files changed, 220 insertions, 1 deletions
diff --git a/libs/plugins/modifier.explode.php b/libs/plugins/modifier.explode.php
new file mode 100644
index 00000000..5186fde3
--- /dev/null
+++ b/libs/plugins/modifier.explode.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifier
+ */
+
+/**
+ * Smarty explode modifier plugin
+ * Type: modifier
+ * Name: explode
+ * Purpose: split a string by a string
+ *
+ * @param string $separator
+ * @param string $string
+ * @param int|null $limit
+ *
+ * @return array
+ */
+function smarty_modifier_explode($separator, $string, ?int $limit = null)
+{
+ // provide $string default to prevent deprecation errors in PHP >=8.1
+ return explode($separator, $string ?? '', $limit ?? PHP_INT_MAX);
+}
diff --git a/libs/plugins/modifier.number_format.php b/libs/plugins/modifier.number_format.php
new file mode 100644
index 00000000..8c612601
--- /dev/null
+++ b/libs/plugins/modifier.number_format.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifier
+ */
+
+/**
+ * Smarty number_format modifier plugin
+ * Type: modifier
+ * Name: number_format
+ * Purpose: Format a number with grouped thousands
+ *
+ * @param float|null $num
+ * @param int $decimals
+ * @param string|null $decimal_separator
+ * @param string|null $thousands_separator
+ *
+ * @return string
+ */
+function smarty_modifier_number_format(?float $num, int $decimals = 0, ?string $decimal_separator = ".", ?string $thousands_separator = ",")
+{
+ // provide $num default to prevent deprecation errors in PHP >=8.1
+ return number_format($num ?? 0.0, $decimals, $decimal_separator, $thousands_separator);
+}
diff --git a/libs/plugins/shared.mb_str_replace.php b/libs/plugins/shared.mb_str_replace.php
index c6079c12..7e85f7aa 100644
--- a/libs/plugins/shared.mb_str_replace.php
+++ b/libs/plugins/shared.mb_str_replace.php
@@ -62,7 +62,7 @@ if (!function_exists('smarty_mb_str_replace')) {
$replace = mb_convert_encoding($replace, $current_charset, Smarty::$_CHARSET);
}
- $parts = mb_split(preg_quote($search), $subject) ?: array();
+ $parts = mb_split(preg_quote($search), $subject ?? "") ?: array();
// If original regex encoding was not unicode...
if(!$reg_is_unicode) {
// ...restore original regex encoding to avoid breaking the system.
diff --git a/tests/UnitTests/TemplateSource/TagTests/PluginModifier/PluginModifierExplodeTest.php b/tests/UnitTests/TemplateSource/TagTests/PluginModifier/PluginModifierExplodeTest.php
new file mode 100644
index 00000000..b3b9d50e
--- /dev/null
+++ b/tests/UnitTests/TemplateSource/TagTests/PluginModifier/PluginModifierExplodeTest.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace UnitTests\TemplateSource\TagTests\PluginModifier;
+
+/**
+ * class for modifier tests
+ *
+ * @runTestsInSeparateProcess
+ * @preserveGlobalState disabled
+ * @backupStaticAttributes enabled
+ */
+class PluginModifierExplodeTest extends \PHPUnit_Smarty
+{
+ public function setUp(): void
+ {
+ $this->setUpSmarty(__DIR__);
+ }
+
+ /**
+ * @return void
+ * @throws \SmartyException
+ *
+ * @dataProvider explodeDataProvider
+ */
+ public function testExplode($template, $subject, $expectedString)
+ {
+ $this->smarty->assign('subject', $subject);
+
+ $tpl = $this->smarty->createTemplate($template);
+ $res = $this->smarty->fetch($tpl);
+
+ $this->assertEquals($expectedString, $res);
+ }
+
+ public function explodeDataProvider()
+ {
+ return [
+ 'default' => [
+ 'template' => 'string:{","|explode:$subject|json_encode}',
+ 'subject' => 'a,b,c,d',
+ 'expectedString' => '["a","b","c","d"]',
+ ],
+ 'withNoDelimiterFound' => [
+ 'template' => 'string:{","|explode:$subject|json_encode}',
+ 'subject' => 'abcd',
+ 'expectedString' => '["abcd"]',
+ ],
+ 'withNull' => [
+ 'template' => 'string:{","|explode:$subject|json_encode}',
+ 'subject' => null,
+ 'expectedString' => '[""]',
+ ],
+ ];
+ }
+}
diff --git a/tests/UnitTests/TemplateSource/TagTests/PluginModifier/PluginModifierNumberFormatTest.php b/tests/UnitTests/TemplateSource/TagTests/PluginModifier/PluginModifierNumberFormatTest.php
new file mode 100644
index 00000000..27feeac3
--- /dev/null
+++ b/tests/UnitTests/TemplateSource/TagTests/PluginModifier/PluginModifierNumberFormatTest.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace UnitTests\TemplateSource\TagTests\PluginModifier;
+
+/**
+ * class for modifier tests
+ *
+ * @runTestsInSeparateProcess
+ * @preserveGlobalState disabled
+ * @backupStaticAttributes enabled
+ */
+class PluginModifierNumberFormatTest extends \PHPUnit_Smarty
+{
+ public function setUp(): void
+ {
+ $this->setUpSmarty(__DIR__);
+ }
+
+ /**
+ * @return void
+ * @throws \SmartyException
+ *
+ * @dataProvider numberFormatDataProvider
+ */
+ public function testNumberFormat($template, $subject, $expectedString)
+ {
+ $this->smarty->assign('subject', $subject);
+
+ $tpl = $this->smarty->createTemplate($template);
+
+ $this->assertEquals($expectedString, $this->smarty->fetch($tpl));
+ }
+
+ public function numberFormatDataProvider()
+ {
+ return [
+ 'default' => [
+ 'template' => 'string:{$subject|number_format}',
+ 'subject' => 12345,
+ 'expectedString' => "12,345",
+ ],
+ 'withDecimalDefault' => [
+ 'template' => 'string:{$subject|number_format}',
+ 'subject' => 12345.6789,
+ 'expectedString' => "12,346",
+ ],
+ 'withDecimalAndExtras' => [
+ 'template' => 'string:{$subject|number_format:2:"-":"~"}',
+ 'subject' => 12345.6789,
+ 'expectedString' => "12~345-68",
+ ],
+ 'withNull' => [
+ 'template' => 'string:{$subject|number_format}',
+ 'subject' => null,
+ 'expectedString' => 0,
+ ],
+ ];
+ }
+}
diff --git a/tests/UnitTests/TemplateSource/TagTests/PluginModifier/PluginModifierReplaceTest.php b/tests/UnitTests/TemplateSource/TagTests/PluginModifier/PluginModifierReplaceTest.php
new file mode 100644
index 00000000..a4b6a12e
--- /dev/null
+++ b/tests/UnitTests/TemplateSource/TagTests/PluginModifier/PluginModifierReplaceTest.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace UnitTests\TemplateSource\TagTests\PluginModifier;
+
+/**
+ * class for modifier tests
+ *
+ * @runTestsInSeparateProcess
+ * @preserveGlobalState disabled
+ * @backupStaticAttributes enabled
+ */
+class PluginModifierReplaceTest extends \PHPUnit_Smarty
+{
+ public function setUp(): void
+ {
+ $this->setUpSmarty(__DIR__);
+ }
+
+ /**
+ * @return void
+ * @throws \SmartyException
+ *
+ * @dataProvider replaceDataProvider
+ */
+ public function testReplace($template, $subject, $expectedString)
+ {
+ $this->smarty->assign('subject', $subject);
+
+ $tpl = $this->smarty->createTemplate($template);
+
+ $this->assertEquals($expectedString, $this->smarty->fetch($tpl));
+ }
+
+ public function replaceDataProvider()
+ {
+ return [
+ 'default' => [
+ 'template' => 'string:{$subject|replace:",":"-"}',
+ 'subject' => "a,b,c,d",
+ 'expectedString' => "a-b-c-d",
+ ],
+ 'doNothing' => [
+ 'template' => 'string:{$subject|replace:"":""}',
+ 'subject' => "a,b,c,d",
+ 'expectedString' => "a,b,c,d",
+ ],
+ 'withNull' => [
+ 'template' => 'string:{$subject|replace:"":""}',
+ 'subject' => null,
+ 'expectedString' => "",
+ ],
+ ];
+ }
+}