Open Journal Systems  3.3.0
Layout.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 
19 use Seboettg\CiteProc\Styles\DelimiterTrait;
25 use SimpleXMLElement;
26 use stdClass;
27 
35 class Layout implements Rendering
36 {
37 
38  private static $numberOfCitedItems = 0;
39 
40  use AffixesTrait,
41  FormattingTrait,
42  DelimiterTrait,
43  ConsecutivePunctuationCharacterTrait;
44 
48  private $children;
49 
56  private $delimiter = "";
57 
58 
59  private $parent;
60 
66  public function __construct($node, $parent)
67  {
68  $this->parent = $parent;
69  self::$numberOfCitedItems = 0;
70  $this->children = new ArrayList();
71  foreach ($node->children() as $child) {
72  $this->children->append(Factory::create($child, $this));
73  }
74  $this->initDelimiterAttributes($node);
75  $this->initAffixesAttributes($node);
76  $this->initFormattingAttributes($node);
77  }
78 
84  public function render($data, $citationItems = [])
85  {
86  $ret = "";
87  $sorting = CiteProc::getContext()->getSorting();
88  if (!empty($sorting)) {
89  CiteProc::getContext()->setRenderingState(new RenderingState("sorting"));
90  $sorting->sort($data);
91  CiteProc::getContext()->setRenderingState(new RenderingState("rendering"));
92  }
93 
94  if (CiteProc::getContext()->isModeBibliography()) {
95  foreach ($data as $citationNumber => $item) {++self::$numberOfCitedItems;
96  CiteProc::getContext()->getResults()->append(
97  $this->wrapBibEntry($item, $this->renderSingle($item, $citationNumber))
98  );
99  }
100  $ret .= implode($this->delimiter, CiteProc::getContext()->getResults()->toArray());
101  $ret = StringHelper::clearApostrophes($ret);
102  return "<div class=\"csl-bib-body\">".$ret."\n</div>";
103  } elseif (CiteProc::getContext()->isModeCitation()) {
104  if ($citationItems->count() > 0) { //is there a filter for specific citations?
105  if ($this->isGroupedCitations($citationItems)) { //if citation items grouped?
106  return $this->renderGroupedCitations($data, $citationItems);
107  } else {
108  $data = $this->filterCitationItems($data, $citationItems);
109  $ret = $this->renderCitations($data, $ret);
110  }
111  } else {
112  $ret = $this->renderCitations($data, $ret);
113  }
114  }
115  $ret = StringHelper::clearApostrophes($ret);
116  return $this->addAffixes($ret);
117  }
118 
124  private function renderSingle($data, $citationNumber = null)
125  {
126 
127  $bibliographyOptions = CiteProc::getContext()->getBibliographySpecificOptions();
128  $inMargin = [];
129  $margin = [];
130  foreach ($this->children as $key => $child) {
131  $rendered = $child->render($data, $citationNumber);
132  $this->getChildsAffixesAndDelimiter($child);
133  if (CiteProc::getContext()->isModeBibliography()
134  && $bibliographyOptions->getSecondFieldAlign() === "flush"
135  ) {
136  if ($key === 0 && !empty($rendered)) {
137  $inMargin[] = $rendered;
138  } else {
139  $margin[] = $rendered;
140  }
141  } else {
142  $inMargin[] = $rendered;
143  }
144  }
145 
146 
147  if (!empty($inMargin) && !empty($margin) && CiteProc::getContext()->isModeBibliography()) {
148  $leftMargin = $this->removeConsecutiveChars($this->htmlentities($this->format(implode("", $inMargin))));
149  $rightInline = $this->removeConsecutiveChars(
150  $this->htmlentities($this->format(implode("", $margin))).
151  $this->suffix
152  );
153  $res = '<div class="csl-left-margin">'.$leftMargin.'</div>';
154  $res .= '<div class="csl-right-inline">'.$rightInline.'</div>';
155  return $res;
156  } elseif (!empty($inMargin)) {
157  $res = $this->format(implode("", $inMargin));
158  return $this->htmlentities($this->removeConsecutiveChars($res));
159  }
160  return "";
161  }
162 
166  public static function getNumberOfCitedItems()
167  {
168  return self::$numberOfCitedItems;
169  }
170 
176  private function wrapBibEntry($dataItem, $value)
177  {
178  $value = $this->addAffixes($value);
179  return "\n ".
180  "<div class=\"csl-entry\">".
181  $renderedItem = CiteProcHelper::applyAdditionMarkupFunction($dataItem, "csl-entry", $value).
182  "</div>";
183  }
184 
189  private function htmlentities($text)
190  {
191  $text = preg_replace("/(.*)&([^#38|amp];.*)/u", "$1&#38;$2", $text);
192  return $text;
193  }
194 
200  private function renderCitations($data, $ret)
201  {
202  CiteProc::getContext()->getResults()->replace([]);
203  foreach ($data as $citationNumber => $item) {
204  $renderedItem = $this->renderSingle($item, $citationNumber);
205  $renderedItem = CiteProcHelper::applyAdditionMarkupFunction($item, "csl-entry", $renderedItem);
206  CiteProc::getContext()->getResults()->append($renderedItem);
207  }
208  $ret .= implode($this->delimiter, CiteProc::getContext()->getResults()->toArray());
209  return $ret;
210  }
211 
217  private function filterCitationItems($data, $citationItems)
218  {
219  $arr = $data->toArray();
220 
221  $arr_ = array_filter($arr, function($dataItem) use ($citationItems) {
222  foreach ($citationItems as $citationItem) {
223  if ($dataItem->id === $citationItem->id) {
224  return true;
225  }
226  }
227  return false;
228  });
229 
230  return $data->replace($arr_);
231  }
232 
237  private function isGroupedCitations(ArrayList $citationItems)
238  {
239  $firstItem = array_values($citationItems->toArray())[0];
240  if (is_array($firstItem)) {
241  return true;
242  }
243  return false;
244  }
245 
251  private function renderGroupedCitations($data, $citationItems)
252  {
253  $group = [];
254  foreach ($citationItems as $citationItemGroup) {
255  $data_ = $this->filterCitationItems(clone $data, $citationItemGroup);
256  CiteProc::getContext()->setCitationItems($data_);
257  $group[] = $this->addAffixes(StringHelper::clearApostrophes($this->renderCitations($data_, "")));
258  }
259  if (CiteProc::getContext()->isCitationsAsArray()) {
260  return $group;
261  }
262  return implode("\n", $group);
263  }
264 }
Seboettg\CiteProc\Rendering\Layout\__construct
__construct($node, $parent)
Definition: Layout.php:72
Seboettg\CiteProc\Rendering\Layout
Definition: Layout.php:35
Seboettg\CiteProc\Styles\getChildsAffixesAndDelimiter
getChildsAffixesAndDelimiter($child)
Definition: ConsecutivePunctuationCharacterTrait.php:64
Seboettg\CiteProc\Styles\AffixesTrait
trait AffixesTrait
Definition: AffixesTrait.php:21
Seboettg\CiteProc\Styles\FormattingTrait
trait FormattingTrait
Definition: FormattingTrait.php:21
Seboettg\CiteProc\Rendering\Layout\getNumberOfCitedItems
static getNumberOfCitedItems()
Definition: Layout.php:172
Seboettg\Collection\toArray
toArray()
Definition: ArrayListTrait.php:245
Seboettg\CiteProc\Exception\InvalidStylesheetException
Definition: InvalidStylesheetException.php:10
Seboettg\CiteProc\Styles\removeConsecutiveChars
removeConsecutiveChars($string)
Definition: ConsecutivePunctuationCharacterTrait.php:87
Seboettg\CiteProc\Util\StringHelper
Definition: StringHelper.php:22
Seboettg\CiteProc\CiteProc
Definition: CiteProc.php:32
Seboettg\CiteProc\Style\StyleElement
Definition: StyleElement.php:30
Seboettg\CiteProc\Util\CiteProcHelper\applyAdditionMarkupFunction
static applyAdditionMarkupFunction($dataItem, $valueToRender, $renderedText)
Definition: CiteProcHelper.php:26
Seboettg\CiteProc\Rendering\Layout\render
render($data, $citationItems=[])
Definition: Layout.php:90
Seboettg\CiteProc\RenderingState
Definition: RenderingState.php:27
Seboettg\CiteProc\Rendering
Seboettg\CiteProc\Styles\addAffixes
addAffixes($text)
Definition: AffixesTrait.php:75
Seboettg\CiteProc\Data\DataList
Definition: DataList.php:22
Seboettg\CiteProc\CiteProc\getContext
static getContext()
Definition: CiteProc.php:45
Seboettg\CiteProc\Util\StringHelper\clearApostrophes
static clearApostrophes($string)
Definition: StringHelper.php:237
Seboettg\CiteProc\Styles\ConsecutivePunctuationCharacterTrait
trait ConsecutivePunctuationCharacterTrait
Definition: ConsecutivePunctuationCharacterTrait.php:18
Seboettg\CiteProc\Util\CiteProcHelper
Definition: CiteProcHelper.php:15
Seboettg\CiteProc\Rendering\Rendering
Definition: Rendering.php:22
Seboettg\Collection\ArrayList
Definition: ArrayList.php:20
Seboettg\CiteProc\Util\Factory
Definition: Util/Factory.php:21
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