21 use Seboettg\CiteProc\Styles\DelimiterTrait;
41 InheritableNameAttributesTrait;
109 private $delimiter =
", ";
120 public function __construct(SimpleXMLElement $node, $parent)
122 $this->initInheritableNameAttributes($node);
123 $this->parent = $parent;
127 foreach ($node->children() as $child) {
128 switch ($child->getName()) {
136 $this->substitute =
new Substitute($child, $this);
146 foreach ($node->attributes() as $attribute) {
147 if (
"variable" === $attribute->getName()) {
148 $this->variables =
new ArrayList(explode(
" ", (
string) $attribute));
153 $this->initDelimiterAttributes($node);
154 $this->initAffixesAttributes($node);
155 $this->initFormattingAttributes($node);
172 public function render($data, $citationNumber =
null)
180 if ($this->variables->hasValue(
"editor") && $this->variables->hasValue(
"translator")) {
181 if (isset($data->editor)
184 if (isset($this->name)) {
185 $str .= $this->name->render($data,
'editor');
188 foreach ($data->editor as $editor) {
189 $edt = $this->
format($editor->family.
", ".$editor->given);
192 $str .= implode($this->delimiter, $arr);
194 if (isset($this->label)) {
195 $this->label->setVariable(
"editortranslator");
196 $str .= $this->label->render($data);
198 $vars = $this->variables->toArray();
199 $vars = array_filter($vars,
function ($value) {
200 return !($value ===
"editor" || $value ===
"translator");
202 $this->variables->setArray($vars);
207 foreach ($this->variables as $var) {
208 if (!empty($data->{$var})) {
209 if (!empty($this->name)) {
210 $res = $this->name->render($data, $var, $citationNumber);
212 if (!empty($this->label)) {
213 $name = $this->appendLabel($data, $var, $name);
216 if (is_numeric($name) && $this->name->getForm() ===
"count") {
217 $results = $this->addCountValues($res, $results);
219 $results[] = $this->
format($name);
222 foreach ($data->{$var} as $name) {
223 $formatted = $this->
format($name->given.
" ".$name->family);
229 unset($data->{$var});
232 if (!empty($this->substitute)) {
233 $results[] = $this->substitute->render($data);
237 $results = $this->filterEmpty($results);
238 $str .= implode($this->delimiter, $results);
239 return !empty($str) ? $this->
addAffixes($str) :
"";
249 private function appendLabel($data, $var, $name)
251 $this->label->setVariable($var);
252 if (in_array($this->label->getForm(), [
"verb",
"verb-short"])) {
253 $name = $this->label->render($data).$name;
255 $name .= $this->label->render($data);
265 private function addCountValues($res, $results)
267 $lastElement =
current($results);
268 $key = key($results);
269 if (!empty($lastElement)) {
270 $lastElement += $res;
271 $results[$key] = $lastElement;
281 public function hasEtAl()
283 return !empty($this->etAl);
289 public function getEtAl()
298 public function setEtAl(EtAl $etAl)
307 public function hasName()
309 return !empty($this->name);
315 public function getName()
324 public function setName(
Name $name)
333 public function getDelimiter()
335 return $this->delimiter;
341 public function getVariables()
343 return $this->variables;
349 public function hasLabel()
351 return !empty($this->label);
357 public function getLabel()
365 public function setLabel($label)
367 $this->label = $label;
373 public function getParent()
375 return $this->parent;
378 private function filterEmpty(array $results)
380 return array_filter($results,
function ($item) {
381 return !empty($item);