protected function traverseNode(Node $node) { foreach ($node->getSubNodeNames() as $name) { $subNode =& $node->{$name}; if (is_array($subNode)) { $subNode = $this->traverseArray($subNode); } elseif ($subNode instanceof Node) { $traverseChildren = true; foreach ($this->visitors as $visitor) { $return = $visitor->enterNode($subNode); if (self::DONT_TRAVERSE_CHILDREN === $return) { $traverseChildren = false; } else { if (null !== $return) { $subNode = $return; } } } if ($traverseChildren) { $subNode = $this->traverseNode($subNode); } foreach ($this->visitors as $visitor) { if (null !== ($return = $visitor->leaveNode($subNode))) { if (is_array($return)) { throw new \LogicException('leaveNode() may only return an array ' . 'if the parent structure is an array'); } $subNode = $return; } } } } return $node; }
/** * @dataProvider provideNodes */ public function testConstruct(array $attributes, Node $node) { $this->assertSame('Dummy', $node->getType()); $this->assertSame(array('subNode1', 'subNode2'), $node->getSubNodeNames()); $this->assertSame(10, $node->getLine()); $this->assertSame('/** doc comment */', $node->getDocComment()->getText()); $this->assertSame('value1', $node->subNode1); $this->assertSame('value2', $node->subNode2); $this->assertTrue(isset($node->subNode1)); $this->assertTrue(isset($node->subNode2)); $this->assertFalse(isset($node->subNode3)); $this->assertSame($attributes, $node->getAttributes()); return $node; }
/** * Dumps a node or array. * * @param array|Node $node Node or array to dump * * @return string Dumped value */ public function dump($node) { if ($node instanceof Node) { $r = $node->getType() . '('; foreach ($node->getSubNodeNames() as $key) { $r .= "\n " . $key . ': '; $value = $node->{$key}; if (null === $value) { $r .= 'null'; } elseif (false === $value) { $r .= 'false'; } elseif (true === $value) { $r .= 'true'; } elseif (is_scalar($value)) { $r .= $value; } else { $r .= str_replace("\n", "\n ", $this->dump($value)); } } if ($this->dumpComments && ($comments = $node->getAttribute('comments'))) { $r .= "\n comments: " . str_replace("\n", "\n ", $this->dump($comments)); } } elseif (is_array($node)) { $r = 'array('; foreach ($node as $key => $value) { $r .= "\n " . $key . ': '; if (null === $value) { $r .= 'null'; } elseif (false === $value) { $r .= 'false'; } elseif (true === $value) { $r .= 'true'; } elseif (is_scalar($value)) { $r .= $value; } else { $r .= str_replace("\n", "\n ", $this->dump($value)); } } } elseif ($node instanceof Comment) { return $node->getReformattedText(); } else { throw new \InvalidArgumentException('Can only dump nodes and arrays.'); } return $r . "\n)"; }
/** * Dumps a node or array. * * @param array|Node $node Node or array to dump * * @return string Dumped value */ public function dump($node) { if ($node instanceof Node) { $r = "\n{\n \"title\"" . ":" . " \"" . $node->getType() . "\"," . "\n" . " \"value\": {\n"; foreach ($node->getSubNodeNames() as $key) { $value = $node->{$key}; if (null === $value) { $r .= " \"" . $key . "\"" . ":" . "null,"; } elseif (false === $value) { $r .= " \"" . $key . "\"" . ":" . "false," . ""; } elseif (true === $value) { $r .= 'true'; } elseif (is_scalar($value)) { $r .= " \"{$key}\"" . ":" . "\"{$value}\"" . ","; } else { $r .= " \n\"{$key}\": " . str_replace("\n", "\n ", $this->dump($value)) . ","; } } $r = rtrim($r, ","); $r .= "\n }\n}"; } elseif (is_array($node)) { $r = " ["; foreach ($node as $key => $value) { if (null === $value) { $r .= 'null'; } elseif (false === $value) { $r .= 'false'; } elseif (true === $value) { $r .= 'true'; } elseif (is_scalar($value)) { $r .= "\n\"" . $value . "\"\n"; } else { $r .= str_replace("\n", "\n ", $this->dump($value)) . ","; } } $r = rtrim($r, ","); $r .= "\n ]"; } else { throw new \InvalidArgumentException('Can only dump nodes and arrays.'); } return $r . "\n"; }