Open Journal Systems  3.3.0
InheritableNameAttributesTrait.php
1 <?php
2 /*
3  * citeproc-php
4  *
5  * @link http://github.com/seboettg/citeproc-php for the source repository
6  * @copyright Copyright (c) 2017 Sebastian Böttger.
7  * @license https://opensource.org/licenses/MIT
8  */
9 
10 namespace Seboettg\CiteProc\Style;
11 
17 use SimpleXMLElement;
18 
37 {
38  public static $attributes = [
39  'and',
40  'delimiter-precedes-et-al',
41  'delimiter-precedes-last',
42  'et-al-min',
43  'et-al-use-first',
44  'et-al-use-last',
45  'et-al-subsequent-min',
46  'et-al-subsequent-use-first',
47  'initialize',
48  'initialize-with',
49  'name-as-sort-order',
50  'sort-separator',
51  'name-form',
52  'form',
53  'name-delimiter',
54  'delimiter'
55  ];
56 
60  protected $attributesInitialized = false;
61 
69  private $and;
70 
90  private $delimiterPrecedesEtAl;
91 
113  private $delimiterPrecedesLast;
114 
122  private $etAlMin;
123 
131  private $etAlUseFirst;
132 
142  private $etAlUseLast = false;
143 
150  private $etAlSubsequentMin;
151 
158  private $etAlSubsequentUseFirst;
159 
167  private $initialize = true;
168 
176  private $initializeWith = false;
177 
190  private $nameAsSortOrder = "";
191 
199  private $sortSeparator = ", ";
200 
209  private $form;
210 
211  private $nameForm = "long";
212 
213  private $nameDelimiter = ", ";
214 
215  public function isDescendantOfMacro()
216  {
217  $parent = $this->parent;
218 
219  while ($parent != null && $parent instanceof HasParent) {
220  if ($parent instanceof Macro) {
221  return true;
222  }
223  $parent = $parent->getParent();
224  }
225  return false;
226  }
227 
231  public function initInheritableNameAttributes(SimpleXMLElement $node)
232  {
233  $context = CiteProc::getContext();
234  $parentStyleElement = null;
235  if ($this instanceof Name || $this instanceof Names) {
236  if ($context->getMode() === "bibliography") {
237  if ($this->isDescendantOfMacro()) {
238  $parentStyleElement = $context->getRoot();
239  } else {
240  $parentStyleElement = $context->getBibliography();
241  }
242  } else {
243  $parentStyleElement = $context->getCitation();
244  }
245  } elseif ($this instanceof StyleElement) {
246  $parentStyleElement = $context->getRoot();
247  }
248 
249  foreach (self::$attributes as $nameAttribute) {
250  $attribute = $node[$nameAttribute];
251  switch ($nameAttribute) {
252  case 'and':
253  if (!empty($attribute)) {
254  $this->and = (string) $attribute;
255  } elseif (!empty($parentStyleElement)) { //inherit from parent style
256  $this->and = $parentStyleElement->getAnd();
257  }
258  break;
259  case 'delimiter-precedes-et-al':
260  if (!empty($attribute)) {
261  $this->delimiterPrecedesEtAl = (string) $attribute;
262  } elseif (!empty($parentStyleElement)) { //inherit from parent style
263  $this->delimiterPrecedesEtAl = $parentStyleElement->getDelimiterPrecedesEtAl();
264  }
265  break;
266  case 'delimiter-precedes-last':
267  if (!empty($attribute)) {
268  $this->delimiterPrecedesLast = (string) $attribute;
269  } elseif (!empty($parentStyleElement)) { //inherit from parent style
270  $this->delimiterPrecedesLast = $parentStyleElement->getDelimiterPrecedesLast();
271  }
272  break;
273  case 'et-al-min':
274  if (!empty($attribute)) {
275  $this->etAlMin = intval((string) $attribute);
276  } elseif (!empty($parentStyleElement)) {
277  $this->etAlMin = $parentStyleElement->getEtAlMin();
278  }
279  break;
280  case 'et-al-use-first':
281  if (!empty($attribute)) {
282  $this->etAlUseFirst = intval((string) $attribute);
283  } elseif (!empty($parentStyleElement)) {
284  $this->etAlUseFirst = $parentStyleElement->getEtAlUseFirst();
285  }
286  break;
287  case 'et-al-subsequent-min':
288  if (!empty($attribute)) {
289  $this->etAlSubsequentMin = intval((string) $attribute);
290  } elseif (!empty($parentStyleElement)) {
291  $this->etAlSubsequentMin = $parentStyleElement->getEtAlSubsequentMin();
292  }
293  break;
294  case 'et-al-subsequent-use-first':
295  if (!empty($attribute)) {
296  $this->etAlSubsequentUseFirst = intval((string) $attribute);
297  } elseif (!empty($parentStyleElement)) {
298  $this->etAlSubsequentUseFirst = $parentStyleElement->getEtAlSubsequentUseFirst();
299  }
300  break;
301  case 'et-al-use-last':
302  if (!empty($attribute)) {
303  $this->etAlUseLast = boolval((string) $attribute);
304  } elseif (!empty($parentStyleElement)) {
305  $this->etAlUseLast = $parentStyleElement->getEtAlUseLast();
306  }
307  break;
308  case 'initialize':
309  if (!empty($attribute)) {
310  $this->initialize = boolval((string) $attribute);
311  } elseif (!empty($parentStyleElement)) {
312  $this->initialize = $parentStyleElement->getInitialize();
313  }
314  break;
315  case 'initialize-with':
316  if (!empty($attribute)) {
317  $this->initializeWith = (string) $attribute;
318  } elseif (!empty($parentStyleElement)) {
319  $this->initializeWith = $parentStyleElement->getInitializeWith();
320  }
321  break;
322  case 'name-as-sort-order':
323  if (!empty($attribute)) {
324  $this->nameAsSortOrder = (string) $attribute;
325  } elseif (!empty($parentStyleElement)) {
326  $this->nameAsSortOrder = $parentStyleElement->getNameAsSortOrder();
327  }
328  break;
329  case 'sort-separator':
330  if (!empty($attribute)) {
331  $this->sortSeparator = (string) $attribute;
332  } elseif (!empty($parentStyleElement)) {
333  $this->sortSeparator = $parentStyleElement->getSortSeparator();
334  }
335  break;
336  case 'name-form':
337  if ($this instanceof Root || $this instanceof StyleElement) {
338  if (!empty($attribute)) {
339  $this->setNameForm((string) $attribute);
340  } elseif (!empty($parentStyleElement)) {
341  $this->setNameForm($parentStyleElement->getNameForm());
342  }
343  }
344  break;
345  case 'form':
346  if ($this instanceof Name) {
347  if (!empty($attribute)) {
348  $this->setForm((string) $attribute);
349  } elseif (!empty($parentStyleElement)) {
350  $this->setForm($parentStyleElement->getNameForm());
351  }
352  }
353  break;
354  case 'name-delimiter':
355  if ($this instanceof Root || $this instanceof StyleElement) {
356  if (!empty($attribute)) {
357  $this->setNameDelimiter((string) $attribute);
358  } elseif (!empty($parentStyleElement)) {
359  $this->setNameDelimiter($parentStyleElement->getNameDelimiter());
360  }
361  } else {
362  /* The attributes name-form and name-delimiter correspond to the form and delimiter attributes
363  on cs:name. Similarly, names-delimiter corresponds to the delimiter attribute on cs:names. */
364  if (!empty($attribute)) {
365  $this->nameDelimiter = $this->delimiter = (string) $attribute;
366  } elseif (!empty($parentStyleElement)) {
367  $this->nameDelimiter = $this->delimiter = $parentStyleElement->getNameDelimiter();
368  }
369  }
370  break;
371  case 'delimiter':
372  if ($this instanceof Name) {
373  if (!empty($attribute)) {
374  $this->setDelimiter((string) $attribute);
375  } elseif (!empty($parentStyleElement)) {
376  $this->setDelimiter($parentStyleElement->getNameDelimiter());
377  }
378  }
379  }
380  }
381  $this->attributesInitialized = true;
382  }
383 
387  public function getAnd()
388  {
389  return $this->and;
390  }
391 
395  public function setAnd($and)
396  {
397  $this->and = $and;
398  }
399 
403  public function getDelimiterPrecedesEtAl()
404  {
405  return $this->delimiterPrecedesEtAl;
406  }
407 
411  public function setDelimiterPrecedesEtAl($delimiterPrecedesEtAl)
412  {
413  $this->delimiterPrecedesEtAl = $delimiterPrecedesEtAl;
414  }
415 
419  public function getDelimiterPrecedesLast()
420  {
421  return $this->delimiterPrecedesLast;
422  }
423 
427  public function setDelimiterPrecedesLast($delimiterPrecedesLast)
428  {
429  $this->delimiterPrecedesLast = $delimiterPrecedesLast;
430  }
431 
435  public function getEtAlMin()
436  {
437  return $this->etAlMin;
438  }
439 
443  public function setEtAlMin($etAlMin)
444  {
445  $this->etAlMin = $etAlMin;
446  }
447 
451  public function getEtAlUseFirst()
452  {
453  return $this->etAlUseFirst;
454  }
455 
459  public function setEtAlUseFirst($etAlUseFirst)
460  {
461  $this->etAlUseFirst = $etAlUseFirst;
462  }
463 
467  public function getEtAlUseLast()
468  {
469  return $this->etAlUseLast;
470  }
471 
475  public function setEtAlUseLast($etAlUseLast)
476  {
477  $this->etAlUseLast = $etAlUseLast;
478  }
479 
483  public function getEtAlSubsequentMin()
484  {
485  return $this->etAlSubsequentMin;
486  }
487 
491  public function setEtAlSubsequentMin($etAlSubsequentMin)
492  {
493  $this->etAlSubsequentMin = $etAlSubsequentMin;
494  }
495 
499  public function getEtAlSubsequentUseFirst()
500  {
501  return $this->etAlSubsequentUseFirst;
502  }
503 
507  public function setEtAlSubsequentUseFirst($etAlSubsequentUseFirst)
508  {
509  $this->etAlSubsequentUseFirst = $etAlSubsequentUseFirst;
510  }
511 
515  public function getInitialize()
516  {
517  return $this->initialize;
518  }
519 
523  public function setInitialize($initialize)
524  {
525  $this->initialize = $initialize;
526  }
527 
531  public function getInitializeWith()
532  {
533  return $this->initializeWith;
534  }
535 
539  public function setInitializeWith($initializeWith)
540  {
541  $this->initializeWith = $initializeWith;
542  }
543 
547  public function getNameAsSortOrder()
548  {
549  return $this->nameAsSortOrder;
550  }
551 
555  public function setNameAsSortOrder($nameAsSortOrder)
556  {
557  $this->nameAsSortOrder = $nameAsSortOrder;
558  }
559 
563  public function getSortSeparator()
564  {
565  return $this->sortSeparator;
566  }
567 
571  public function setSortSeparator($sortSeparator)
572  {
573  $this->sortSeparator = $sortSeparator;
574  }
575 
579  public function getForm()
580  {
581  return $this->form;
582  }
583 
587  public function setForm($form)
588  {
589  $this->form = $form;
590  }
591 
595  public function getNameForm()
596  {
597  return $this->nameForm;
598  }
599 
603  public function setNameForm($nameForm)
604  {
605  $this->nameForm = $nameForm;
606  }
607 
611  public function getNameDelimiter()
612  {
613  return $this->nameDelimiter;
614  }
615 
619  public function setNameDelimiter($nameDelimiter)
620  {
621  $this->nameDelimiter = $nameDelimiter;
622  }
623 }
Seboettg\CiteProc\Style\Macro
Definition: Macro.php:37
Seboettg\CiteProc\Style\setInitializeWith
setInitializeWith($initializeWith)
Definition: InheritableNameAttributesTrait.php:581
Seboettg\CiteProc\Style\getInitialize
getInitialize()
Definition: InheritableNameAttributesTrait.php:557
Seboettg\CiteProc\Style\getInitializeWith
getInitializeWith()
Definition: InheritableNameAttributesTrait.php:573
Seboettg\CiteProc\Style\getAnd
getAnd()
Definition: InheritableNameAttributesTrait.php:429
Seboettg\CiteProc\Style\getEtAlUseLast
getEtAlUseLast()
Definition: InheritableNameAttributesTrait.php:509
Seboettg\CiteProc\Style\setEtAlUseLast
setEtAlUseLast($etAlUseLast)
Definition: InheritableNameAttributesTrait.php:517
Seboettg\CiteProc\Style\setNameForm
setNameForm($nameForm)
Definition: InheritableNameAttributesTrait.php:645
Seboettg\CiteProc\Style\getForm
getForm()
Definition: InheritableNameAttributesTrait.php:621
Seboettg\CiteProc\Style\InheritableNameAttributesTrait
trait InheritableNameAttributesTrait
Definition: InheritableNameAttributesTrait.php:37
Seboettg\CiteProc\Style\setEtAlUseFirst
setEtAlUseFirst($etAlUseFirst)
Definition: InheritableNameAttributesTrait.php:501
Seboettg\CiteProc\Style\getNameAsSortOrder
getNameAsSortOrder()
Definition: InheritableNameAttributesTrait.php:589
Seboettg\CiteProc\Style\getEtAlUseFirst
getEtAlUseFirst()
Definition: InheritableNameAttributesTrait.php:493
Seboettg\CiteProc\Style\setDelimiterPrecedesLast
setDelimiterPrecedesLast($delimiterPrecedesLast)
Definition: InheritableNameAttributesTrait.php:469
Seboettg\CiteProc\Style\getDelimiterPrecedesEtAl
getDelimiterPrecedesEtAl()
Definition: InheritableNameAttributesTrait.php:445
Seboettg\CiteProc\Style\isDescendantOfMacro
isDescendantOfMacro()
Definition: InheritableNameAttributesTrait.php:257
Seboettg\CiteProc\Style\getNameForm
getNameForm()
Definition: InheritableNameAttributesTrait.php:637
Seboettg\CiteProc\Style\$attributesInitialized
$attributesInitialized
Definition: InheritableNameAttributesTrait.php:63
Seboettg\CiteProc\Rendering\HasParent
Definition: HasParent.php:17
Seboettg\CiteProc\Style\setInitialize
setInitialize($initialize)
Definition: InheritableNameAttributesTrait.php:565
Seboettg\CiteProc\Style\initInheritableNameAttributes
initInheritableNameAttributes(SimpleXMLElement $node)
Definition: InheritableNameAttributesTrait.php:273
Seboettg\CiteProc\CiteProc
Definition: CiteProc.php:32
Seboettg\CiteProc\Rendering\Name\Name
Definition: Name.php:39
Seboettg\CiteProc\Style\StyleElement
Definition: StyleElement.php:30
Seboettg\CiteProc\Root\Root
Definition: Root.php:19
Seboettg\CiteProc\Rendering\Name\Names
Definition: Names.php:36
Seboettg\CiteProc\Style\getEtAlSubsequentMin
getEtAlSubsequentMin()
Definition: InheritableNameAttributesTrait.php:525
Seboettg\CiteProc\Style\setEtAlMin
setEtAlMin($etAlMin)
Definition: InheritableNameAttributesTrait.php:485
Seboettg\CiteProc\Style\setSortSeparator
setSortSeparator($sortSeparator)
Definition: InheritableNameAttributesTrait.php:613
Seboettg\CiteProc\Style\setNameAsSortOrder
setNameAsSortOrder($nameAsSortOrder)
Definition: InheritableNameAttributesTrait.php:597
Seboettg\CiteProc\Style\getNameDelimiter
getNameDelimiter()
Definition: InheritableNameAttributesTrait.php:653
Seboettg\CiteProc\Style\setNameDelimiter
setNameDelimiter($nameDelimiter)
Definition: InheritableNameAttributesTrait.php:661
Seboettg\CiteProc\Style\setDelimiterPrecedesEtAl
setDelimiterPrecedesEtAl($delimiterPrecedesEtAl)
Definition: InheritableNameAttributesTrait.php:453
Seboettg\CiteProc\Style\setEtAlSubsequentMin
setEtAlSubsequentMin($etAlSubsequentMin)
Definition: InheritableNameAttributesTrait.php:533
Seboettg\CiteProc\Style\getSortSeparator
getSortSeparator()
Definition: InheritableNameAttributesTrait.php:605
Seboettg\CiteProc\CiteProc\getContext
static getContext()
Definition: CiteProc.php:45
Seboettg\CiteProc\Style\setForm
setForm($form)
Definition: InheritableNameAttributesTrait.php:629
Seboettg\CiteProc\Style
Definition: Bibliography.php:10
Seboettg\CiteProc\Style\getDelimiterPrecedesLast
getDelimiterPrecedesLast()
Definition: InheritableNameAttributesTrait.php:461
Seboettg\CiteProc\Style\getEtAlSubsequentUseFirst
getEtAlSubsequentUseFirst()
Definition: InheritableNameAttributesTrait.php:541
Seboettg\CiteProc\Style\setAnd
setAnd($and)
Definition: InheritableNameAttributesTrait.php:437
Seboettg\CiteProc\Style\getEtAlMin
getEtAlMin()
Definition: InheritableNameAttributesTrait.php:477
Seboettg\CiteProc\Style\setEtAlSubsequentUseFirst
setEtAlSubsequentUseFirst($etAlSubsequentUseFirst)
Definition: InheritableNameAttributesTrait.php:549
Omnipay\Common\initialize
initialize(array $parameters=[])
Definition: ParametersTrait.php:63