Passed
Push — master ( 1e4fc2...92950f )
by Jan
24:48
created

AppExtension   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 108
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 48
dl 0
loc 108
rs 10
c 0
b 0
f 0
wmc 11

10 Methods

Rating   Name   Duplication   Size   Complexity  
A formatCurrency() 0 7 2
A amountFormat() 0 3 1
A siFormat() 0 3 1
A treeData() 0 5 1
A loginPath() 0 7 1
A generateEntityURL() 0 3 1
A getTests() 0 5 1
A getFilters() 0 12 1
A __construct() 0 17 1
A getFunctions() 0 6 1
1
<?php
2
/**
3
 * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
4
 *
5
 * Copyright (C) 2019 - 2020 Jan Böhmer (https://github.com/jbtronics)
6
 *
7
 * This program is free software: you can redistribute it and/or modify
8
 * it under the terms of the GNU Affero General Public License as published
9
 * by the Free Software Foundation, either version 3 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * This program is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU Affero General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Affero General Public License
18
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
19
 */
20
21
declare(strict_types=1);
22
23
/**
24
 * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
25
 *
26
 * Copyright (C) 2019 Jan Böhmer (https://github.com/jbtronics)
27
 *
28
 * This program is free software; you can redistribute it and/or
29
 * modify it under the terms of the GNU General Public License
30
 * as published by the Free Software Foundation; either version 2
31
 * of the License, or (at your option) any later version.
32
 *
33
 * This program is distributed in the hope that it will be useful,
34
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
35
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
36
 * GNU General Public License for more details.
37
 *
38
 * You should have received a copy of the GNU General Public License
39
 * along with this program; if not, write to the Free Software
40
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
41
 */
42
43
namespace App\Twig;
44
45
use App\Entity\Base\AbstractDBElement;
46
use App\Entity\Parts\MeasurementUnit;
47
use App\Entity\PriceInformations\Currency;
48
use App\Services\AmountFormatter;
49
use App\Services\Attachments\AttachmentURLGenerator;
50
use App\Services\EntityURLGenerator;
51
use App\Services\FAIconGenerator;
52
use App\Services\MarkdownParser;
53
use App\Services\MoneyFormatter;
54
use App\Services\SIFormatter;
55
use App\Services\Trees\TreeViewGenerator;
56
use Brick\Math\BigDecimal;
57
use Symfony\Component\Serializer\SerializerInterface;
58
use Symfony\Contracts\Translation\TranslatorInterface;
59
use Twig\Extension\AbstractExtension;
60
use Twig\TwigFilter;
61
use Twig\TwigFunction;
62
use Twig\TwigTest;
63
64
class AppExtension extends AbstractExtension
65
{
66
    protected $entityURLGenerator;
67
    protected $markdownParser;
68
    protected $serializer;
69
    protected $treeBuilder;
70
    protected $moneyFormatter;
71
    protected $siformatter;
72
    protected $amountFormatter;
73
    protected $attachmentURLGenerator;
74
    protected $FAIconGenerator;
75
    protected $translator;
76
77
    public function __construct(EntityURLGenerator $entityURLGenerator, MarkdownParser $markdownParser,
78
        SerializerInterface $serializer, TreeViewGenerator $treeBuilder,
79
        MoneyFormatter $moneyFormatter,
80
        SIFormatter $SIFormatter, AmountFormatter $amountFormatter,
81
        AttachmentURLGenerator $attachmentURLGenerator,
82
        FAIconGenerator $FAIconGenerator, TranslatorInterface $translator)
83
    {
84
        $this->entityURLGenerator = $entityURLGenerator;
85
        $this->markdownParser = $markdownParser;
86
        $this->serializer = $serializer;
87
        $this->treeBuilder = $treeBuilder;
88
        $this->moneyFormatter = $moneyFormatter;
89
        $this->siformatter = $SIFormatter;
90
        $this->amountFormatter = $amountFormatter;
91
        $this->attachmentURLGenerator = $attachmentURLGenerator;
92
        $this->FAIconGenerator = $FAIconGenerator;
93
        $this->translator = $translator;
94
    }
95
96
    public function getFilters()
97
    {
98
        return [
99
            new TwigFilter('entityURL', [$this, 'generateEntityURL']),
100
            new TwigFilter('markdown', [$this->markdownParser, 'markForRendering'], [
101
                'pre_escape' => 'html',
102
                'is_safe' => ['html'],
103
            ]),
104
            new TwigFilter('moneyFormat', [$this, 'formatCurrency']),
105
            new TwigFilter('siFormat', [$this, 'siFormat']),
106
            new TwigFilter('amountFormat', [$this, 'amountFormat']),
107
            new TwigFilter('loginPath', [$this, 'loginPath']),
108
        ];
109
    }
110
111
    public function getTests()
112
    {
113
        return [
114
            new TwigTest('instanceof', function ($var, $instance) {
115
                return $var instanceof $instance;
116
            }),
117
        ];
118
    }
119
120
    public function getFunctions()
121
    {
122
        return [
123
            new TwigFunction('generateTreeData', [$this, 'treeData']),
124
            new TwigFunction('attachment_thumbnail', [$this->attachmentURLGenerator, 'getThumbnailURL']),
125
            new TwigFunction('ext_to_fa_icon', [$this->FAIconGenerator, 'fileExtensionToFAType']),
126
        ];
127
    }
128
129
    public function treeData(AbstractDBElement $element, string $type = 'newEdit'): string
130
    {
131
        $tree = $this->treeBuilder->getTreeView(\get_class($element), null, $type, $element);
132
133
        return json_encode($tree);
134
    }
135
136
    /**
137
     * This function/filter generates an path.
138
     *
139
     * @return string
140
     */
141
    public function loginPath(string $path): string
142
    {
143
        $parts = explode('/', $path);
144
        //Remove the part with
145
        unset($parts[1]);
146
147
        return implode('/', $parts);
148
    }
149
150
    public function generateEntityURL(AbstractDBElement $entity, string $method = 'info'): string
151
    {
152
        return $this->entityURLGenerator->getURL($entity, $method);
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->entityURLG...etURL($entity, $method) could return the type null which is incompatible with the type-hinted return string. Consider adding an additional type-check to rule them out.
Loading history...
153
    }
154
155
    public function formatCurrency($amount, ?Currency $currency = null, int $decimals = 5)
156
    {
157
        if ($amount instanceof BigDecimal) {
158
            $amount = (string) $amount;
159
        }
160
161
        return $this->moneyFormatter->format($amount, $currency, $decimals);
162
    }
163
164
    public function siFormat($value, $unit, $decimals = 2, bool $show_all_digits = false)
165
    {
166
        return $this->siformatter->format($value, $unit, $decimals, $show_all_digits);
0 ignored issues
show
Unused Code introduced by
The call to App\Services\SIFormatter::format() has too many arguments starting with $show_all_digits. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

166
        return $this->siformatter->/** @scrutinizer ignore-call */ format($value, $unit, $decimals, $show_all_digits);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
167
    }
168
169
    public function amountFormat($value, ?MeasurementUnit $unit, array $options = [])
170
    {
171
        return $this->amountFormatter->format($value, $unit, $options);
172
    }
173
}
174