diff options
Diffstat (limited to 'platform/www/lib/plugins/refnotes/rendering.php')
-rw-r--r-- | platform/www/lib/plugins/refnotes/rendering.php | 1272 |
1 files changed, 1272 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/refnotes/rendering.php b/platform/www/lib/plugins/refnotes/rendering.php new file mode 100644 index 0000000..22f7c9f --- /dev/null +++ b/platform/www/lib/plugins/refnotes/rendering.php @@ -0,0 +1,1272 @@ +<?php + +/** + * Plugin RefNotes: Renderer + * + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * @author Mykola Ostrovskyy <dwpforge@gmail.com> + */ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +class refnotes_renderer_mock { + + /** + * + */ + public function renderReference($reference) { + return ''; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +abstract class refnotes_renderer_base { + + protected $namespace; + + /** + * Constructor + */ + public function __construct($namespace) { + $this->namespace = $namespace; + } + + /** + * + */ + protected function getStyle($name) { + return $this->namespace->getStyle($name); + } + + /** + * Returns an array of keys for data that is shared between references and notes. + */ + abstract public function getReferenceSharedDataSet(); + + /** + * Returns an array of keys for data that is specific to references. + */ + abstract public function getReferencePrivateDataSet(); + + /** + * + */ + abstract public function renderReference($mode, $reference); + + /** + * + */ + abstract public function renderNoteText($note); + + /** + * + */ + abstract public function renderNote($mode, $note, $reference); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +class refnotes_renderer extends refnotes_renderer_base { + + private $referenceRenderer; + private $noteRenderer; + + /** + * Constructor + */ + public function __construct($namespace) { + parent::__construct($namespace); + + $this->referenceRenderer = $this->createRenderer($this->getStyle('reference-render')); + $this->noteRenderer = $this->createRenderer($this->getStyle('note-render')); + } + + /** + * + */ + private function createRenderer($style) { + switch ($style) { + case 'harvard': + $renderer = new refnotes_harvard_renderer($this->namespace); + break; + + default: + $renderer = new refnotes_basic_renderer($this->namespace); + break; + } + + return $renderer; + } + + /** + * + */ + public function getReferenceSharedDataSet() { + return $this->referenceRenderer->getReferenceSharedDataSet(); + } + + /** + * + */ + public function getReferencePrivateDataSet() { + return $this->referenceRenderer->getReferencePrivateDataSet(); + } + + /** + * + */ + public function renderReference($mode, $reference) { + return $this->referenceRenderer->renderReference($mode, $reference); + } + + /** + * + */ + public function renderNotesSeparator() { + $html = ''; + $style = $this->getStyle('notes-separator'); + if ($style != 'none') { + if ($style != '') { + $style = ' style="width: '. $style . '"'; + } + $html = '<hr' . $style . '>' . DOKU_LF; + } + + return $html; + } + + /** + * + */ + public function renderNoteText($note) { + return $this->noteRenderer->renderNoteText($note); + } + + /** + * + */ + public function renderNote($mode, $note, $reference) { + return $this->noteRenderer->renderNote($mode, $note, $reference); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +class refnotes_renderer_data { + + private $data; + + /** + * Constructor + */ + public function __construct($data) { + $this->data = $data; + } + + /** + * + */ + public function has($key) { + if (func_num_args() > 1) { + $result = false; + + foreach (func_get_args() as $key) { + if (array_key_exists($key, $this->data)) { + $result = true; + break; + } + } + + return $result; + } + else { + return array_key_exists($key, $this->data); + } + } + + /** + * + */ + public function get($key) { + if (func_num_args() > 1) { + $result = ''; + + foreach (func_get_args() as $key) { + if (array_key_exists($key, $this->data)) { + $result = $this->data[$key]; + break; + } + } + + return $result; + } + else { + return array_key_exists($key, $this->data) ? $this->data[$key] : ''; + } + } + + /** + * + */ + public function getLongest() { + $result = ''; + + if (func_num_args() > 0) { + foreach (func_get_args() as $key) { + if (array_key_exists($key, $this->data) && (strlen($result) < strlen($this->data[$key]))) { + $result = $this->data[$key]; + } + } + } + else { + foreach ($this->data as $value) { + if (strlen($result) < strlen($value)) { + $result = $value; + } + } + } + + return $result; + } + + /** + * + */ + public function isPositive($key) + { + static $lookup = array('y', 'yes', 'on', 'true', '1'); + + return in_array(strtolower($this->get($key)), $lookup); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +class refnotes_basic_renderer extends refnotes_renderer_base { + + protected $renderedNoteId = array(); + + /** + * + */ + public function getReferenceSharedDataSet() { + return array(); + } + + /** + * + */ + public function getReferencePrivateDataSet() { + return array(); + } + + /** + * + */ + public function renderReference($mode, $reference) { + if ($reference->isInline()) { + $doc = $this->renderInlineReference($reference); + } + else { + $doc = $this->renderRegularReference($mode, $reference); + } + + return $doc; + } + + /** + * + */ + public function renderNoteText($note) { + $data = new refnotes_renderer_data($note->getData()); + + $text = $data->get('note-text', 'title'); + + if ($text == '') { + $text = $data->getLongest(); + } + + if ($url = $data->get('url')) { + $text = '[[' . $url . '|' . $text . ']]'; + } + + return $text; + } + + /** + * + */ + public function renderNote($mode, $note, $reference) { + $doc = ''; + + switch ($mode) { + case 'xhtml': + $doc = $this->renderNoteXhtml($note, $reference); + break; + + case 'odt': + $doc = $this->renderNoteOdt($note, $reference); + break; + } + + return $doc; + } + + /** + * + */ + protected function renderNoteXhtml($note, $reference) { + $html = '<div class="' . $this->renderNoteClass() . '">' . DOKU_LF; + $html .= $this->renderBackReferences($note, $reference); + $html .= '<span id="' . $note->getAnchorName() . ':text">' . DOKU_LF; + $html .= $note->getText() . DOKU_LF; + $html .= '</span></div>' . DOKU_LF; + + $this->rendered = true; + + return $html; + } + + /** + * + */ + protected function renderNoteOdt($note, $reference) { + $this->rendered = true; + + return ''; + } + + /** + * + */ + protected function getInlineReferenceStyle($reference, $name, $default) { + return ($reference->getAttribute('use-' . $name) === false) ? $default : $this->getStyle($name); + } + + /** + * + */ + protected function renderInlineReference($reference) { + $baseStyle = $this->getInlineReferenceStyle($reference, 'reference-base', 'text'); + $fontWeightStyle = $this->getInlineReferenceStyle($reference, 'reference-font-weight', 'normal'); + $fontStyle = $this->getInlineReferenceStyle($reference, 'reference-font-style', 'normal'); + $formatStyle = $this->getInlineReferenceStyle($reference, 'reference-format', 'none'); + + list($baseOpen, $baseClose) = $this->renderBase($baseStyle); + list($fontOpen, $fontClose) = $this->renderFont($fontWeightStyle, 'normal', $fontStyle); + list($formatOpen, $formatClose) = $this->renderFormat($formatStyle); + + $html = $baseOpen . $fontOpen . $formatOpen; + $html .= $reference->getNote()->getText(); + $html .= $formatClose . $fontClose . $baseClose; + + return $html; + } + + /** + * + */ + protected function renderRegularReference($mode, $reference) { + $doc = ''; + + switch ($mode) { + case 'xhtml': + $doc = $this->renderRegularReferenceXhtml($reference); + break; + + case 'odt': + $doc = $this->renderRegularReferenceOdt($reference); + break; + } + + return $doc; + } + + /** + * + */ + protected function renderRegularReferenceXhtml($reference) { + $noteName = $reference->getNote()->getAnchorName(); + $referenceName = $reference->getAnchorName(); + $class = $this->renderReferenceClass(); + + list($baseOpen, $baseClose) = $this->renderReferenceBase(); + list($fontOpen, $fontClose) = $this->renderReferenceFont(); + list($formatOpen, $formatClose) = $this->renderReferenceFormat($reference); + + $html = $baseOpen . $fontOpen; + $html .= '<a href="#' . $noteName . '" name="' . $referenceName . '" class="' . $class . '">'; + $html .= $formatOpen . $this->renderReferenceId($reference) . $formatClose; + $html .= '</a>'; + $html .= $fontClose . $baseClose; + + return $html; + } + + /** + * + */ + protected function renderRegularReferenceOdt($reference) { + $xmlOdt = ''; + $note = $reference->getNote(); + $noteId = $note->getId(); + $refId = $reference->getId(); + + // Check to see if this note has been seen before + + if (array_search($noteId, $this->renderedNoteId) === false) { + // new note, add it to the $renderedNoteId array + $this->renderedNoteId[] = $noteId; + + $xmlOdt .= '<text:note text:id="refnote' . $refId . '" text:note-class="footnote">'; + $xmlOdt .= '<text:note-citation text:label="' . $refId . '">' . $refId . '</text:note-citation>'; + $xmlOdt .= '<text:note-body>'; + $xmlOdt .= '<text:p>' . $note->getText(); + $xmlOdt .= '</text:p>'; + $xmlOdt .= '</text:note-body>'; + $xmlOdt .= '</text:note>'; + } + else { + // Seen this one before - just reference it FIXME: style isn't correct + $xmlOdt = '<text:note-ref text:note-class="footnote" text:ref-name="refnote' . $noteId . '">'; + $xmlOdt .= $refId; + $xmlOdt .= '</text:note-ref>'; + } + + return $xmlOdt; + } + + /** + * + */ + protected function renderBackReferences($note, $reference) { + $references = count($reference); + $singleReference = ($references == 1); + $nameAttribute = ' name="' . $note->getAnchorName() .'"'; + $backRefFormat = $this->getStyle('back-ref-format'); + $backRefCaret = ''; + $html = ''; + + list($formatOpen, $formatClose) = $this->renderNoteIdFormat(); + + if (($backRefFormat != 'note') && ($backRefFormat != '')) { + list($baseOpen, $baseClose) = $this->renderNoteIdBase(); + list($fontOpen, $fontClose) = $this->renderNoteIdFont(); + + $html .= $baseOpen . $fontOpen; + $html .= '<a' . $nameAttribute .' class="nolink">'; + $html .= $formatOpen . $this->renderNoteId($note) . $formatClose; + $html .= '</a>'; + $html .= $fontClose . $baseClose . DOKU_LF; + + $nameAttribute = ''; + $formatOpen = ''; + $formatClose = ''; + $backRefCaret = $this->renderBackRefCaret($singleReference); + } + + if ($backRefFormat != 'none') { + $separator = $this->renderBackRefSeparator(); + + list($baseOpen, $baseClose) = $this->renderBackRefBase(); + list($fontOpen, $fontClose) = $this->renderBackRefFont(); + + $html .= $baseOpen . $backRefCaret; + + for ($r = 0; $r < $references; $r++) { + $referenceName = $reference[$r]->getAnchorName(); + + if ($r > 0) { + $html .= $separator . DOKU_LF; + } + + $html .= $fontOpen; + $html .= '<a href="#' . $referenceName . '"' . $nameAttribute .' class="backref">'; + $html .= $formatOpen . $this->renderBackRefId($reference[$r], $r, $singleReference) . $formatClose; + $html .= '</a>'; + $html .= $fontClose; + + $nameAttribute = ''; + } + + $html .= $baseClose . DOKU_LF; + } + + return $html; + } + + /** + * + */ + protected function renderReferenceClass() { + switch ($this->getStyle('note-preview')) { + case 'tooltip': + $result = 'refnotes-ref note-tooltip'; + break; + + case 'none': + $result = 'refnotes-ref'; + break; + + default: + $result = 'refnotes-ref note-popup'; + break; + } + + return $result; + } + + /** + * + */ + protected function renderReferenceBase() { + return $this->renderBase($this->getStyle('reference-base')); + } + + /** + * + */ + protected function renderReferenceFont() { + return $this->renderFont('reference-font-weight', 'normal', 'reference-font-style'); + } + + /** + * + */ + protected function renderReferenceFormat($reference) { + $result = $this->renderFormat($this->getStyle('reference-format')); + + if ($this->getReferenceGrouping($reference)) { + switch ($reference->getAttribute('group')) { + case 'open': + $result = array($result[0], $this->renderReferenceGroupSeparator()); + break; + + case 'hold': + $result = array('', $this->renderReferenceGroupSeparator()); + break; + + case 'close': + $result = array('', $result[1]); + break; + } + } + + return $result; + } + + /** + * + */ + protected function getReferenceGrouping($reference) { + $group = $reference->getAttribute('group'); + return !empty($group) && in_array($group, array('open', 'hold', 'close')) && + in_array($this->getStyle('reference-group'), array(',', 's')); + } + + /** + * + */ + protected function renderReferenceGroupSeparator() { + $style = $this->getStyle('reference-group'); + switch ($style) { + case ',': + $result = ','; + break; + + case 's': + $result = ';'; + break; + + default: + $result = ''; + break; + } + + return $result; + } + + /** + * + */ + protected function renderReferenceId($reference) { + $idStyle = $this->getStyle('refnote-id'); + if ($idStyle == 'name') { + $html = $reference->getNote()->getName(); + } + else { + switch ($this->getStyle('multi-ref-id')) { + case 'note': + $id = $reference->getNote()->getId(); + break; + + default: + $id = $reference->getId(); + break; + } + + $html = $this->convertToStyle($id, $idStyle); + } + + return $html; + } + + /** + * + */ + protected function renderNoteClass() { + $result = 'note'; + + switch ($this->getStyle('note-font-size')) { + case 'small': + $result .= ' small'; + break; + } + + switch ($this->getStyle('note-text-align')) { + case 'left': + $result .= ' left'; + break; + + default: + $result .= ' justify'; + break; + } + + return $result; + } + + /** + * + */ + protected function renderNoteIdBase() { + return $this->renderBase($this->getStyle('note-id-base')); + } + + /** + * + */ + protected function renderNoteIdFont() { + return $this->renderFont('note-id-font-weight', 'normal', 'note-id-font-style'); + } + + /** + * + */ + protected function renderNoteIdFormat() { + $style = $this->getStyle('note-id-format'); + switch ($style) { + case '.': + $result = array('', '.'); + break; + + default: + $result = $this->renderFormat($style); + break; + } + + return $result; + } + + /** + * + */ + protected function renderNoteId($note) { + $idStyle = $this->getStyle('refnote-id'); + if ($idStyle == 'name') { + $html = $note->getName(); + } + else { + $html = $this->convertToStyle($note->getId(), $idStyle); + } + + return $html; + } + + /** + * + */ + protected function renderBackRefCaret($singleReference) { + switch ($this->getStyle('back-ref-caret')) { + case 'prefix': + $result = '^ '; + break; + + case 'merge': + $result = $singleReference ? '' : '^ '; + break; + + default: + $result = ''; + break; + } + + return $result; + } + + /** + * + */ + protected function renderBackRefBase() { + return $this->renderBase($this->getStyle('back-ref-base')); + } + + /** + * + */ + protected function renderBackRefFont() { + return $this->renderFont('back-ref-font-weight', 'bold', 'back-ref-font-style'); + } + + /** + * + */ + protected function renderBackRefSeparator() { + static $html = array('' => ',', 'none' => ''); + + $style = $this->getStyle('back-ref-separator'); + if (!array_key_exists($style, $html)) { + $style = ''; + } + + return $html[$style]; + } + + /** + * + */ + protected function renderBackRefId($reference, $index, $singleReference) { + $style = $this->getStyle('back-ref-format'); + switch ($style) { + case 'a': + $result = $this->convertToLatin($index + 1, $style); + break; + + case '1': + $result = $index + 1; + break; + + case 'caret': + $result = '^'; + break; + + case 'arrow': + $result = '↑'; + break; + + default: + $result = $this->renderReferenceId($reference); + break; + } + + if ($singleReference && ($this->getStyle('back-ref-caret') == 'merge')) { + $result = '^'; + } + + return $result; + } + + /** + * + */ + protected function renderBase($style) { + static $html = array( + '' => array('<sup>', '</sup>'), + 'text' => array('', '') + ); + + if (!array_key_exists($style, $html)) { + $style = ''; + } + + return $html[$style]; + } + + /** + * + */ + protected function renderFont($weight, $defaultWeight, $style) { + list($weightOpen, $weightClose) = $this->renderFontWeight($this->getStyle($weight), $defaultWeight); + list($styleOpen, $styleClose) = $this->renderFontStyle($this->getStyle($style)); + + return array($weightOpen . $styleOpen, $styleClose . $weightClose); + } + + /** + * + */ + protected function renderFontWeight($style, $default) { + static $html = array( + 'normal' => array('', ''), + 'bold' => array('<b>', '</b>') + ); + + if (!array_key_exists($style, $html)) { + $style = $default; + } + + return $html[$style]; + } + + /** + * + */ + protected function renderFontStyle($style) { + static $html = array( + '' => array('', ''), + 'italic' => array('<i>', '</i>') + ); + + if (!array_key_exists($style, $html)) { + $style = ''; + } + + return $html[$style]; + } + + /** + * + */ + protected function renderFormat($style) { + static $html = array( + '' => array('', ')'), + '()' => array('(', ')'), + ']' => array('', ']'), + '[]' => array('[', ']'), + 'none' => array('', '') + ); + + if (!array_key_exists($style, $html)) { + $style = ''; + } + + return $html[$style]; + } + + /** + * + */ + protected function convertToStyle($id, $style) { + switch ($style) { + case 'a': + case 'A': + $result = $this->convertToLatin($id, $style); + break; + + case 'i': + case 'I': + $result = $this->convertToRoman($id, $style); + break; + + case '*': + $result = str_repeat('*', $id); + break; + + default: + $result = $id; + break; + } + + return $result; + } + + /** + * + */ + protected function convertToLatin($number, $case) { + static $alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + + $result = ''; + + while ($number > 0) { + --$number; + $digit = $number % 26; + $result = $alpha[$digit] . $result; + $number = intval($number / 26); + } + + if ($case == 'a') { + $result = strtolower($result); + } + + return $result; + } + + /** + * + */ + protected function convertToRoman($number, $case) { + static $lookup = array( + 'M' => 1000, 'CM' => 900, 'D' => 500, 'CD' => 400, + 'C' => 100, 'XC' => 90, 'L' => 50, 'XL' => 40, + 'X' => 10, 'IX' => 9, 'V' => 5, 'IV' => 4, 'I' => 1 + ); + + $result = ''; + + foreach ($lookup as $roman => $value) { + $matches = intval($number / $value); + + if ($matches > 0) { + $result .= str_repeat($roman, $matches); + $number = $number % $value; + } + } + + if ($case == 'i') { + $result = strtolower($result); + } + + return $result; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +class refnotes_harvard_renderer extends refnotes_basic_renderer { + + /** + * Constructor + */ + public function __construct($namespace) { + parent::__construct($namespace); + } + + /** + * + */ + public function getReferenceSharedDataSet() { + static $key = array('ref-authors', 'ref-author', 'authors', 'author', 'published', 'month', 'year'); + + return $key; + } + + /** + * + */ + public function getReferencePrivateDataSet() { + static $key = array('direct', 'pages', 'page'); + + return $key; + } + + /** + * + */ + public function renderNoteText($note) { + $data = new refnotes_renderer_data($note->getData()); + + if (!$data->has('title')) { + return parent::renderNoteText($note); + } + + // authors, published. //[[url|title.]]// edition. publisher, pages, isbn. + // authors, published. chapter In //[[url|title.]]// edition. publisher, pages, isbn. + // authors, published. [[url|title.]] //journal//, volume, publisher, pages, issn. + // authors, published. [[url|title.]] //booktitle//, publisher, pages, issn. + + $title = $this->renderTitle($data); + + // authors, published. //$title// edition. publisher, pages, isbn. + // authors, published. chapter In //$title// edition. publisher, pages, isbn. + // authors, published. $title //journal//, volume, publisher, pages, issn. + // authors, published. $title //booktitle//, publisher, pages, issn. + + $authors = $this->renderAuthors($data); + + // $authors? //$title// edition. publisher, pages, isbn. + // $authors? chapter In //$title// edition. publisher, pages, isbn. + // $authors? $title //journal//, volume, publisher, pages, issn. + // $authors? $title //booktitle//, publisher, pages, issn. + + $publication = $this->renderPublication($data, $authors != ''); + + if ($data->has('journal')) { + // $authors? $title //journal//, volume, $publication? + + $subtitle = $this->renderJournal($data); + } + elseif ($data->has('booktitle')) { + // $authors? $title //booktitle//, $publication? + + $subtitle = $this->renderBookTitle($data); + } + + if (!empty($subtitle)) { + // $authors? $title $subtitle?, $publication? + + $text = $title . ' ' . $subtitle; + + // $authors? $text, $publication? + + $text .= ($publication != '') ? ',' : '.'; + } + else { + // $authors? //$title// edition. $publication? + // $authors? chapter In //$title// edition. $publication? + + $text = $this->renderBook($data, $title); + } + + // $authors? $text $publication? + + if ($authors != '') { + $text = $authors . ' ' . $text; + } + + if ($publication != '') { + $text .= ' ' . $publication; + } + + return $text; + } + + /** + * + */ + protected function renderTitle($data) { + $text = $data->get('title') . '.'; + + if ($url = $data->get('url')) { + $text = '[[' . $url . '|' . $text . ']]'; + } + + return $text; + } + + /** + * + */ + protected function renderAuthors($data) { + $text = $data->get('authors', 'author'); + + if ($text != '') { + if ($published = $this->renderPublished($data)) { + $text .= ', ' . $published; + } + + $text .= '.'; + } + + return $text; + } + + /** + * + */ + protected function renderPublished($data, $useMonth = true) { + $text = $data->get('published'); + + if ($text == '') { + if ($text = $data->get('year')) { + if ($useMonth && $month = $data->get('month')) { + $text = $month . ' ' . $text; + } + } + } + + return $text; + } + + /** + * + */ + protected function renderPublication($data, $authors) { + $part = array(); + + $address = $data->get('address'); + $publisher = $data->get('publisher'); + + if ($address && $publisher) { + $part[] = $address . ': ' . $publisher; + } + else { + if ($address || $publisher) { + $part[] = $address . $publisher; + } + } + + if (!$authors && ($published = $this->renderPublished($data))) { + $part[] = $published; + } + + if ($pages = $this->renderPages($data, array('note-pages', 'note-page', 'pages', 'page'))) { + $part[] = $pages; + } + + if ($isbn = $data->get('isbn')) { + $part[] = 'ISBN ' . $isbn; + } + elseif ($issn = $data->get('issn')) { + $part[] = 'ISSN ' . $issn; + } + + $text = implode(', ', $part); + + if ($text != '') { + $text = rtrim($text, '.') . '.'; + } + + return $text; + } + + /** + * + */ + protected function renderPages($data, $key) { + $text = ''; + + foreach ($key as $k) { + if ($text = $data->get($k)) { + if (preg_match("/^[0-9]/", $text)) { + $abbr_key = (substr($k, -1) == 's') ? 'txt_pages_abbr' : 'txt_page_abbr'; + $text = refnotes_localization::getInstance()->getLang($abbr_key) . $text; + } + break; + } + } + + return $text; + } + + /** + * + */ + protected function renderJournal($data) { + $text = '//' . $data->get('journal') . '//'; + + if ($volume = $data->get('volume')) { + $text .= ', ' . $volume; + } + + return $text; + } + + /** + * + */ + protected function renderBook($data, $title) { + $text = '//' . $title . '//'; + + if ($chapter = $data->get('chapter')) { + $text = $chapter . '. ' . refnotes_localization::getInstance()->getLang('txt_in_cap') . ' ' . $text; + } + + if ($edition = $data->get('edition')) { + $text .= ' ' . $edition . '.'; + } + + return $text; + } + + /** + * + */ + protected function renderBookTitle($data) { + return '//' . $data->get('booktitle') . '//'; + } + + /** + * + */ + protected function renderReferenceId($reference) { + $data = new refnotes_renderer_data($reference->getData()); + + if (!$this->checkReferenceData($data)) { + return $this->renderBasicReferenceId($reference); + } + + $authors = $data->get('ref-authors', 'ref-author', 'authors', 'author'); + $html = $this->renderReferenceExtra($data); + + list($formatOpen, $formatClose) = $this->renderReferenceParentheses(); + + if ($data->isPositive('direct')) { + $html = $authors . ' ' . $formatOpen . $html . $formatClose; + + if ($this->getReferenceGrouping($reference)) { + switch ($reference->getAttribute('group')) { + case 'open': + case 'hold': + $html .= $this->renderReferenceGroupSeparator(); + break; + } + } + } + else { + if ($this->getReferenceGrouping($reference)) { + switch ($reference->getAttribute('group')) { + case 'open': + $formatClose = $this->renderReferenceGroupSeparator(); + break; + + case 'hold': + $formatOpen = ''; + $formatClose = $this->renderReferenceGroupSeparator(); + break; + + case 'close': + $formatOpen = ''; + break; + } + } + + $html = $formatOpen . $authors . ', ' . $html . $formatClose; + } + + return htmlspecialchars($html); + } + + /** + * + */ + protected function renderBasicReferenceId($reference) { + list($formatOpen, $formatClose) = parent::renderReferenceFormat($reference); + + return $formatOpen . parent::renderReferenceId($reference) . $formatClose; + } + + /** + * + */ + protected function renderReferenceExtra($data) { + $html = ''; + + if ($published = $this->renderPublished($data, false)) { + $html .= $published; + } + + if ($pages = $this->renderPages($data, array('page', 'pages'))) { + if ($html != '') { + $html .= ', '; + } + + $html .= $pages; + } + + return $html; + } + + /** + * + */ + protected function renderReferenceParentheses() { + $style = $this->getStyle('reference-format'); + $style = (($style == '[]') || ($style == ']')) ? '[]' : '()'; + + return $this->renderFormat($style); + } + + /** + * + */ + protected function renderReferenceFormat($reference) { + return array('', ''); + } + + /** + * + */ + protected function checkReferenceData($data) { + $authors = $data->has('ref-authors', 'ref-author', 'authors', 'author'); + $year = $data->has('published', 'year'); + $page = $data->has('page', 'pages'); + + return $authors && ($year || $page); + } +} |