41 ConsecutivePunctuationCharacterTrait,
47 private $toRenderType;
52 private $toRenderTypeValue;
57 private $form =
"long";
66 foreach ($node->attributes() as $attribute) {
67 $name = $attribute->getName();
68 if (in_array($name, [
'value',
'variable',
'macro',
'term'])) {
69 $this->toRenderType = $name;
70 $this->toRenderTypeValue = (string) $attribute;
72 if ($name ===
"form") {
73 $this->form = (string) $attribute;
76 $this->initFormattingAttributes($node);
77 $this->initDisplayAttributes($node);
78 $this->initTextCaseAttributes($node);
79 $this->initAffixesAttributes($node);
80 $this->initQuotesAttributes($node);
88 public function render($data, $citationNumber =
null)
90 $lang = (isset($data->language) && $data->language !=
'en') ? $data->language :
'en';
93 switch ($this->toRenderType) {
95 $renderedText = $this->applyTextCase($this->toRenderTypeValue, $lang);
98 if ($this->toRenderTypeValue ===
"citation-number") {
99 $renderedText = $this->renderCitationNumber($data, $citationNumber);
101 } elseif ($this->toRenderTypeValue ===
"page") {
102 $renderedText = $this->renderPage($data);
105 $renderedText = $this->renderVariable($data, $lang);
108 unset($data->{$this->toRenderTypeValue});
110 $renderedText = $this->applyAdditionalMarkupFunction($data, $renderedText);
113 $renderedText = $this->renderMacro($data);
118 ->filter(
"terms", $this->toRenderTypeValue, $this->form)
120 $renderedText = !empty($term) ? $this->
applyTextCase($term, $lang) :
"";
122 if (!empty($renderedText)) {
123 $renderedText = $this->formatRenderedText($renderedText);
125 return $renderedText;
131 public function getSource()
133 return $this->toRenderType;
139 public function getVariable()
141 return $this->toRenderTypeValue;
144 private function renderPage($data)
146 if (empty($data->page)) {
151 $data->page = $this->normalizeDateRange($data->page);
152 $ranges = preg_split(
"/[-–]/", trim($data->page));
153 if (count($ranges) > 1) {
162 list($from, $to) = $ranges;
169 private function normalizeDateRange($page)
171 if (preg_match(
"/^(\d+)--(\d+)$/", trim($page), $matches)) {
172 return $matches[1].
"-".$matches[2];
182 private function applyAdditionalMarkupFunction($data, $renderedText)
192 private function renderVariable($data, $lang)
197 if (in_array($this->form, [
"short",
"long"])) {
198 $attrWithPrefix = $this->form.ucfirst($this->toRenderTypeValue);
199 $attrWithSuffix = $this->toRenderTypeValue.
"-".$this->form;
200 if (isset($data->{$attrWithPrefix}) && !empty($data->{$attrWithPrefix})) {
203 str_replace(
" & ",
" & ", $data->{$attrWithPrefix})
208 if (isset($data->{$attrWithSuffix}) && !empty($data->{$attrWithSuffix})) {
210 StringHelper::clearApostrophes(
211 str_replace(
" & ",
" & ", $data->{$attrWithSuffix})
216 if (isset($data->{$this->toRenderTypeValue})) {
218 StringHelper::clearApostrophes(
219 str_replace(
" & ",
" & ", $data->{$this->toRenderTypeValue})
227 if (!empty($data->{$this->toRenderTypeValue})) {
229 StringHelper::clearApostrophes(
230 str_replace(
" & ",
" & ", $data->{$this->toRenderTypeValue})
236 return $renderedText;
243 private function formatRenderedText($renderedText)
245 $text = $this->
format($renderedText);
259 private function renderCitationNumber($data, $citationNumber)
261 $renderedText = $citationNumber + 1;
262 $renderedText = $this->applyAdditionalMarkupFunction($data, $renderedText);
263 return $renderedText;
270 private function renderMacro($data)
272 $macro = CiteProc::getContext()->getMacro($this->toRenderTypeValue);
273 if (is_null($macro)) {
275 throw new CiteProcException(
"Macro \"".$this->toRenderTypeValue.
"\" does not exist.");
276 }
catch (CiteProcException $e) {
280 $renderedText = $macro->render($data);
282 return $renderedText;