From 8c34b3a6201f1eea424e4465bf67b52d5a4bf1ac Mon Sep 17 00:00:00 2001 From: Paul Mehrer Date: Mon, 15 Feb 2021 13:30:58 +0100 Subject: [PATCH] fix(TB Export Xls) allow extended twig templates in xls Change-Id: Ib4710c3d872b3bcec47bbcbdb6ec5e2e22f33280 Reviewed-on: http://gerrit.tine20.com/customers/19119 Tested-by: Jenkins CI (http://ci.tine20.com/) Reviewed-by: Paul Mehrer --- .../addressbook_contact_twigFunctions.xlsx | Bin 5510 -> 5570 bytes tine20/Tinebase/Export/Abstract.php | 7 ++++++- tine20/Tinebase/Export/Xls.php | 18 +++++++++++------- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/tests/tine20/Tinebase/files/export/addressbook_contact_twigFunctions.xlsx b/tests/tine20/Tinebase/files/export/addressbook_contact_twigFunctions.xlsx index 84efbc1617543cf05d56822b28c03e9e5359b503..5cf1919833bd112720c0d31164ff33792eb84a03 100644 GIT binary patch delta 3361 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 delta 3250 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 - $this->_twigTemplate = $this->_twig->load($this->_templateFileName); + try { + $this->_twigTemplate = $this->_twig->load($this->_templateFileName); + } catch (Twig_Error $e) { + throw new Tinebase_Exception_Backend('twig error: ' . $e->getMessage() . ' for twig source: ' . + $this->_getTwigSource()); + } } protected function _extendTwigSetup() diff --git a/tine20/Tinebase/Export/Xls.php b/tine20/Tinebase/Export/Xls.php index bb892668bcd..bfc420aee4c 100644 --- a/tine20/Tinebase/Export/Xls.php +++ b/tine20/Tinebase/Export/Xls.php @@ -405,10 +405,12 @@ public function _getTwigSource() /** @var Cell $cell */ foreach($cellIter as $cell) { if (false !== strpos($cell->getValue(), '${twig:') && - preg_match_all('/\${twig:([^}]+?)}/s', $cell->getValue(), $matches, PREG_SET_ORDER)) { + preg_match_all('/(\${twig:(.+?[^}%])})([^}]|$)/s', $cell->getValue(), $matches, PREG_SET_ORDER)) { foreach($matches as $match) { - $this->_twigMapping[$i] = $match[0]; - $source .= ($i === 0 ? '' : ',') . '{{' . $match[1] . '}}'; + $this->_twigMapping[$i] = $match[1]; + $source .= ($i === 0 ? '' : ',') . + (strpos($match[2], '{{') !== false || strpos($match[2], '{%') !== false ? $match[2] + : '{{' . $match[2] . '}}'); ++$i; } } @@ -418,11 +420,13 @@ public function _getTwigSource() foreach($this->_spreadsheet->getActiveSheet()->getDrawingCollection() as $drawing) { $desc = $drawing->getDescription(); if (false !== strpos($desc, '${twig:') && - preg_match_all('/\${twig:([^}]+?)}/s', $desc, $matches, PREG_SET_ORDER) + preg_match_all('/(\${twig:(.+?[^}%])})([^}]|$)/s', $desc, $matches, PREG_SET_ORDER) ) { foreach ($matches as $match) { - $this->_twigMapping[$i] = $match[0]; - $source .= ($i === 0 ? '' : ',') . '{{' . $match[1] . '}}'; + $this->_twigMapping[$i] = $match[1]; + $source .= ($i === 0 ? '' : ',') . + (strpos($match[2], '{{') !== false || strpos($match[2], '{%') !== false ? $match[2] + : '{{' . $match[2] . '}}'); ++$i; } } @@ -702,4 +706,4 @@ function convert($to, $from = null) return null; } } -} \ No newline at end of file +}