Open Journal Systems  3.3.0
DatePart.php
1 <?php
11 
17 use Seboettg\CiteProc\Styles\RangeDelimiterTrait;
19 use SimpleXMLElement;
20 
27 class DatePart
28 {
29 
30  const DEFAULT_RANGE_DELIMITER = "–";
31 
32  use FormattingTrait,
33  AffixesTrait,
34  TextCaseTrait,
35  RangeDelimiterTrait;
36 
40  private $name;
41 
45  private $form;
46 
50  private $rangeDelimiter;
51 
55  private $parent;
56 
57  public function __construct(SimpleXMLElement $node)
58  {
59  foreach ($node->attributes() as $attribute) {
60  if ("name" === $attribute->getName()) {
61  $this->name = (string) $attribute;
62  }
63  if ("form" === $attribute->getName()) {
64  $this->form = (string) $attribute;
65  }
66  if ("range-delimiter" === $attribute->getName()) {
67  $this->rangeDelimiter = (string) $attribute;
68  }
69  }
70 
71  if (empty($this->rangeDelimiter)) {
72  $this->rangeDelimiter = self::DEFAULT_RANGE_DELIMITER;
73  }
74 
75  $this->initFormattingAttributes($node);
76  $this->initAffixesAttributes($node);
77  $this->initTextCaseAttributes($node);
78  }
79 
80 
86  public function render(DateTime $date, Date $parent)
87  {
88  $this->parent = $parent; //set parent
89  $text = $this->renderWithoutAffixes($date);
90  return !empty($text) ? $this->addAffixes($text) : "";
91  }
92 
98  public function renderWithoutAffixes(DateTime $date, Date $parent = null)
99  {
100  if (!is_null($parent)) {
101  $this->parent = $parent;
102  }
103  $text = "";
104  switch ($this->name) {
105  case 'year':
106  $text = $this->renderYear($date);
107  break;
108  case 'month':
109  $text = $this->renderMonth($date);
110  break;
111  case 'day':
112  $text = $this->renderDay($date);
113  }
114 
115  return !empty($text) ? $this->format($this->applyTextCase($text)) : "";
116  }
117 
121  public function getForm()
122  {
123  return $this->form;
124  }
125 
129  public function getName()
130  {
131  return $this->name;
132  }
133 
137  public function getRangeDelimiter()
138  {
139  return $this->rangeDelimiter;
140  }
141 
146  protected function renderYear(DateTime $date)
147  {
148  $text = $date->getYear();
149  if ($text > 0 && $text < 1000) {
150  $text = $text . CiteProc::getContext()->getLocale()->filter("terms", "ad")->single;
151  return $text;
152  } elseif ($text < 0) {
153  $text = $text * -1;
154  $text = $text . CiteProc::getContext()->getLocale()->filter("terms", "bc")->single;
155  return $text;
156  }
157  return $text;
158  }
159 
164  protected function renderMonth(DateTime $date)
165  {
166  if ($date->getMonth() < 1 || $date->getMonth() > 12) {
167  return "";
168  }
169 
170  $text = $date->getMonth();
171 
172  $form = !empty($this->form) ? $this->form : "long";
173  switch ($form) {
174  case 'numeric':
175  break;
176  case 'numeric-leading-zeros':
177  $text = sprintf("%02d", $text);
178  break;
179  case 'short':
180  case 'long':
181  default:
182  $text = $this->monthFromLocale($text, $form);
183  break;
184  }
185  return $text;
186  }
187 
192  protected function renderDay(DateTime $date)
193  {
194  if ($date->getDay() < 1 || $date->getDay() > 31) {
195  return "";
196  }
197 
198  $text = $date->getDay();
199  $form = !empty($this->form) ? $this->form : $this->parent->getForm();
200  switch ($form) {
201  case 'numeric':
202  break;
203  case 'numeric-leading-zeros':
204  $text = sprintf("%02d", $text);
205  break;
206  case 'ordinal':
207  $limitDayOrdinals =
208  CiteProc::getContext()->getLocale()->filter("options", "limit-day-ordinals-to-day-1");
209  if (!$limitDayOrdinals || Layout::getNumberOfCitedItems() <= 1) {
210  $text = Number::ordinal($text);
211  }
212  }
213  return $text;
214  }
215 
221  protected function monthFromLocale($text, $form)
222  {
223  if (empty($form)) {
224  $form = "long";
225  }
226  $month = 'month-' . sprintf('%02d', $text);
227  $text = CiteProc::getContext()->getLocale()->filter('terms', $month, $form)->single;
228  return $text;
229  }
230 }
Seboettg\CiteProc\Rendering\Date\DatePart\renderYear
renderYear(DateTime $date)
Definition: DatePart.php:158
Seboettg\CiteProc\Rendering\Date\DatePart\getForm
getForm()
Definition: DatePart.php:133
Seboettg\CiteProc\Rendering\Layout
Definition: Layout.php:35
Seboettg\CiteProc\Rendering\Date\DatePart\renderDay
renderDay(DateTime $date)
Definition: DatePart.php:204
Seboettg\CiteProc\Rendering\Date\DatePart\getRangeDelimiter
getRangeDelimiter()
Definition: DatePart.php:149
Seboettg\CiteProc\Styles\AffixesTrait
trait AffixesTrait
Definition: AffixesTrait.php:21
Seboettg\CiteProc\Styles\FormattingTrait
trait FormattingTrait
Definition: FormattingTrait.php:21
Seboettg\CiteProc\Rendering\Date\DatePart\render
render(DateTime $date, Date $parent)
Definition: DatePart.php:98
Seboettg\CiteProc\Rendering\Layout\getNumberOfCitedItems
static getNumberOfCitedItems()
Definition: Layout.php:172
Seboettg\CiteProc\Rendering\Date\DatePart
Definition: DatePart.php:27
Seboettg\CiteProc\Rendering\Date\Date
Definition: Date.php:31
Seboettg\CiteProc\Rendering\Date\DatePart\renderMonth
renderMonth(DateTime $date)
Definition: DatePart.php:176
Seboettg\CiteProc\CiteProc
Definition: CiteProc.php:32
Seboettg\CiteProc\Rendering\Date\DatePart\DEFAULT_RANGE_DELIMITER
const DEFAULT_RANGE_DELIMITER
Definition: DatePart.php:30
Seboettg\CiteProc\Styles\TextCaseTrait
trait TextCaseTrait
Definition: TextCaseTrait.php:23
Seboettg\CiteProc\Rendering\Date\DatePart\monthFromLocale
monthFromLocale($text, $form)
Definition: DatePart.php:233
Seboettg\CiteProc\Rendering\Date\DatePart\__construct
__construct(SimpleXMLElement $node)
Definition: DatePart.php:69
Seboettg\CiteProc\Rendering\Number\ordinal
static ordinal($num)
Definition: generic/citationStyleLanguage/lib/vendor/seboettg/citeproc-php/src/Rendering/Number.php:150
Seboettg\CiteProc\Rendering\Date\DateTime
Definition: DateTime.php:16
Seboettg\CiteProc\CiteProc\getContext
static getContext()
Definition: CiteProc.php:45
Seboettg\CiteProc\Rendering\Date
Definition: Date.php:10
Seboettg\CiteProc\Rendering\Date\DatePart\renderWithoutAffixes
renderWithoutAffixes(DateTime $date, Date $parent=null)
Definition: DatePart.php:110
Seboettg\CiteProc\Rendering\Date\DatePart\getName
getName()
Definition: DatePart.php:141
Seboettg\CiteProc\Rendering\Number
Definition: generic/citationStyleLanguage/lib/vendor/seboettg/citeproc-php/src/Rendering/Number.php:27