Passed
Push — develop ( 8c8a50...38b54f )
by nguereza
01:42
created

PlatineTemplateRenderer   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 56
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 3
eloc 15
c 1
b 0
f 0
dl 0
loc 56
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A cleanDocxXmlTags() 0 24 1
A render() 0 5 1
A __construct() 0 3 1
1
<?php
2
3
/**
4
 * Platine Docx template
5
 *
6
 * Platine Docx template is the lightweight library to manipulate the content of .docx files
7
 *
8
 * This content is released under the MIT License (MIT)
9
 *
10
 * Copyright (c) 2020 Platine Docx template
11
 *
12
 * Permission is hereby granted, free of charge, to any person obtaining a copy
13
 * of this software and associated documentation files (the "Software"), to deal
14
 * in the Software without restriction, including without limitation the rights
15
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
 * copies of the Software, and to permit persons to whom the Software is
17
 * furnished to do so, subject to the following conditions:
18
 *
19
 * The above copyright notice and this permission notice shall be included in all
20
 * copies or substantial portions of the Software.
21
 *
22
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
 * SOFTWARE.
29
 */
30
31
/**
32
 *  @file PlatineTemplateRenderer.php
33
 *
34
 *  The renderer using Platine Template class
35
 *
36
 *  @package    Platine\DocxTemplate\Renderer
37
 *  @author Platine Developers Team
38
 *  @copyright  Copyright (c) 2020
39
 *  @license    http://opensource.org/licenses/MIT  MIT License
40
 *  @link   http://www.iacademy.cf
41
 *  @version 1.0.0
42
 *  @filesource
43
 */
44
45
declare(strict_types=1);
46
47
namespace Platine\DocxTemplate\Renderer;
48
49
use Platine\DocxTemplate\DocxTemplateRendererInterface;
50
use Platine\Template\Template;
51
52
/**
53
 * @class PlatineTemplateRenderer
54
 * @package Platine\DocxTemplate\Renderer
55
 */
56
class PlatineTemplateRenderer implements DocxTemplateRendererInterface
57
{
58
    /**
59
     * The template instance to use
60
     * @var Template
61
     */
62
    protected Template $template;
63
64
    /**
65
     * Create new instance
66
     * @param Template $template
67
     */
68
    public function __construct(Template $template)
69
    {
70
        $this->template = $template;
71
    }
72
73
    /**
74
     * {@inheritodc}
75
     */
76
    public function render(string $content, array $data = []): string
77
    {
78
        $cleanContent = $this->cleanDocxXmlTags($content);
79
80
        return $this->template->renderString($cleanContent, $data);
81
    }
82
83
    /**
84
     * Clean the document XML tags
85
     * @param string $content
86
     * @return string
87
     */
88
    protected function cleanDocxXmlTags(string $content): string
89
    {
90
        //kills all xml tags within curly mustache brackets
91
        //this is necessary, as word might produce unnecesary xml tags inbetween
92
        //curly backets.
93
94
        //this regex needs either to be improved or it needs to be replace with
95
        //a method that is aware of the xml
96
        // as the regex can mess up the xml badly if the pattern does not
97
        // coem with the expected content
98
        $variables = (string) preg_replace_callback(
99
            '/{{(.*?)}}/',
100
            function ($match) {
101
                return strip_tags($match[0]);
102
            },
103
            (string) preg_replace('/(?<!{){(?!{)<\/w:t>[\s\S]*?<w:t>{/', '{{', $content)
104
        );
105
106
        return (string) preg_replace_callback(
107
            '/{%(.*?)%}/',
108
            function ($match) {
109
                return strip_tags($match[0]);
110
            },
111
            (string) preg_replace('/(?<!{){(?!{)<\/w:t>[\s\S]*?<w:t>{/', '{%', $variables)
112
        );
113
    }
114
}
115