Open Journal Systems  3.3.0
CiteProc.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 
12 use InvalidArgumentException;
24 use SimpleXMLElement;
25 
32 class CiteProc
33 {
34 
38  private static $context;
39 
40 
44  public static function getContext()
45  {
46  return self::$context;
47  }
48 
52  public static function setContext($context)
53  {
54  self::$context = $context;
55  }
56 
57  private $lang;
58 
62  private $styleSheet;
63 
67  private $styleSheetXml;
68 
72  private $markupExtension;
73 
80  public function __construct($styleSheet, $lang = "en-US", $markupExtension = [])
81  {
82  $this->styleSheet = $styleSheet;
83  $this->lang = $lang;
84  $this->markupExtension = $markupExtension;
85  }
86 
87  public function __destruct()
88  {
89  self::$context = null;
90  }
91 
96  private function parse(SimpleXMLElement $style)
97  {
98  $root = new Root();
99  $root->initInheritableNameAttributes($style);
100  self::$context->setRoot($root);
101  $globalOptions = new GlobalOptions($style);
102  self::$context->setGlobalOptions($globalOptions);
103 
105  foreach ($style as $node) {
106  $name = $node->getName();
107  switch ($name) {
108  case 'info':
109  self::$context->setInfo(new Info($node));
110  break;
111  case 'locale':
112  self::$context->getLocale()->addXml($node);
113  break;
114  case 'macro':
115  $macro = new Macro($node, $root);
116  self::$context->addMacro($macro->getName(), $macro);
117  break;
118  case 'bibliography':
119  $bibliography = new Bibliography($node, $root);
120  self::$context->setBibliography($bibliography);
121  break;
122  case 'citation':
123  $citation = new Citation($node, $root);
124  self::$context->setCitation($citation);
125  break;
126  }
127  }
128  }
129 
134  protected function bibliography($data)
135  {
136 
137  return self::$context->getBibliography()->render($data);
138  }
139 
145  protected function citation($data, $citationItems)
146  {
147  return self::$context->getCitation()->render($data, $citationItems);
148  }
149 
158  public function render($data, $mode = "bibliography", $citationItems = [], $citationAsArray = false)
159  {
160  if (is_array($data)) {
161  $data = CiteProcHelper::cloneArray($data);
162  }
163 
164  if (!in_array($mode, ['citation', 'bibliography'])) {
165  throw new InvalidArgumentException("\"$mode\" is not a valid mode.");
166  }
167 
168  $this->init($citationAsArray); //initialize
169 
170  $res = "";
171 
172  if (is_array($data)) {
173  $data = new DataList($data);
174  } elseif (!($data instanceof DataList)) {
175  throw new CiteProcException('No valid format for variable data. Either DataList or array expected');
176  }
177 
178  switch ($mode) {
179  case 'bibliography':
180  self::$context->setMode($mode);
181  // set CitationItems to Context
182  self::getContext()->setCitationItems($data);
183  $res = $this->bibliography($data);
184  break;
185  case 'citation':
186  if (is_array($citationItems)) {
187  $citationItems = new ArrayList($citationItems);
188  } elseif (!($citationItems instanceof ArrayList)) {
189  throw new CiteProcException('No valid format for variable `citationItems`, ArrayList expected.');
190  }
191  self::$context->setMode($mode);
192  // set CitationItems to Context
193  //self::getContext()->setCitationItems($data); will now set in Layout
194  $res = $this->citation($data, $citationItems);
195  }
196  self::setContext(null);
197 
198  return $res;
199  }
200 
206  public function init($citationAsArray = false)
207  {
208  self::$context = new Context($this);
209  self::$context->setLocale(new Locale\Locale($this->lang)); //init locale
210  self::$context->setCitationsAsArray($citationAsArray);
211  // set markup extensions
212  self::$context->setMarkupExtension($this->markupExtension);
213  $this->styleSheetXml = new SimpleXMLElement($this->styleSheet);
214  $this->parse($this->styleSheetXml);
215  }
216 
221  public function renderCssStyles()
222  {
223  if (self::getContext() === null) {
224  $this->init();
225  }
226 
227  if (self::getContext()->getCssStyle() == null) {
228  $cssStyle = new CssStyle(self::getContext()->getBibliographySpecificOptions());
229  self::getContext()->setCssStyle($cssStyle);
230  }
231 
232  return self::getContext()->getCssStyle()->render();
233  }
234 }
Seboettg\CiteProc\Style\Macro
Definition: Macro.php:37
Seboettg\CiteProc\Style\Options\GlobalOptions
Definition: GlobalOptions.php:19
Seboettg\CiteProc\Context
Definition: Context.php:32
Seboettg\CiteProc\CiteProc\render
render($data, $mode="bibliography", $citationItems=[], $citationAsArray=false)
Definition: CiteProc.php:167
Seboettg\CiteProc\Locale\Locale
Definition: Locale.php:33
Seboettg\CiteProc\Root\Info
Definition: Info.php:15
Context
Basic class describing a context.
Definition: Context.inc.php:23
Seboettg\CiteProc
Definition: CiteProc.php:10
Seboettg\CiteProc\Style\Bibliography
Definition: Bibliography.php:31
Seboettg\CiteProc\CiteProc
Definition: CiteProc.php:32
Seboettg\CiteProc\Root\Root
Definition: Root.php:19
Seboettg\CiteProc\Exception\CiteProcException
Definition: CiteProcException.php:20
Seboettg\CiteProc\CiteProc\bibliography
bibliography($data)
Definition: CiteProc.php:143
Seboettg\CiteProc\Style\Citation
Definition: Citation.php:31
Seboettg\CiteProc\CiteProc\init
init($citationAsArray=false)
Definition: CiteProc.php:215
Seboettg\CiteProc\CiteProc\__destruct
__destruct()
Definition: CiteProc.php:96
Seboettg\CiteProc\CiteProc\citation
citation($data, $citationItems)
Definition: CiteProc.php:154
Seboettg\CiteProc\Data\DataList
Definition: DataList.php:22
Seboettg\CiteProc\Util\CiteProcHelper\cloneArray
static cloneArray(array $array)
Definition: CiteProcHelper.php:49
Seboettg\CiteProc\CiteProc\renderCssStyles
renderCssStyles()
Definition: CiteProc.php:230
Seboettg\CiteProc\Styles\Css\CssStyle
Definition: CssStyle.php:19
Seboettg\CiteProc\CiteProc\setContext
static setContext($context)
Definition: CiteProc.php:53
Seboettg\CiteProc\CiteProc\getContext
static getContext()
Definition: CiteProc.php:45
Seboettg\CiteProc\CiteProc\__construct
__construct($styleSheet, $lang="en-US", $markupExtension=[])
Definition: CiteProc.php:89
Seboettg\CiteProc\Util\CiteProcHelper
Definition: CiteProcHelper.php:15
Seboettg\Collection\ArrayList
Definition: ArrayList.php:20