Open Journal Systems  3.3.0
Date.php
1 <?php
2 /*
3  * citeproc-php
4  *
5  * @link http://github.com/seboettg/citeproc-php for the source repository
6  * @copyright Copyright (c) 2016 Sebastian Böttger.
7  * @license https://opensource.org/licenses/MIT
8  */
9 
11 
12 use Exception;
23 use SimpleXMLElement;
24 
31 class Date
32 {
33  use AffixesTrait,
34  DisplayTrait,
35  FormattingTrait,
36  TextCaseTrait;
37 
38  // bitmask: ymd
39  const DATE_RANGE_STATE_NONE = 0; // 000
40  const DATE_RANGE_STATE_DAY = 1; // 001
41  const DATE_RANGE_STATE_MONTH = 2; // 010
42  const DATE_RANGE_STATE_MONTHDAY = 3; // 011
43  const DATE_RANGE_STATE_YEAR = 4; // 100
44  const DATE_RANGE_STATE_YEARDAY = 5; // 101
45  const DATE_RANGE_STATE_YEARMONTH = 6; // 110
47 
48  private static $localizedDateFormats = [
49  'numeric',
50  'text'
51  ];
52 
56  private $dateParts;
57 
61  private $form = "";
62 
66  private $variable = "";
67 
71  private $datePartsAttribute = "";
72 
78  public function __construct(SimpleXMLElement $node)
79  {
80  $this->dateParts = new ArrayList();
81 
83  foreach ($node->attributes() as $attribute) {
84  switch ($attribute->getName()) {
85  case 'form':
86  $this->form = (string) $attribute;
87  break;
88  case 'variable':
89  $this->variable = (string) $attribute;
90  break;
91  case 'date-parts':
92  $this->datePartsAttribute = (string) $attribute;
93  }
94  }
96  foreach ($node->children() as $child) {
97  if ($child->getName() === "date-part") {
98  $datePartName = (string) $child->attributes()["name"];
99  $this->dateParts->set($this->form."-".$datePartName, Util\Factory::create($child));
100  }
101  }
102 
103  $this->initAffixesAttributes($node);
104  $this->initDisplayAttributes($node);
105  $this->initFormattingAttributes($node);
106  $this->initTextCaseAttributes($node);
107  }
108 
115  public function render($data)
116  {
117  $ret = "";
118  $var = null;
119  if (isset($data->{$this->variable})) {
120  $var = $data->{$this->variable};
121  } else {
122  return "";
123  }
124 
125  try {
126  $this->prepareDatePartsInVariable($data, $var);
127  } catch (CiteProcException $e) {
128  if (isset($data->{$this->variable}->{'raw'}) &&
129  !preg_match("/(\p{L}+)\s?([\-\&,])\s?(\p{L}+)/u", $data->{$this->variable}->{'raw'})) { return $this->addAffixes($this->format($this->applyTextCase($data->{$this->variable}->{'raw'}))); } else { if (isset($data->{$this->variable}->{'string-literal'})) { return $this->addAffixes( $this->format($this->applyTextCase($data->{$this->variable}->{'string-literal'})) ); } } } $form = $this->form; $dateParts = !empty($this->datePartsAttribute) ? explode("-", $this->datePartsAttribute) : []; $this->prepareDatePartsChildren($dateParts, $form); // No date-parts in date-part attribute defined, take into account that the defined date-part children will // be used. if (empty($this->datePartsAttribute) && $this->dateParts->count() > 0) { /** @var DatePart $part */ foreach ($this->dateParts as $part) { $dateParts[] = $part->getName(); } } /* cs:date may have one or more cs:date-part child elements (see Date-part). The attributes set on these elements override those specified for the localized date formats (e.g. to get abbreviated months for all locales, the form attribute on the month-cs:date-part element can be set to “short”). These cs:date-part elements do not affect which, or in what order, date parts are rendered. Affixes, which are very locale-specific, are not allowed on these cs:date-part elements. */ if ($this->dateParts->count() > 0) { if (!isset($var->{'date-parts'})) { // ignore empty date-parts return ""; } if (count($data->{$this->variable}->{'date-parts'}) === 1) { $data_ = $this->createDateTime($data->{$this->variable}->{'date-parts'}); $ret .= $this->iterateAndRenderDateParts($dateParts, $data_); } elseif (count($var->{'date-parts'}) === 2) { //date range $data_ = $this->createDateTime($var->{'date-parts'}); $from = $data_[0]; $to = $data_[1]; $interval = $to->diff($from); $delimiter = ""; $toRender = 0; if ($interval->y > 0 && in_array('year', $dateParts)) { $toRender |= self::DATE_RANGE_STATE_YEAR; $delimiter = $this->dateParts->get($this->form."-year")->getRangeDelimiter(); } if ($interval->m > 0 && $from->getMonth() - $to->getMonth() !== 0 && in_array('month', $dateParts)) { $toRender |= self::DATE_RANGE_STATE_MONTH; $delimiter = $this->dateParts->get($this->form."-month")->getRangeDelimiter(); } if ($interval->d > 0 && $from->getDay() - $to->getDay() !== 0 && in_array('day', $dateParts)) { $toRender |= self::DATE_RANGE_STATE_DAY; $delimiter = $this->dateParts->get($this->form."-day")->getRangeDelimiter(); } if ($toRender === self::DATE_RANGE_STATE_NONE) { $ret .= $this->iterateAndRenderDateParts($dateParts, $data_); } else { $ret .= $this->renderDateRange($toRender, $from, $to, $delimiter); } } if (isset($var->raw) && preg_match("/(\p{L}+)\s?([\-\–&,])\s?(\p{L}+)/u", $var->raw, $matches)) { return $matches[1].$matches[2].$matches[3]; } } elseif (!empty($this->datePartsAttribute)) { // fallback: // When there are no dateParts children, but date-parts attribute in date // render numeric $data = $this->createDateTime($var->{'date-parts'}); $ret = $this->renderNumeric($data[0]); } return !empty($ret) ? $this->addAffixes($this->format($this->applyTextCase($ret))) : ""; } /** * @param array $dates * @return array * @throws Exception */ private function createDateTime($dates) { $data = []; foreach ($dates as $date) { $date = $this->cleanDate($date); if ($date[0] < 1000) { $dateTime = new DateTime(0, 0, 0); $dateTime->setDay(0)->setMonth(0)->setYear(0); $data[] = $dateTime; } $dateTime = new DateTime( $date[0], array_key_exists(1, $date) ? $date[1] : 1, array_key_exists(2, $date) ? $date[2] : 1 ); if (!array_key_exists(1, $date)) { $dateTime->setMonth(0); } if (!array_key_exists(2, $date)) { $dateTime->setDay(0); } $data[] = $dateTime; } return $data; } /** * @param int $toRender * @param DateTime $from * @param DateTime $to * @param $delimiter * @return string */ private function renderDateRange($toRender, DateTime $from, DateTime $to, $delimiter) { $datePartRenderer = DateRangeRenderer::factory($this, $toRender); return $datePartRenderer->parseDateRange($this->dateParts, $from, $to, $delimiter); } /** * @param string $format * @return bool */ private function hasDatePartsFromLocales($format) { $dateXml = CiteProc::getContext()->getLocale()->getDateXml(); return !empty($dateXml[$format]); } /** * @param string $format * @return array */ private function getDatePartsFromLocales($format) { $ret = []; // date parts from locales $dateFromLocale_ = CiteProc::getContext()->getLocale()->getDateXml(); $dateFromLocale = $dateFromLocale_[$format]; // no custom date parts within the date element (this)? if (!empty($dateFromLocale)) { $dateForm = array_filter( is_array($dateFromLocale) ? $dateFromLocale : [$dateFromLocale], function ($element) use ($format) { /** @var SimpleXMLElement $element */ $dateForm = (string) $element->attributes()["form"]; return $dateForm === $format; } ); //has dateForm from locale children (date-part elements)? $localeDate = array_pop($dateForm); if ($localeDate instanceof SimpleXMLElement && $localeDate->count() > 0) { foreach ($localeDate as $child) { $ret[] = $child; } } } return $ret; } /** * @return string */ public function getVariable() { return $this->variable; } /** * @param $data * @param $var * @throws CiteProcException */ private function prepareDatePartsInVariable($data, $var) { if (!isset($data->{$this->variable}->{'date-parts'}) || empty($data->{$this->variable}->{'date-parts'})) { if (isset($data->{$this->variable}->raw) && !empty($data->{$this->variable}->raw)) { // try to parse date parts from "raw" attribute $var->{'date-parts'} = Util\DateHelper::parseDateParts($data->{$this->variable}); } else { throw new CiteProcException("No valid date format"); } } } /** * @param $dateParts * @param string $form * @throws InvalidStylesheetException */ private function prepareDatePartsChildren($dateParts, $form) { /* Localized date formats are selected with the optional form attribute, which must set to either “numeric” (for fully numeric formats, e.g. “12-15-2005”), or “text” (for formats with a non-numeric month, e.g. “December 15, 2005”). Localized date formats can be customized in two ways. First, the date-parts attribute may be used to show fewer date parts. The possible values are: - “year-month-day” - (default), renders the year, month and day - “year-month” - renders the year and month - “year” - renders the year */ if ($this->dateParts->count() < 1 && in_array($form, self::$localizedDateFormats)) { if ($this->hasDatePartsFromLocales($form)) { $datePartsFromLocales = $this->getDatePartsFromLocales($form); array_filter($datePartsFromLocales, function (SimpleXMLElement $item) use ($dateParts) { return in_array($item["name"], $dateParts); }); foreach ($datePartsFromLocales as $datePartNode) { $datePart = $datePartNode["name"]; $this->dateParts->set("$form-$datePart", Util\Factory::create($datePartNode)); } } else { //otherwise create default date parts foreach ($dateParts as $datePart) { $this->dateParts->add( "$form-$datePart", new DatePart( new SimpleXMLElement('<date-part name="'.$datePart.'" form="'.$form.'" />') ) ); } } } } private function renderNumeric(DateTime $date) { return $date->renderNumeric(); } public function getForm() { return $this->form; } private function cleanDate($date) { $ret = []; foreach ($date as $key => $datePart) { $ret[$key] = Util\NumberHelper::extractNumber(Util\StringHelper::removeBrackets($datePart)); } return $ret; } /** * @param array $dateParts * @param array $data_ * @return string */ private function iterateAndRenderDateParts(array $dateParts, array $data_) { $ret = ""; /** @var DatePart $datePart */ foreach ($this->dateParts as $key => $datePart) { /** @noinspection PhpUnusedLocalVariableInspection */ list($f, $p) = explode("-", $key); if (in_array($p, $dateParts)) { $ret .= $datePart->render($data_[0], $this); } } return $ret; } } &,])\s?(\p{L}+)/u", $data->{$this->variable}->{'raw'})) {
130  return $this->addAffixes($this->format($this->applyTextCase($data->{$this->variable}->{'raw'})));
131  } else {
132  if (isset($data->{$this->variable}->{'string-literal'})) {
133  return $this->addAffixes(
134  $this->format($this->applyTextCase($data->{$this->variable}->{'string-literal'}))
135  );
136  }
137  }
138  }
139 
140  $form = $this->form;
141  $dateParts = !empty($this->datePartsAttribute) ? explode("-", $this->datePartsAttribute) : [];
142  $this->prepareDatePartsChildren($dateParts, $form);
143 
144  // No date-parts in date-part attribute defined, take into account that the defined date-part children will
145  // be used.
146  if (empty($this->datePartsAttribute) && $this->dateParts->count() > 0) {
148  foreach ($this->dateParts as $part) {
149  $dateParts[] = $part->getName();
150  }
151  }
152 
153  /* cs:date may have one or more cs:date-part child elements (see Date-part). The attributes set on
154  these elements override those specified for the localized date formats (e.g. to get abbreviated months for all
155  locales, the form attribute on the month-cs:date-part element can be set to “short”). These cs:date-part
156  elements do not affect which, or in what order, date parts are rendered. Affixes, which are very
157  locale-specific, are not allowed on these cs:date-part elements. */
158 
159  if ($this->dateParts->count() > 0) {
160  if (!isset($var->{'date-parts'})) { // ignore empty date-parts
161  return "";
162  }
163 
164  if (count($data->{$this->variable}->{'date-parts'}) === 1) {
165  $data_ = $this->createDateTime($data->{$this->variable}->{'date-parts'});
166  $ret .= $this->iterateAndRenderDateParts($dateParts, $data_);
167  } elseif (count($var->{'date-parts'}) === 2) { //date range
168  $data_ = $this->createDateTime($var->{'date-parts'});
169  $from = $data_[0];
170  $to = $data_[1];
171  $interval = $to->diff($from);
172  $delimiter = "";
173  $toRender = 0;
174  if ($interval->y > 0 && in_array('year', $dateParts)) {
175  $toRender |= self::DATE_RANGE_STATE_YEAR;
176  $delimiter = $this->dateParts->get($this->form."-year")->getRangeDelimiter();
177  }
178  if ($interval->m > 0 && $from->getMonth() - $to->getMonth() !== 0 && in_array('month', $dateParts)) {
179  $toRender |= self::DATE_RANGE_STATE_MONTH;
180  $delimiter = $this->dateParts->get($this->form."-month")->getRangeDelimiter();
181  }
182  if ($interval->d > 0 && $from->getDay() - $to->getDay() !== 0 && in_array('day', $dateParts)) {
183  $toRender |= self::DATE_RANGE_STATE_DAY;
184  $delimiter = $this->dateParts->get($this->form."-day")->getRangeDelimiter();
185  }
186  if ($toRender === self::DATE_RANGE_STATE_NONE) {
187  $ret .= $this->iterateAndRenderDateParts($dateParts, $data_);
188  } else {
189  $ret .= $this->renderDateRange($toRender, $from, $to, $delimiter);
190  }
191  }
192 
193  if (isset($var->raw) && preg_match("/(\p{L}+)\s?([\-\&,])\s?(\p{L}+)/u", $var->raw, $matches)) { return $matches[1].$matches[2].$matches[3]; } } elseif (!empty($this->datePartsAttribute)) { // fallback: // When there are no dateParts children, but date-parts attribute in date // render numeric $data = $this->createDateTime($var->{'date-parts'}); $ret = $this->renderNumeric($data[0]); } return !empty($ret) ? $this->addAffixes($this->format($this->applyTextCase($ret))) : ""; } /** * @param array $dates * @return array * @throws Exception */ private function createDateTime($dates) { $data = []; foreach ($dates as $date) { $date = $this->cleanDate($date); if ($date[0] < 1000) { $dateTime = new DateTime(0, 0, 0); $dateTime->setDay(0)->setMonth(0)->setYear(0); $data[] = $dateTime; } $dateTime = new DateTime( $date[0], array_key_exists(1, $date) ? $date[1] : 1, array_key_exists(2, $date) ? $date[2] : 1 ); if (!array_key_exists(1, $date)) { $dateTime->setMonth(0); } if (!array_key_exists(2, $date)) { $dateTime->setDay(0); } $data[] = $dateTime; } return $data; } /** * @param int $toRender * @param DateTime $from * @param DateTime $to * @param $delimiter * @return string */ private function renderDateRange($toRender, DateTime $from, DateTime $to, $delimiter) { $datePartRenderer = DateRangeRenderer::factory($this, $toRender); return $datePartRenderer->parseDateRange($this->dateParts, $from, $to, $delimiter); } /** * @param string $format * @return bool */ private function hasDatePartsFromLocales($format) { $dateXml = CiteProc::getContext()->getLocale()->getDateXml(); return !empty($dateXml[$format]); } /** * @param string $format * @return array */ private function getDatePartsFromLocales($format) { $ret = []; // date parts from locales $dateFromLocale_ = CiteProc::getContext()->getLocale()->getDateXml(); $dateFromLocale = $dateFromLocale_[$format]; // no custom date parts within the date element (this)? if (!empty($dateFromLocale)) { $dateForm = array_filter( is_array($dateFromLocale) ? $dateFromLocale : [$dateFromLocale], function ($element) use ($format) { /** @var SimpleXMLElement $element */ $dateForm = (string) $element->attributes()["form"]; return $dateForm === $format; } ); //has dateForm from locale children (date-part elements)? $localeDate = array_pop($dateForm); if ($localeDate instanceof SimpleXMLElement && $localeDate->count() > 0) { foreach ($localeDate as $child) { $ret[] = $child; } } } return $ret; } /** * @return string */ public function getVariable() { return $this->variable; } /** * @param $data * @param $var * @throws CiteProcException */ private function prepareDatePartsInVariable($data, $var) { if (!isset($data->{$this->variable}->{'date-parts'}) || empty($data->{$this->variable}->{'date-parts'})) { if (isset($data->{$this->variable}->raw) && !empty($data->{$this->variable}->raw)) { // try to parse date parts from "raw" attribute $var->{'date-parts'} = Util\DateHelper::parseDateParts($data->{$this->variable}); } else { throw new CiteProcException("No valid date format"); } } } /** * @param $dateParts * @param string $form * @throws InvalidStylesheetException */ private function prepareDatePartsChildren($dateParts, $form) { /* Localized date formats are selected with the optional form attribute, which must set to either “numeric” (for fully numeric formats, e.g. “12-15-2005”), or “text” (for formats with a non-numeric month, e.g. “December 15, 2005”). Localized date formats can be customized in two ways. First, the date-parts attribute may be used to show fewer date parts. The possible values are: - “year-month-day” - (default), renders the year, month and day - “year-month” - renders the year and month - “year” - renders the year */ if ($this->dateParts->count() < 1 && in_array($form, self::$localizedDateFormats)) { if ($this->hasDatePartsFromLocales($form)) { $datePartsFromLocales = $this->getDatePartsFromLocales($form); array_filter($datePartsFromLocales, function (SimpleXMLElement $item) use ($dateParts) { return in_array($item["name"], $dateParts); }); foreach ($datePartsFromLocales as $datePartNode) { $datePart = $datePartNode["name"]; $this->dateParts->set("$form-$datePart", Util\Factory::create($datePartNode)); } } else { //otherwise create default date parts foreach ($dateParts as $datePart) { $this->dateParts->add( "$form-$datePart", new DatePart( new SimpleXMLElement('<date-part name="'.$datePart.'" form="'.$form.'" />') ) ); } } } } private function renderNumeric(DateTime $date) { return $date->renderNumeric(); } public function getForm() { return $this->form; } private function cleanDate($date) { $ret = []; foreach ($date as $key => $datePart) { $ret[$key] = Util\NumberHelper::extractNumber(Util\StringHelper::removeBrackets($datePart)); } return $ret; } /** * @param array $dateParts * @param array $data_ * @return string */ private function iterateAndRenderDateParts(array $dateParts, array $data_) { $ret = ""; /** @var DatePart $datePart */ foreach ($this->dateParts as $key => $datePart) { /** @noinspection PhpUnusedLocalVariableInspection */ list($f, $p) = explode("-", $key); if (in_array($p, $dateParts)) { $ret .= $datePart->render($data_[0], $this); } } return $ret; } } &,])\s?(\p{L}+)/u", $var->raw, $matches)) {
194  return $matches[1].$matches[2].$matches[3];
195  }
196  } elseif (!empty($this->datePartsAttribute)) {
197  // fallback:
198  // When there are no dateParts children, but date-parts attribute in date
199  // render numeric
200  $data = $this->createDateTime($var->{'date-parts'});
201  $ret = $this->renderNumeric($data[0]);
202  }
203 
204  return !empty($ret) ? $this->addAffixes($this->format($this->applyTextCase($ret))) : "";
205  }
206 
212  private function createDateTime($dates)
213  {
214  $data = [];
215  foreach ($dates as $date) {
216  $date = $this->cleanDate($date);
217  if ($date[0] < 1000) {
218  $dateTime = new DateTime(0, 0, 0);
219  $dateTime->setDay(0)->setMonth(0)->setYear(0);
220  $data[] = $dateTime;
221  }
222  $dateTime = new DateTime(
223  $date[0],
224  array_key_exists(1, $date) ? $date[1] : 1,
225  array_key_exists(2, $date) ? $date[2] : 1
226  );
227  if (!array_key_exists(1, $date)) {
228  $dateTime->setMonth(0);
229  }
230  if (!array_key_exists(2, $date)) {
231  $dateTime->setDay(0);
232  }
233  $data[] = $dateTime;
234  }
235 
236  return $data;
237  }
238 
246  private function renderDateRange($toRender, DateTime $from, DateTime $to, $delimiter)
247  {
248  $datePartRenderer = DateRangeRenderer::factory($this, $toRender);
249  return $datePartRenderer->parseDateRange($this->dateParts, $from, $to, $delimiter);
250  }
251 
256  private function hasDatePartsFromLocales($format)
257  {
258  $dateXml = CiteProc::getContext()->getLocale()->getDateXml();
259  return !empty($dateXml[$format]);
260  }
261 
266  private function getDatePartsFromLocales($format)
267  {
268  $ret = [];
269  // date parts from locales
270  $dateFromLocale_ = CiteProc::getContext()->getLocale()->getDateXml();
271  $dateFromLocale = $dateFromLocale_[$format];
272 
273  // no custom date parts within the date element (this)?
274  if (!empty($dateFromLocale)) {
275  $dateForm = array_filter(
276  is_array($dateFromLocale) ? $dateFromLocale : [$dateFromLocale],
277  function ($element) use ($format) {
279  $dateForm = (string) $element->attributes()["form"];
280  return $dateForm === $format;
281  }
282  );
283 
284  //has dateForm from locale children (date-part elements)?
285  $localeDate = array_pop($dateForm);
286 
287  if ($localeDate instanceof SimpleXMLElement && $localeDate->count() > 0) {
288  foreach ($localeDate as $child) {
289  $ret[] = $child;
290  }
291  }
292  }
293  return $ret;
294  }
295 
299  public function getVariable()
300  {
301  return $this->variable;
302  }
303 
309  private function prepareDatePartsInVariable($data, $var)
310  {
311  if (!isset($data->{$this->variable}->{'date-parts'}) || empty($data->{$this->variable}->{'date-parts'})) {
312  if (isset($data->{$this->variable}->raw) && !empty($data->{$this->variable}->raw)) {
313  // try to parse date parts from "raw" attribute
314  $var->{'date-parts'} = Util\DateHelper::parseDateParts($data->{$this->variable});
315  } else {
316  throw new CiteProcException("No valid date format");
317  }
318  }
319  }
320 
326  private function prepareDatePartsChildren($dateParts, $form)
327  {
328  /* Localized date formats are selected with the optional form attribute, which must set to either “numeric”
329  (for fully numeric formats, e.g. “12-15-2005”), or “text” (for formats with a non-numeric month, e.g.
330  “December 15, 2005”). Localized date formats can be customized in two ways. First, the date-parts attribute may
331  be used to show fewer date parts. The possible values are:
332  - “year-month-day” - (default), renders the year, month and day
333  - “year-month” - renders the year and month
334  - “year” - renders the year */
335 
336  if ($this->dateParts->count() < 1 && in_array($form, self::$localizedDateFormats)) {
337  if ($this->hasDatePartsFromLocales($form)) {
338  $datePartsFromLocales = $this->getDatePartsFromLocales($form);
339  array_filter($datePartsFromLocales, function (SimpleXMLElement $item) use ($dateParts) {
340  return in_array($item["name"], $dateParts);
341  });
342 
343  foreach ($datePartsFromLocales as $datePartNode) {
344  $datePart = $datePartNode["name"];
345  $this->dateParts->set("$form-$datePart", Util\Factory::create($datePartNode));
346  }
347  } else { //otherwise create default date parts
348  foreach ($dateParts as $datePart) {
349  $this->dateParts->add(
350  "$form-$datePart",
351  new DatePart(
352  new SimpleXMLElement('<date-part name="'.$datePart.'" form="'.$form.'" />')
353  )
354  );
355  }
356  }
357  }
358  }
359 
360 
361  private function renderNumeric(DateTime $date)
362  {
363  return $date->renderNumeric();
364  }
365 
366  public function getForm()
367  {
368  return $this->form;
369  }
370 
371  private function cleanDate($date)
372  {
373  $ret = [];
374  foreach ($date as $key => $datePart) {
375  $ret[$key] = Util\NumberHelper::extractNumber(Util\StringHelper::removeBrackets($datePart));
376  }
377  return $ret;
378  }
379 
385  private function iterateAndRenderDateParts(array $dateParts, array $data_)
386  {
387  $ret = "";
389  foreach ($this->dateParts as $key => $datePart) {
391  list($f, $p) = explode("-", $key);
392  if (in_array($p, $dateParts)) {
393  $ret .= $datePart->render($data_[0], $this);
394  }
395  }
396  return $ret;
397  }
398 }
Seboettg\CiteProc\Rendering\Date\Date\DATE_RANGE_STATE_DAY
const DATE_RANGE_STATE_DAY
Definition: Date.php:40
Seboettg\CiteProc\Rendering\Date\Date\DATE_RANGE_STATE_YEARMONTHDAY
const DATE_RANGE_STATE_YEARMONTHDAY
Definition: Date.php:46
Seboettg\CiteProc\Styles\DisplayTrait
trait DisplayTrait
Definition: DisplayTrait.php:20
Seboettg\CiteProc\Styles\AffixesTrait
trait AffixesTrait
Definition: AffixesTrait.php:21
Seboettg\CiteProc\Styles\FormattingTrait
trait FormattingTrait
Definition: FormattingTrait.php:21
Seboettg\CiteProc\Style\getForm
getForm()
Definition: InheritableNameAttributesTrait.php:621
Seboettg\CiteProc\Rendering\Date\Date\render
render($data)
Definition: Date.php:127
Seboettg\CiteProc\Exception\InvalidStylesheetException
Definition: InvalidStylesheetException.php:10
Seboettg\CiteProc\Rendering\Date\Date
Definition: Date.php:31
Seboettg\CiteProc\Rendering\Date\Date\__construct
__construct(SimpleXMLElement $node)
Definition: Date.php:90
Seboettg\CiteProc\CiteProc
Definition: CiteProc.php:32
Seboettg\CiteProc\Rendering\Date\Date\getForm
getForm()
Definition: Date.php:378
Seboettg\CiteProc\Styles\TextCaseTrait
trait TextCaseTrait
Definition: TextCaseTrait.php:23
Seboettg\Collection\count
count()
Definition: ArrayListTrait.php:253
Seboettg\CiteProc\Exception\CiteProcException
Definition: CiteProcException.php:20
Seboettg\CiteProc\Rendering\Date\Date\DATE_RANGE_STATE_MONTH
const DATE_RANGE_STATE_MONTH
Definition: Date.php:41
Seboettg\CiteProc\Styles\addAffixes
addAffixes($text)
Definition: AffixesTrait.php:75
Seboettg\CiteProc\Util
Definition: CiteProcHelper.php:10
Seboettg\CiteProc\Rendering\Date\Date\DATE_RANGE_STATE_YEAR
const DATE_RANGE_STATE_YEAR
Definition: Date.php:43
Seboettg\CiteProc\Rendering\Date\DateRange\DateRangeRenderer
Definition: DateRangeRenderer.php:20
Seboettg\CiteProc\Rendering\Date\Date\DATE_RANGE_STATE_MONTHDAY
const DATE_RANGE_STATE_MONTHDAY
Definition: Date.php:42
Seboettg\CiteProc\Rendering\Date\Date\DATE_RANGE_STATE_YEARDAY
const DATE_RANGE_STATE_YEARDAY
Definition: Date.php:44
Seboettg\CiteProc\Rendering\Date
Definition: Date.php:10
Seboettg\CiteProc\Styles\applyTextCase
applyTextCase($text, $lang="en")
Definition: TextCaseTrait.php:49
Seboettg\CiteProc\Rendering\Date\Date\DATE_RANGE_STATE_YEARMONTH
const DATE_RANGE_STATE_YEARMONTH
Definition: Date.php:45
Seboettg\CiteProc\Rendering\Date\Date\getVariable
getVariable()
Definition: Date.php:311
Seboettg\CiteProc\Rendering\Date\Date\DATE_RANGE_STATE_NONE
const DATE_RANGE_STATE_NONE
Definition: Date.php:39
Seboettg\Collection\ArrayList
Definition: ArrayList.php:20
Seboettg\CiteProc\Styles\format
format($text)
Definition: FormattingTrait.php:81
Seboettg\CiteProc\Util\Factory\create
static create($node, $param=null)
Definition: Util/Factory.php:55