Passed
Push — new-api ( 34a0a9...30b18d )
by Sebastian
04:06
created

AffixesRenderer   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 54
Duplicated Lines 0 %

Test Coverage

Coverage 92.59%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 29
c 1
b 0
f 0
dl 0
loc 54
ccs 25
cts 27
cp 0.9259
rs 10
wmc 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A factory() 0 8 2
B render() 0 21 7
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 139
    public static function factory(Context $context, ?string $prefix, ?string $suffix)
19
    {
20
        $piq = $context
21 139
            ->getLocale()
22 139
            ->filter('options', 'punctuation-in-quote');
23 139
        $punctuationInQuote = is_array($piq) ? current($piq) : $piq;
0 ignored issues
show
introduced by
The condition is_array($piq) is always false.
Loading history...
24 139
        $closeQuote = $context->getLocale()->filter("terms", "close-quote")->single;
25 139
        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 139
    public function __construct(?string $prefix, ?string $suffix, ?bool $punctuationInQuote, ?string $closeQuote)
41
    {
42 139
        $this->prefix = $prefix;
43 139
        $this->suffix = $suffix;
44 139
        $this->punctuationInQuote = $punctuationInQuote;
45 139
        $this->closeQuote = $closeQuote;
46 139
    }
47
48 121
    public function render(string $text): string
49
    {
50 121
        $prefix = $this->prefix;
51 121
        $suffix = $this->suffix;
52 121
        $punctuationInQuote = $this->punctuationInQuote;
53 121
        $closeQuote = $this->closeQuote;
54 121
        if (!empty($suffix)) { // guard against repeated suffixes...
55 47
            $no_tags = strip_tags($text);
56 47
            if (strlen($no_tags) && ($no_tags[(strlen($no_tags) - 1)] == $suffix[0])) {
57 6
                $suffix = substr($suffix, 1);
58
            }
59
60 47
            if ($punctuationInQuote && in_array($suffix, [',', ';', '.'])) {
61 11
                $lastChar = mb_substr($text, -1, 1);
62 11
                if ($closeQuote === $lastChar) { // last char is closing quote?
63
                    $text = mb_substr($text, 0, mb_strlen($text) - 1); //set suffix before
64
                    return $text . $suffix . $lastChar;
65
                }
66
            }
67
        }
68 121
        return $prefix . $text . $suffix;
69
    }
70
}
71