DateRangeRenderer   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 102
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 54
dl 0
loc 102
rs 10
c 0
b 0
f 0
wmc 15

5 Methods

Rating   Name   Duplication   Size   Complexity  
A renderOneRangePart() 0 7 2
B getRenderer() 0 27 8
A factory() 0 4 1
A __construct() 0 3 1
A renderDateParts() 0 20 3
1
<?php
2
declare(strict_types=1);
3
/*
4
 * @link        http://github.com/seboettg/citeproc-php for the source repository
5
 * @copyright   Copyright (c) 2019 Sebastian Böttger.
6
 * @license     https://opensource.org/licenses/MIT
7
 */
8
9
namespace Seboettg\CiteProc\Rendering\Date\DateRange;
10
11
use Seboettg\CiteProc\Rendering\Date\DatePart;
12
use Seboettg\CiteProc\Rendering\Date\DateTime;
13
use Seboettg\CiteProc\Rendering\Date\Date;
14
use Seboettg\Collection\Lists\ListInterface;
15
use Seboettg\Collection\Map\MapInterface;
16
use Seboettg\Collection\Map\Pair;
17
18
abstract class DateRangeRenderer
19
{
20
    protected const YEAR = "year";
21
    protected const MONTH = "month";
22
    protected const DAY = "day";
23
    protected const YEARMONTHDAY = "yearmonthday";
24
    protected const YEARMONTH = "yearmonth";
25
    protected const YEARDAY = "yearday";
26
    protected const MONTHDAY = "monthday";
27
28
29
    /**
30
     * @var Date
31
     */
32
    protected Date $parentDateObject;
33
34
    /**
35
     * @param  Date $dateObject
36
     * @param int $toRender
37
     * @return DateRangeRenderer
38
     */
39
    public static function factory(Date $dateObject, int $toRender): DateRangeRenderer
40
    {
41
        $className = self::getRenderer($toRender);
42
        return new $className($dateObject);
43
    }
44
45
    /**
46
     * DatePartRenderer constructor.
47
     *
48
     * @param Date $parentDateObject
49
     */
50
    public function __construct(Date $parentDateObject)
51
    {
52
        $this->parentDateObject = $parentDateObject;
53
    }
54
55
    private static function getRenderer($toRender): string
56
    {
57
        $className = "";
58
        switch ($toRender) {
59
            case Date::DATE_RANGE_STATE_DAY:
60
                $className = "DayRenderer";
61
                break;
62
            case Date::DATE_RANGE_STATE_MONTH:
63
                $className = "MonthRenderer";
64
                break;
65
            case Date::DATE_RANGE_STATE_YEAR:
66
                $className = "YearRenderer";
67
                break;
68
            case Date::DATE_RANGE_STATE_MONTHDAY:
69
                $className = "MonthDayRenderer";
70
                break;
71
            case Date::DATE_RANGE_STATE_YEARDAY:
72
                $className = "YearDayRenderer";
73
                break;
74
            case Date::DATE_RANGE_STATE_YEARMONTH:
75
                $className = "YearMonthRenderer";
76
                break;
77
            case Date::DATE_RANGE_STATE_YEARMONTHDAY:
78
                $className = "YearMonthDayRenderer";
79
                break;
80
        }
81
        return __NAMESPACE__ . "\\" . $className;
82
    }
83
84
    abstract public function parseDateRange(
85
        ListInterface $datePartsList,
86
        DateTime      $from,
87
        DateTime      $to,
88
        string        $delimiter
89
    ): string;
90
91
    protected function renderOneRangePart(DatePart $datePart, DateTime $from, DateTime $to, string $delimiter): string
92
    {
93
        $prefix = $datePart->renderPrefix();
94
        $from = $datePart->renderWithoutAffixes($from, $this->parentDateObject);
95
        $to = $datePart->renderWithoutAffixes($to, $this->parentDateObject);
96
        $suffix = !empty($to) ? $datePart->renderSuffix() : "";
97
        return $prefix . $from . $delimiter . $to . $suffix;
98
    }
99
100
    protected function renderDateParts(
101
        ListInterface $dateParts,
102
        DateTime $from,
103
        DateTime $to,
104
        string $delimiter
105
    ): string {
106
        return $dateParts->map(function (Pair $datePartPair) use ($from, $to, $delimiter) {
107
            $datePart = $datePartPair->getValue();
108
            if ($datePart instanceof MapInterface || is_array($datePart)) {
109
                $renderedFrom  = $datePart[0]->render($from, $this->parentDateObject);
110
                $renderedFrom .= $datePart[1]->renderPrefix();
111
                $renderedFrom .= $datePart[1]->renderWithoutAffixes($from, $this->parentDateObject);
112
                $renderedTo  = $datePart[0]->renderWithoutAffixes($to, $this->parentDateObject);
113
                $renderedTo .= $datePart[0]->renderSuffix();
114
                $renderedTo .= $datePart[1]->render($to, $this->parentDateObject);
115
                return $renderedFrom . $delimiter . $renderedTo;
116
            } else {
117
                return $datePart->render($from, $this->parentDateObject);
118
            }
119
        })->joinToString("");
120
    }
121
}
122