You are here

class csl_names in Bibliography Module 6.2

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

Hierarchy

Expanded class hierarchy of csl_names

File

modules/CiteProc/CSL.inc, line 794

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 = array();
    $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) {
      if (in_array($var, $this->citeproc->quash)) {
        continue;
      }
      list($contributor, $type) = explode(':', $var);
      if (!empty($type) && isset($data->{$contributor}[$type]) && !empty($data->{$contributor}[$type])) {
        $matches[] = $var;
      }
    }
    if (empty($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
            $sub_variables = explode(' ', $element->variable);
            foreach ($sub_variables as $var) {
              list($contributor, $type) = explode(':', $var);
              if (!empty($type) && isset($data->{$contributor}[$type]) && !empty($data->{$contributor}[$type])) {
                $matches[] = $var;
                $this->citeproc->quash[] = $var;
              }
            }
          }
          else {

            // if it's not a "names" element, just render it
            $text = $element
              ->render($data, $mode);
            $this->citeproc->quash[] = isset($element->variable) ? $element->variable : $element->var;
            if (!empty($text)) {
              $variable_parts[] = $text;
            }
          }
          if (!empty($matches)) {
            break;
          }
        }
      }
    }
    foreach ($matches as $var) {
      if (in_array($var, $this->citeproc->quash) && in_array($var, $variables)) {
        continue;
      }
      $text = '';
      list($contributor, $type) = explode(':', $var);
      if (!empty($type) && isset($data->{$contributor}[$type]) && !empty($data->{$contributor}[$type])) {
        foreach ($this->elements as $element) {
          if (is_a($element, 'csl_label')) {
            $element->variable = $this
              ->_get_csl_name_variable($type);
            $text .= $element
              ->render($data->{$contributor}[$type], $mode);
          }
          elseif (is_a($element, 'csl_name')) {
            $text .= $element
              ->render($data->{$contributor}[$type], $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_csl_name_variable($category) {
    switch ($category) {
      case 1:
        return 'author';
        break;
      case 2:
        return 'editor';
        break;
      case 3:
        return 'translator';
        break;
      default:
    }
  }

}

Members