예제 #1
0
 /**
  * @param Lexer $lexer
  * @param DOMNode $currentElement
  * @return string[]
  */
 public function replace(Lexer $lexer, DOMNode $currentElement)
 {
     $xslForEach = $currentElement->parentNode;
     if ($xslForEach instanceof DOMElement) {
         while ($this->isForEachGroupElement($xslForEach) === false && $currentElement->ownerDocument !== $xslForEach) {
             $xslForEach = $xslForEach->parentNode;
         }
     }
     if ($this->isForEachGroupElement($xslForEach) === false) {
         throw new \RuntimeException('Feature not implemented. "At other times, it will be an empty sequence."');
     }
     $groupId = $xslForEach->getAttribute('group-id');
     $resultTokens = [];
     $resultTokens[] = '$current-un-grouped-' . $groupId;
     $resultTokens[] = '[';
     $resultTokens[] = 'generate-id';
     $resultTokens[] = '(';
     $resultTokens[] = '.';
     $resultTokens[] = ')';
     $resultTokens[] = '=';
     $resultTokens[] = '$current-group-' . $groupId;
     $resultTokens[] = '//';
     $resultTokens[] = 'xsl:element-id';
     $resultTokens[] = ']';
     $lexer->seek($lexer->key() + 2);
     return $resultTokens;
 }
예제 #2
0
 public function testDirectionDownOtherSeekPosition()
 {
     $lexer = new Lexer(['/', '/', '*']);
     $lexer->seek(1);
     $iterator = new MatchingIterator($lexer, '/\\//', MatchingIterator::DIRECTION_DOWN);
     $this->assertEquals(2, iterator_count($iterator));
 }
예제 #3
0
 /**
  * @param Lexer $lexer
  * @param DOMNode $currentElement
  * @return array|\string[]
  */
 public function replace(Lexer $lexer, DOMNode $currentElement)
 {
     if ($this->camelize === true) {
         $methodName = $this->convertToCamel($this->callback[1]);
     } else {
         $methodName = $this->callback[1];
     }
     $resultTokens = [];
     $resultTokens[] = 'php:function';
     $resultTokens[] = '(';
     $resultTokens[] = '\'';
     $resultTokens[] = PhpCallback::class . '::callStatic';
     $resultTokens[] = '\'';
     $resultTokens[] = ',';
     $resultTokens[] = '\'';
     $resultTokens[] = $this->callback[0];
     $resultTokens[] = '\'';
     $resultTokens[] = ',';
     $resultTokens[] = '\'';
     $resultTokens[] = $methodName;
     $resultTokens[] = '\'';
     $lexer->next();
     if ($lexer->peek($lexer->key() + 1) !== ')') {
         $resultTokens[] = ',';
     }
     return $resultTokens;
 }
예제 #4
0
파일: CurrentGroup.php 프로젝트: genkgo/xsl
 /**
  * @param Lexer $lexer
  * @param DOMNode $currentElement
  * @return string[]
  */
 public function replace(Lexer $lexer, DOMNode $currentElement)
 {
     $xslForEach = $currentElement->parentNode;
     if ($xslForEach instanceof DOMNode) {
         while ($this->isForEachGroupElement($xslForEach) === false && $currentElement->ownerDocument !== $xslForEach) {
             $xslForEach = $xslForEach->parentNode;
         }
     }
     if ($this->isForEachGroupElement($xslForEach) === false) {
         $lexer->seek($lexer->key() + 2);
         return ['/', 'xs:sequence', '/', '*'];
     }
     /** @var DOMElement $xslForEach */
     $groupId = $xslForEach->getAttribute('group-id');
     $resultTokens = [];
     $resultTokens[] = '$current-un-grouped-' . $groupId;
     $resultTokens[] = '[';
     $resultTokens[] = 'generate-id';
     $resultTokens[] = '(';
     $resultTokens[] = '.';
     $resultTokens[] = ')';
     $resultTokens[] = '=';
     $resultTokens[] = '$current-group-' . $groupId;
     $resultTokens[] = '//';
     $resultTokens[] = 'xsl:element-id';
     $resultTokens[] = ']';
     $lexer->seek($lexer->key() + 2);
     return $resultTokens;
 }
예제 #5
0
 /**
  * @param Lexer $lexer
  * @param DOMNode $currentElement
  * @return string[]
  */
 private function createFunctionTokens(Lexer $lexer, DOMNode $currentElement)
 {
     $token = $lexer->current();
     $documentElement = $currentElement->ownerDocument->documentElement;
     $namespaces = FetchNamespacesFromNode::fetch($documentElement);
     $functionName = $this->convertTokenToFunctionName($token, $namespaces);
     if ($this->functions->has($functionName)) {
         $function = $this->functions->get($functionName);
         if ($function instanceof ReplaceFunctionInterface) {
             return $function->replace($lexer, $currentElement);
         }
     }
     return [$token];
 }
