Passed
Push — master ( dcb940...49cd7f )
by Sebastian
14:22 queued 12:58
created

DateRangeRenderer::factory()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 2
c 0
b 0
f 0
nc 1
nop 2
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 1
rs 10
1
<?php
2
/*
3
 * citeproc-php: DateRangeParser.php
4
 * User: Sebastian Böttger <[email protected]>
5
 * created at 03.11.19, 20:00
6
 */
7
8
namespace Seboettg\CiteProc\Rendering\Date\DateRange;
9
10
use Seboettg\CiteProc\Rendering\Date\DatePart;
11
use Seboettg\CiteProc\Rendering\Date\DateTime;
12
use Seboettg\CiteProc\Rendering\Date\Date;
13
use Seboettg\Collection\ArrayList;
14
15
/**
16
 * Class DatePartRenderer
17
 *
18
 * @package Seboettg\CiteProc\Rendering\Date\DateRange
19
 */
20
abstract class DateRangeRenderer
21
{
22
23
    /**
24
     * @var Date
25
     */
26
    protected $parentDateObject;
27
28
    /**
29
     * @param  Date $dateObject
30
     * @param  int  $toRender
31
     * @return DateRangeRenderer
32
     */
33 1
    public static function factory(Date $dateObject, $toRender)
34
    {
35 1
        $className = self::getRenderer($toRender);
36 1
        return new $className($dateObject);
37
    }
38
39
    /**
40
     * DatePartRenderer constructor.
41
     *
42
     * @param Date $parentDateObject
43
     */
44 1
    public function __construct(Date $parentDateObject)
45
    {
46 1
        $this->parentDateObject = $parentDateObject;
47 1
    }
48
49 1
    private static function getRenderer($toRender)
50
    {
51 1
        $className = "";
52 1
        switch ($toRender) {
53
            case Date::DATE_RANGE_STATE_DAY:
54 1
                $className = "DayRenderer";
55 1
                break;
56
            case Date::DATE_RANGE_STATE_MONTH:
57 1
                $className = "MonthRenderer";
58 1
                break;
59
            case Date::DATE_RANGE_STATE_YEAR:
60 1
                $className = "YearRenderer";
61 1
                break;
62
            case Date::DATE_RANGE_STATE_MONTHDAY:
63 1
                $className = "MonthDayRenderer";
64 1
                break;
65
            case Date::DATE_RANGE_STATE_YEARDAY:
66
                $className = "YearDayRenderer";
67
                break;
68
            case Date::DATE_RANGE_STATE_YEARMONTH:
69 1
                $className = "YearMonthRenderer";
70 1
                break;
71
            case Date::DATE_RANGE_STATE_YEARMONTHDAY:
72 1
                $className = "YearMonthDayRenderer";
73 1
                break;
74
        }
75 1
        return __NAMESPACE__ . "\\" . $className;
76
    }
77
78
    /**
79
     * @param  ArrayList<DatePart> $dateParts
80
     * @param  DateTime            $from
81
     * @param  DateTime            $to
82
     * @param  $delimiter
83
     * @return string
84
     */
85
    abstract public function parseDateRange(ArrayList $dateParts, DateTime $from, DateTime $to, $delimiter);
86
87
    /**
88
     * @param  DatePart $datePart
89
     * @param  DateTime $from
90
     * @param  DateTime $to
91
     * @param  $delimiter
92
     * @return string
93
     */
94 1
    protected function renderOneRangePart(DatePart $datePart, DateTime $from, DateTime $to, $delimiter)
95
    {
96 1
        $prefix = $datePart->renderPrefix();
97 1
        $from = $datePart->renderWithoutAffixes($from, $this->parentDateObject);
98 1
        $to = $datePart->renderWithoutAffixes($to, $this->parentDateObject);
99 1
        $suffix = !empty($to) ? $datePart->renderSuffix() : "";
100 1
        return $prefix . $from . $delimiter . $to . $suffix;
101
    }
102
103 1
    protected function renderDateParts($dateParts, $from, $to, $delimiter)
104
    {
105 1
        $ret = "";
106 1
        foreach ($dateParts as $datePart) {
107 1
            if (is_array($datePart)) {
108 1
                $renderedFrom  = $datePart[0]->render($from, $this->parentDateObject);
109 1
                $renderedFrom .= $datePart[1]->renderPrefix();
110 1
                $renderedFrom .= $datePart[1]->renderWithoutAffixes($from, $this->parentDateObject);
111 1
                $renderedTo  = $datePart[0]->renderWithoutAffixes($to, $this->parentDateObject);
112 1
                $renderedTo .= $datePart[0]->renderSuffix();
113 1
                $renderedTo .= $datePart[1]->render($to, $this->parentDateObject);
114 1
                $ret .= $renderedFrom . $delimiter . $renderedTo;
115
            } else {
116 1
                $ret .= $datePart->render($from, $this->parentDateObject);
117
            }
118
        }
119 1
        return $ret;
120
    }
121
}
122