From cf42aaf8203f456645595461f9ac7afe9dd66776 Mon Sep 17 00:00:00 2001 From: Awilum Date: Fri, 27 May 2022 18:33:29 +0300 Subject: [PATCH] feat(directives): add `expressions` directive --- .../Directives/ExpressionsDirective.php | 40 +++++++++++++++++++ src/flextype/settings.yaml | 5 +++ tests/fixtures/settings/settings.yaml | 4 ++ .../Directives/ExpressionsDirectiveTest.php | 17 ++++++++ 4 files changed, 66 insertions(+) create mode 100644 src/flextype/core/Entries/Directives/ExpressionsDirective.php create mode 100644 tests/src/flextype/core/Entries/Directives/ExpressionsDirectiveTest.php diff --git a/src/flextype/core/Entries/Directives/ExpressionsDirective.php b/src/flextype/core/Entries/Directives/ExpressionsDirective.php new file mode 100644 index 00000000..fe311851 --- /dev/null +++ b/src/flextype/core/Entries/Directives/ExpressionsDirective.php @@ -0,0 +1,40 @@ +addListener('onEntriesFetchSingleField', static function (): void { + + if (! registry()->get('flextype.settings.entries.directives.expressions.enabled')) { + return; + } + + if (! registry()->get('flextype.settings.entries.directives.expressions.enabled_globally')) { + return; + } + + $field = entries()->registry()->get('methods.fetch.field'); + + if (is_string($field['value'])) { + $field['value'] = preg_replace_callback('/\[\[ (.*?) \]\]/s', function($matches) { + return expression()->evaluate($matches[1]); + }, $field['value']); + } + + entries()->registry()->set('methods.fetch.field.key', $field['key']); + entries()->registry()->set('methods.fetch.field.value', $field['value']); +}); \ No newline at end of file diff --git a/src/flextype/settings.yaml b/src/flextype/settings.yaml index a4021436..d2404da5 100644 --- a/src/flextype/settings.yaml +++ b/src/flextype/settings.yaml @@ -77,6 +77,10 @@ entries: vars: debug: false directives: + expressions: + enabled: true + enabled_globally: true + path: "/src/flextype/core/Entries/Directives/ExpressionsDirective.php" shortcodes: enabled: true enabled_globally: true @@ -630,6 +634,7 @@ parsers: type: enabled: true path: "/src/flextype/core/Parsers/Shortcodes/TypeShortcode.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 46b30e9c..390cbb8d 100644 --- a/tests/fixtures/settings/settings.yaml +++ b/tests/fixtures/settings/settings.yaml @@ -73,6 +73,10 @@ entries: vars: debug: false directives: + expressions: + enabled: true + enabled_globally: true + path: "/src/flextype/core/Entries/Directives/ExpressionsDirective.php" shortcodes: enabled: true enabled_globally: true diff --git a/tests/src/flextype/core/Entries/Directives/ExpressionsDirectiveTest.php b/tests/src/flextype/core/Entries/Directives/ExpressionsDirectiveTest.php new file mode 100644 index 00000000..2677ae2b --- /dev/null +++ b/tests/src/flextype/core/Entries/Directives/ExpressionsDirectiveTest.php @@ -0,0 +1,17 @@ +directory(PATH['project'] . '/entries')->create(); +}); + +afterEach(function (): void { + filesystem()->directory(PATH['project'] . '/entries')->delete(); +}); + +test('expressions directive', function () { + entries()->create('expressions', ['test' => '[[ 1+1 ]]']); + + $this->assertEquals(2, entries()->fetch('expressions')['test']); +}); \ No newline at end of file