1<?php
2/* Copyright (c) 2019 Nils Haagen <nils.haagen@concepts-and-training.de> Extended GPL, see docs/LICENSE */
3
4namespace ILIAS\Data\DateFormat;
5
6/**
7 * A Date Format provides a format definition akin to PHP's date formatting options,
8 * but stores the single elements/options as array to ease conversion into other formats.
9 */
10class DateFormat
11{
12    const DOT = '.';
13    const COMMA = ',';
14    const DASH = '-';
15    const SLASH = '/';
16    const SPACE = ' ';
17    const DAY = 'd';
18    const DAY_ORDINAL = 'jS';
19    const WEEKDAY = 'l';
20    const WEEKDAY_SHORT = 'D';
21    const WEEK = 'W';
22    const MONTH = 'm';
23    const MONTH_SPELLED = 'F';
24    const MONTH_SPELLED_SHORT = 'M';
25    const YEAR = 'Y';
26    const YEAR_TWO_DIG = 'y';
27
28    const TOKENS = [
29        self::DOT,
30        self::COMMA,
31        self::DASH,
32        self::SLASH,
33        self::SPACE,
34        self::DAY,
35        self::DAY_ORDINAL,
36        self::WEEKDAY,
37        self::WEEKDAY_SHORT,
38        self::WEEK,
39        self::MONTH,
40        self::MONTH_SPELLED,
41        self::MONTH_SPELLED_SHORT,
42        self::YEAR,
43        self::YEAR_TWO_DIG
44    ];
45
46    /**
47     * @var array
48     */
49    protected $format = [];
50
51    public function __construct(array $format)
52    {
53        $this->validateFormatElelements($format);
54        $this->format = $format;
55    }
56
57    public function validateFormatElelements(array $format)
58    {
59        foreach ($format as $entry) {
60            if (!in_array($entry, self::TOKENS)) {
61                throw new \InvalidArgumentException("not a valid token for date-format", 1);
62            }
63        }
64    }
65
66    /**
67     * Get the elements of the format as array.
68     * @return array
69     */
70    public function toArray() : array
71    {
72        return $this->format;
73    }
74
75    /**
76     * Get the format as string.
77     * @return array
78     */
79    public function toString() : string
80    {
81        return implode('', $this->format);
82    }
83}
84