19 use Seboettg\CiteProc\Styles\DelimiterTrait;
38 private static $numberOfCitedItems = 0;
43 ConsecutivePunctuationCharacterTrait;
56 private $delimiter =
"";
68 $this->parent = $parent;
69 self::$numberOfCitedItems = 0;
71 foreach ($node->children() as $child) {
74 $this->initDelimiterAttributes($node);
75 $this->initAffixesAttributes($node);
76 $this->initFormattingAttributes($node);
84 public function render($data, $citationItems = [])
88 if (!empty($sorting)) {
90 $sorting->sort($data);
95 foreach ($data as $citationNumber => $item) {++self::$numberOfCitedItems;
97 $this->wrapBibEntry($item, $this->renderSingle($item, $citationNumber))
102 return "<div class=\"csl-bib-body\">".$ret.
"\n</div>";
104 if ($citationItems->count() > 0) {
105 if ($this->isGroupedCitations($citationItems)) {
106 return $this->renderGroupedCitations($data, $citationItems);
108 $data = $this->filterCitationItems($data, $citationItems);
109 $ret = $this->renderCitations($data, $ret);
112 $ret = $this->renderCitations($data, $ret);
124 private function renderSingle($data, $citationNumber =
null)
130 foreach ($this->children as $key => $child) {
131 $rendered = $child->render($data, $citationNumber);
134 && $bibliographyOptions->getSecondFieldAlign() ===
"flush"
136 if ($key === 0 && !empty($rendered)) {
137 $inMargin[] = $rendered;
139 $margin[] = $rendered;
142 $inMargin[] = $rendered;
150 $this->htmlentities($this->
format(implode(
"", $margin))).
153 $res =
'<div class="csl-left-margin">'.$leftMargin.
'</div>';
154 $res .=
'<div class="csl-right-inline">'.$rightInline.
'</div>';
156 } elseif (!empty($inMargin)) {
157 $res = $this->
format(implode(
"", $inMargin));
168 return self::$numberOfCitedItems;
176 private function wrapBibEntry($dataItem, $value)
180 "<div class=\"csl-entry\">".
189 private function htmlentities($text)
191 $text = preg_replace(
"/(.*)&([^#38|amp];.*)/u",
"$1&$2", $text);
200 private function renderCitations($data, $ret)
203 foreach ($data as $citationNumber => $item) {
204 $renderedItem = $this->renderSingle($item, $citationNumber);
217 private function filterCitationItems($data, $citationItems)
219 $arr = $data->toArray();
221 $arr_ = array_filter($arr,
function($dataItem) use ($citationItems) {
222 foreach ($citationItems as $citationItem) {
223 if ($dataItem->id === $citationItem->id) {
230 return $data->replace($arr_);
237 private function isGroupedCitations(ArrayList $citationItems)
239 $firstItem = array_values($citationItems->toArray())[0];
240 if (is_array($firstItem)) {
251 private function renderGroupedCitations($data, $citationItems)
254 foreach ($citationItems as $citationItemGroup) {
255 $data_ = $this->filterCitationItems(clone $data, $citationItemGroup);
262 return implode(
"\n", $group);