diff --git a/src/flextype/core/Parsers/Shortcodes/EvalShortcode.php b/src/flextype/core/Parsers/Shortcodes/EvalShortcode.php new file mode 100644 index 00000000..0d428c2a --- /dev/null +++ b/src/flextype/core/Parsers/Shortcodes/EvalShortcode.php @@ -0,0 +1,39 @@ +shortcodes()->addHandler('eval', static function (ShortcodeInterface $s) { + if (! registry()->get('flextype.settings.parsers.shortcodes.shortcodes.eval.enabled')) { + return ''; + } + + if ($s->getContent() != null) { + return expression()->evaluate(parsers()->shortcodes()->parse($s->getContent())); + } + + if ($s->getBbCode() != null) { + return expression()->evaluate(parsers()->shortcodes()->parse($s->getBBCode())); + } +}); diff --git a/src/flextype/settings.yaml b/src/flextype/settings.yaml index a775ac81..567cdbd0 100644 --- a/src/flextype/settings.yaml +++ b/src/flextype/settings.yaml @@ -624,7 +624,10 @@ parsers: calc: enabled: true path: "/src/flextype/core/Parsers/Shortcodes/CalcShortcode.php" - + eval: + enabled: true + path: "/src/flextype/core/Parsers/Shortcodes/EvalShortcode.php" + # CORS # # CORS (Cross-origin resource sharing) allows JavaScript web apps to make HTTP requests to other domains. diff --git a/tests/fixtures/settings/settings.yaml b/tests/fixtures/settings/settings.yaml index bbca73b4..283125e5 100644 --- a/tests/fixtures/settings/settings.yaml +++ b/tests/fixtures/settings/settings.yaml @@ -608,6 +608,9 @@ parsers: calc: enabled: true path: "/src/flextype/core/Parsers/Shortcodes/CalcShortcode.php" + eval: + enabled: true + path: "/src/flextype/core/Parsers/Shortcodes/EvalShortcode.php" # CORS # diff --git a/tests/src/flextype/core/Parsers/Shortcodes/EvalShortcodeTest.php b/tests/src/flextype/core/Parsers/Shortcodes/EvalShortcodeTest.php new file mode 100644 index 00000000..b87697c7 --- /dev/null +++ b/tests/src/flextype/core/Parsers/Shortcodes/EvalShortcodeTest.php @@ -0,0 +1,16 @@ +directory(PATH['project'] . '/entries')->ensureExists(0755, true); +}); + +afterEach(function () { + filesystem()->directory(PATH['project'] . '/entries')->delete(); +}); + +test('eval shortcode', function () { + expect(entries()->create('foo', ['price' => '(eval:2+2) (eval)2+2(/eval)']))->toBeTrue(); + expect(entries()->fetch('foo')['price'])->toBe('4 4'); +}); \ No newline at end of file