You are here

class csl_names in Bibliography Module 7.2

Same name and namespace in other branches
  1. 6.2 modules/CiteProc/CSL.inc \csl_names
  2. 7 modules/CiteProc/CSL.inc \csl_names

Hierarchy

Expanded class hierarchy of csl_names

File

modules/CiteProc/CSL.inc, line 759

View source
class csl_names extends csl_format {
  private $substitutes;
  function init_formatting() {
    $this->span_class = 'biblio-authors';
    parent::init_formatting();
  }
  function init($dom_node, $citeproc) {
    $etal = '';
    $tag = $dom_node
      ->getElementsByTagName('substitute')
      ->item(0);
    if ($tag) {
      $this->substitutes = csl_factory::create($tag, $citeproc);
      $dom_node
        ->removeChild($tag);
    }
    $tag = $dom_node
      ->getElementsByTagName('et-al')
      ->item(0);
    if ($tag) {
      $etal = csl_factory::create($tag, $citeproc);
      $dom_node
        ->removeChild($tag);
    }
    $var = $dom_node
      ->getAttribute('variable');
    foreach ($dom_node->childNodes as $node) {
      if ($node->nodeType == 1) {
        $element = csl_factory::create($node, $citeproc);
        if ($element instanceof csl_label) {
          $element->variable = $var;
        }
        if ($element instanceof csl_name && $etal) {
          $element->etal = $etal;
        }
        $this
          ->add_element($element);
      }
    }
  }
  function render($data, $mode = NULL) {
    $matches = 0;
    $variable_parts = array();
    if (!isset($this->delimiter)) {
      $style_delimiter = $this->citeproc->style->{'names-delimiter'};
      $mode_delimiter = $this->citeproc->{$mode}->{'names-delimiter'};
      $this->delimiter = isset($mode_delimiter) ? $mode_delimiter : (isset($style_delimiter) ? $style_delimiter : '');
    }
    $variables = explode(' ', $this->variable);
    foreach ($variables as $var) {
      list($contributor, $category) = explode(':', $var);
      if (!empty($contributor) && $this
        ->_get_category($data->{$contributor}, $category)) {
        $matches++;
        break;
      }
    }
    if (!$matches) {

      // we don't have any primary suspects, so lets check the substitutes...
      if (isset($this->substitutes)) {
        foreach ($this->substitutes->elements as $element) {
          if ($element instanceof csl_names) {

            //test to see if any of the other names variables has content
            $variables = explode(' ', $element->variable);
            foreach ($variables as $var) {
              list($contributor, $category) = explode(':', $var);
              if (!empty($contributor) && $this
                ->_get_category($data->{$contributor}, $category)) {
                $matches++;
                break;
              }
            }
          }
          else {

            // if it's not a "names" element, just render it
            return $element
              ->render($data, $mode);
          }
        }
      }
    }
    foreach ($variables as $var) {
      $text = '';
      list($contributor, $category) = explode(':', $var);
      if (!empty($contributor) && ($authors = $this
        ->_get_category($data->{$contributor}, $category))) {
        foreach ($this->elements as $element) {
          if (is_a($element, 'csl_label')) {
            $data->{$var}['variable'] = $var;
          }
          $text .= $element
            ->render($authors, $mode);
        }
      }
      if (!empty($text)) {
        $variable_parts[] = $text;
      }
    }
    if (!empty($variable_parts)) {
      $text = implode($this->delimiter, $variable_parts);
      return $this
        ->format($text);
    }
    return;
  }
  private function _get_category($contributors, $category) {
    $authors = array();
    foreach ($contributors as $author) {
      if ($author['auth_category'] == $category) {
        $authors[] = $author;
      }
    }
    return count($authors) ? $authors : FALSE;
  }

}

Members