예제 #6
0
 /**
  * @param Lexer $lexer
  * @param DOMNode $currentElement
  * @return array|\string[]
  */
 public function replace(Lexer $lexer, DOMNode $currentElement)
 {
     $resultTokens = [];
     $resultTokens[] = 'php:function';
     $resultTokens[] = '(';
     $resultTokens[] = '\'';
     $resultTokens[] = PhpCallback::class . '::callStatic';
     $resultTokens[] = '\'';
     $resultTokens[] = ',';
     $resultTokens[] = '\'';
     $resultTokens[] = static::class;
     $resultTokens[] = '\'';
     $resultTokens[] = ',';
     $resultTokens[] = '\'';
     $resultTokens[] = 'call';
     $resultTokens[] = '\'';
     $resultTokens[] = ',';
     $resultTokens[] = $lexer->peek($lexer->key() - 2);
     $resultTokens[] = ',';
     $resultTokens[] = $lexer->peek($lexer->key() + 2);
     $resultTokens[] = ')';
     $resultTokens[] = '/';
     $resultTokens[] = 'xs:sequence';
     $resultTokens[] = '/';
     $resultTokens[] = '*';
     $lexer->seek($lexer->key() + 2);
     return $resultTokens;
 }
예제 #7
0
 /**
  * @param Lexer $lexer
  * @param DOMNode $currentElement
  * @return array|\string[]
  */
 public function replace(Lexer $lexer, DOMNode $currentElement)
 {
     $resultTokens = [];
     $resultTokens[] = 'php:function';
     $resultTokens[] = '(';
     $resultTokens[] = '\'';
     $resultTokens[] = PhpCallback::class . '::call';
     $resultTokens[] = '\'';
     $resultTokens[] = ',';
     $resultTokens[] = '\'';
     $resultTokens[] = $this->name;
     $resultTokens[] = '\'';
     $lexer->next();
     if ($lexer->peek($lexer->key() + 1) !== ')') {
         $resultTokens[] = ',';
     }
     return $resultTokens;
 }
예제 #8
0
 /**
  * @param Lexer $lexer
  * @return bool
  */
 public function supports(Lexer $lexer)
 {
     if ($lexer->current() !== '(') {
         return false;
     }
     if ($lexer->key() > 0) {
         $whiteSpaceOrOpeningParenthesis = new MatchingIterator($lexer, '/\\s|\\(/', MatchingIterator::DIRECTION_DOWN);
         for ($i = 0, $j = 2; $i < $j; $i++) {
             if ($whiteSpaceOrOpeningParenthesis->valid() === false) {
                 return false;
             }
             if ($whiteSpaceOrOpeningParenthesis->key() < $lexer->key() - $i) {
                 return false;
             }
             $whiteSpaceOrOpeningParenthesis->next();
         }
     }
     $key = $lexer->key() + 1;
     $commaFound = false;
     while ($nextToken = $lexer->peek($key)) {
         if ($nextToken === '(') {
             return false;
         }
         if ($nextToken === ',') {
             $commaFound = true;
         }
         if ($nextToken === ')') {
             return $commaFound;
         }
         $key++;
     }
     return false;
 }
예제 #9
0
파일: Compiler.php 프로젝트: genkgo/xsl
 /**
  * @param $xpathExpression
  * @param DOMNode $currentElement
  * @return string
  */
 public function compile($xpathExpression, DOMNode $currentElement)
 {
     $resultTokens = [];
     $lexer = Lexer::tokenize($xpathExpression);
     foreach ($lexer as $token) {
         foreach ($this->expressions as $expression) {
             if ($expression->supports($lexer)) {
                 $resultTokens = $expression->merge($lexer, $currentElement, $resultTokens);
                 continue 2;
             }
         }
         $resultTokens[] = $token;
     }
     return trim(implode('', $resultTokens));
 }
예제 #10
0
 /**
  *
  */
 private function start()
 {
     $this->position = $this->lexer->key() + $this->direction * -1;
     $this->next();
 }
예제 #11
0
 /**
  * @param Lexer $lexer
  * @return bool
  */
 public function supports(Lexer $lexer)
 {
     return $lexer->current() === 'to' && preg_match('/\\s/', $lexer->peek($lexer->key() - 1)) === 1;
 }