original_string: protected function matchExtendsSingle($rawSingle, &$outOrigin)
      {
          $counts = [];
          $single = [];
  
          foreach ($rawSingle as $part) {
              // matches Number
              if (! is_string($part)) {
                  return false;
              }
  
              if (! preg_match('/^[\[.:#%]/', $part) && count($single)) {
                  $single[count($single) - 1] .= $part;
              } else {
                  $single[] = $part;
              }
          }
  
          $extendingDecoratedTag = false;
  
          if (count($single) > 1) {
              $matches = null;
              $extendingDecoratedTag = preg_match('/^[a-z0-9]+$/i', $single[0], $matches) ? $matches[0] : false;
          }
  
          foreach ($single as $part) {
              if (isset($this->extendsMap[$part])) {
                  foreach ($this->extendsMap[$part] as $idx) {
                      $counts[$idx] = isset($counts[$idx]) ? $counts[$idx] + 1 : 1;
                  }
              }
          }
  
          $outOrigin = [];
          $found = false;
  
          foreach ($counts as $idx => $count) {
              list($target, $origin, /* $block */) = $this->extends[$idx];
  
              // check count
              if ($count !== count($target)) {
                  continue;
              }
  
              $this->extends[$idx][3] = true;
  
              $rem = array_diff($single, $target);
  
              foreach ($origin as $j => $new) {
                  // prevent infinite loop when target extends itself
                  if ($this->isSelfExtend($single, $origin)) {
                      return false;
                  }
  
                  $replacement = end($new);
  
                  // Extending a decorated tag with another tag is not possible.
                  if ($extendingDecoratedTag && $replacement[0] != $extendingDecoratedTag &&
                      preg_match('/^[a-z0-9]+$/i', $replacement[0])
                  ) {
                      unset($origin[$j]);
                      continue;
                  }
  
                  $combined = $this->combineSelectorSingle($replacement, $rem);
  
                  if (count(array_diff($combined, $origin[$j][count($origin[$j]) - 1]))) {
                      $origin[$j][count($origin[$j]) - 1] = $combined;
                  }
              }
  
              $outOrigin = array_merge($outOrigin, $origin);
  
              $found = true;
          }
  
          return $found;
      }
code: protected function matchExtendsSingle($rawSingle, &$outOrigin)
      {
          $counts = [];
          $single = [];
  
          foreach ($rawSingle as $part) {
              // matches Number
              if (! is_string($part)) {
                  return false;
              }
  
              if (! preg_match('/^[\[.:#%]/', $part) && count($single)) {
                  $single[count($single) - 1] .= $part;
              } else {
                  $single[] = $part;
              }
          }
  
          $extendingDecoratedTag = false;
  
          if (count($single) > 1) {
              $matches = null;
              $extendingDecoratedTag = preg_match('/^[a-z0-9]+$/i', $single[0], $matches) ? $matches[0] : false;
          }
  
          foreach ($single as $part) {
              if (isset($this->extendsMap[$part])) {
                  foreach ($this->extendsMap[$part] as $idx) {
                      $counts[$idx] = isset($counts[$idx]) ? $counts[$idx] + 1 : 1;
                  }
              }
          }
  
          $outOrigin = [];
          $found = false;
  
          foreach ($counts as $idx => $count) {
              list($target, $origin, /* $block */) = $this->extends[$idx];
  
              // check count
              if ($count !== count($target)) {
                  continue;
              }
  
              $this->extends[$idx][3] = true;
  
              $rem = array_diff($single, $target);
  
              foreach ($origin as $j => $new) {
                  // prevent infinite loop when target extends itself
                  if ($this->isSelfExtend($single, $origin)) {
                      return false;
                  }
  
                  $replacement = end($new);
  
                  // Extending a decorated tag with another tag is not possible.
                  if ($extendingDecoratedTag && $replacement[0] != $extendingDecoratedTag &&
                      preg_match('/^[a-z0-9]+$/i', $replacement[0])
                  ) {
                      unset($origin[$j]);
                      continue;
                  }
  
                  $combined = $this->combineSelectorSingle($replacement, $rem);
  
                  if (count(array_diff($combined, $origin[$j][count($origin[$j]) - 1]))) {
                      $origin[$j][count($origin[$j]) - 1] = $combined;
                  }
              }
  
              $outOrigin = array_merge($outOrigin, $origin);
  
              $found = true;
          }
  
          return $found;
      }
code_tokens: protected function matchExtendsSingle ( $ rawSingle , & $ outOrigin ) { $ counts = [ ] ; $ single = [ ] ; foreach ( $ rawSingle as $ part ) { // matches Number if ( ! is_string ( $ part ) ) { return false ; } if ( ! preg_match ( '/^[\[.:#%]/' , $ part ) && count ( $ single ) ) { $ single [ count ( $ single ) - 1 ] .= $ part ; } else { $ single [ ] = $ part ; } } $ extendingDecoratedTag = false ; if ( count ( $ single ) > 1 ) { $ matches = null ; $ extendingDecoratedTag = preg_match ( '/^[a-z0-9]+$/i' , $ single [ 0 ] , $ matches ) ? $ matches [ 0 ] : false ; } foreach ( $ single as $ part ) { if ( isset ( $ this -> extendsMap [ $ part ] ) ) { foreach ( $ this -> extendsMap [ $ part ] as $ idx ) { $ counts [ $ idx ] = isset ( $ counts [ $ idx ] ) ? $ counts [ $ idx ] + 1 : 1 ; } } } $ outOrigin = [ ] ; $ found = false ; foreach ( $ counts as $ idx => $ count ) { list ( $ target , $ origin , /* $block */ ) = $ this -> extends [ $ idx ] ; // check count if ( $ count !== count ( $ target ) ) { continue ; } $ this -> extends [ $ idx ] [ 3 ] = true ; $ rem = array_diff ( $ single , $ target ) ; foreach ( $ origin as $ j => $ new ) { // prevent infinite loop when target extends itself if ( $ this -> isSelfExtend ( $ single , $ origin ) ) { return false ; } $ replacement = end ( $ new ) ; // Extending a decorated tag with another tag is not possible. if ( $ extendingDecoratedTag && $ replacement [ 0 ] != $ extendingDecoratedTag && preg_match ( '/^[a-z0-9]+$/i' , $ replacement [ 0 ] ) ) { unset ( $ origin [ $ j ] ) ; continue ; } $ combined = $ this -> combineSelectorSingle ( $ replacement , $ rem ) ; if ( count ( array_diff ( $ combined , $ origin [ $ j ] [ count ( $ origin [ $ j ] ) - 1 ] ) ) ) { $ origin [ $ j ] [ count ( $ origin [ $ j ] ) - 1 ] = $ combined ; } } $ outOrigin = array_merge ( $ outOrigin , $ origin ) ; $ found = true ; } return $ found ; }
docstring: Match extends single
  
  @param array $rawSingle
  @param array $outOrigin
  
  @return boolean
docstring_tokens: Match extends single