/** * @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; }
/** * @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; }
public function testDirectionDownOtherSeekPosition() { $lexer = new Lexer(['/', '/', '*']); $lexer->seek(1); $iterator = new MatchingIterator($lexer, '/\\//', MatchingIterator::DIRECTION_DOWN); $this->assertEquals(2, iterator_count($iterator)); }
/** * @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; }