Passed
Push — new-api ( 15a925...220eb6 )
by Sebastian
11:23
created

AffixesRenderer::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
c 1
b 0
f 0
nc 1
nop 4
dl 0
loc 6
ccs 5
cts 5
cp 1
crap 1
rs 10
1
<?php
2
declare(strict_types=1);
3
/*
4
 * citeproc-php
5
 *
6
 * @link        https://github.com/seboettg/citeproc-php for the source repository
7
 * @copyright   Copyright (c) 2020 Sebastian Böttger.
8
 * @license     https://opensource.org/licenses/MIT
9
 */
10
11
namespace Seboettg\CiteProc\Styles;
12
13
use Seboettg\CiteProc\Context;
14
15
final class AffixesRenderer implements StylesRendererInterface
16
{
17
18 182
    public static function factory(Context $context, ?string $prefix, ?string $suffix)
19
    {
20
        $piq = $context
21 182
            ->getLocale()
22 182
            ->filter('options', 'punctuation-in-quote');
23 182
        $punctuationInQuote = is_array($piq) ? current($piq) : $piq;
0 ignored issues
show
introduced by
The condition is_array($piq) is always false.
Loading history...
24 182
        $closeQuote = $context->getLocale()->filter("terms", "close-quote")->single;
25 182
        return new self($prefix, $suffix, $punctuationInQuote, $closeQuote);
0 ignored issues
show
Bug introduced by
$punctuationInQuote of type stdClass is incompatible with the type boolean|null expected by parameter $punctuationInQuote of Seboettg\CiteProc\Styles...Renderer::__construct(). ( Ignorable by Annotation )

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

25
        return new self($prefix, $suffix, /** @scrutinizer ignore-type */ $punctuationInQuote, $closeQuote);
Loading history...
26
    }
27
28
    /** @var string */
29
    private $prefix = "";
30
31
    /** @var string */
32
    private $suffix = "";
33
34
    /** @var bool */
35
    private $punctuationInQuote = "";
36
37
    /** @var string */
38
    private $closeQuote = "";
39
40 182
    public function __construct(?string $prefix, ?string $suffix, ?bool $punctuationInQuote, ?string $closeQuote)
41
    {
42 182
        $this->prefix = $prefix;
43 182
        $this->suffix = $suffix;
44 182
        $this->punctuationInQuote = $punctuationInQuote;
45 182
        $this->closeQuote = $closeQuote;
46 182
    }
47
48 178
    public function render(string $text): string
49
    {
50 178
        $prefix = $this->prefix;
51 178
        $suffix = $this->suffix;
52 178
        $punctuationInQuote = $this->punctuationInQuote;
53 178
        $closeQuote = $this->closeQuote;
54 178
        if (!empty($suffix)) { // guard against repeated suffixes...
55 93
            $no_tags = strip_tags($text);
56 93
            if (strlen($no_tags) && ($no_tags[(strlen($no_tags) - 1)] == $suffix[0])) {
57 13
                $suffix = substr($suffix, 1);
58
            }
59
60 93
            if ($punctuationInQuote && in_array($suffix, [',', ';', '.'])) {
61 47
                $lastChar = mb_substr($text, -1, 1);
62 47
                if ($closeQuote === $lastChar) { // last char is closing quote?
63 4
                    $text = mb_substr($text, 0, mb_strlen($text) - 1); //set suffix before
64 4
                    return $prefix . $text . $suffix . $lastChar;
65
                }
66
            }
67
        }
68 178
        return $prefix . $text . $suffix;
69
    }
70
71
    /**
72
     * @return string
73
     */
74 62
    public function getPrefix(): ?string
75
    {
76 62
        return $this->prefix;
77
    }
78
79
    /**
80
     * @return string
81
     */
82 64
    public function getSuffix(): ?string
83
    {
84 64
        return $this->suffix;
85
    }
86
87
    /**
88
     * @return bool
89
     */
90
    public function isPunctuationInQuote(): ?bool
91
    {
92
        return $this->punctuationInQuote;
93
    }
94
95
    /**
96
     * @return string
97
     */
98
    public function getCloseQuote(): ?string
99
    {
100
        return $this->closeQuote;
101
    }
102
}
103