/** * @covers PhCompile\Template\Directive\NgClass::compile * @dataProvider compileExceptionProvider * @expectedException PhCompile\Template\Expression\InvalidExpressionException */ public function testCompileException($scopeData, $classString) { $this->scope->setData($scopeData); $document = Utils::loadHTML('<span ng-class="' . $classString . '"></span>'); $element = $document->getElementsByTagName('span')->item(0); $this->ngClass->compile($element, $this->scope); }
/** * @covers PhCompile\Template\Directive\NgValue::compile * @dataProvider compileProvider */ public function testCompile($scopeData, $bindString, $expected) { $this->scope->setData($scopeData); $document = Utils::loadHTML('<span ng-value="' . $bindString . '"></span>'); $element = $document->getElementsByTagName('span')->item(0); $compiledHtml = Utils::saveHTML($this->ngValue->compile($element, $this->scope)->ownerDocument); $expectedHtml = '<span ng-value="' . $bindString . '" value="' . $expected . '"></span>'; $this->assertSame($expectedHtml, $compiledHtml); }
/** * @covers PhCompile\Template\Directive\NgHide::compile * @dataProvider compileProvider */ public function testCompile($scopeData, $expression, $expectedClass) { $this->scope->setData($scopeData); $document = Utils::loadHTML('<span ng-hide="' . $expression . '" class=""></span>'); $element = $document->getElementsByTagName('span')->item(0); $this->ngHide->compile($element, $this->scope); $renderedHtml = Utils::saveHTML($element->ownerDocument); $expectedHtml = '<span ng-hide="' . $expression . '" class="' . $expectedClass . '"></span>'; $this->assertSame($expectedHtml, $renderedHtml); }
/** * Renders AngularJS ng-show and ng-hide attributes by evaluating expression * inside them and setting "ng-hide" class if needed. * * @param \DOMElement $domElement DOM element to render. * @param Scope $scope Scope object containing data for expression. * @return \DOMElement Compiled DOM element. */ public function compile(\DOMElement $domElement, Scope $scope) { $expressionString = $domElement->getAttribute('ng-show'); /** * Get attribute expression's value. */ $expression = new Expression($this->phCompile); $expressionValue = (bool) $expression->compile($expressionString, $scope); /** * Set appropriate class to DOM element if needed. */ if ($expressionValue === false) { Utils::addClass($domElement, 'ng-hide'); } return $domElement; }
/** * Compiles AngularJS ng-class attributes by evaluating expression inside it * and setting element's class attribute. * * @param \DOMElement $element DOM element to compile. * @param Scope $scope Scope object containing data for expression. * @return \DOMElement Compiled DOM element. */ public function compile(\DOMElement $element, Scope $scope) { $classAttr = $element->getAttribute('ng-class'); $classArray = $this->parseClass($classAttr); if (isset($classArray['object']) && $classArray['object'] !== '') { $classString = $this->compileObject($classAttr, $scope); } elseif (isset($classArray['array']) && $classArray['array'] !== '') { $classString = $this->compileArray($classAttr, $scope); } else { $classString = $this->compileString($classAttr, $scope); } if (empty($classString) === false && is_string($classString) === false) { throw new InvalidExpressionException(sprintf('Expression: "%s" inside ng-class does not evaluate to string!', $classAttr)); } Utils::addClass($element, $classString); return $element; }
/** * Compiles AngularJS ng-bind-template attributes by evaluating expression inside it * and setting inner HTML. * * @param \DOMElement $domElement DOM element to compile. * @param Scope $scope Scope object containing data for expression. * @return \DOMElement Compiled DOM element. */ public function compile(\DOMElement $domElement, Scope $scope) { $attrValue = $domElement->getAttribute('ng-bind-template'); $foundExpressions = array(); $expression = new Expression($this->phCompile); /** * Find all {{}} expressions. */ preg_match_all('/{{([^}]+)}}/', $attrValue, $foundExpressions); foreach ($foundExpressions[1] as $foundExpression) { /** * Render and cover with span for easy client-site reverting. */ $renderedExpression = $expression->compile($foundExpression, $scope); /** * Replace {{}} expression with rendered value. */ $attrValue = str_replace('{{' . $foundExpression . '}}', $renderedExpression, $attrValue); } if (empty($attrValue) === false) { Utils::appendHTML($domElement, $attrValue); } return $domElement; }
/** * Compiles given DOM element with directive restricted to classes. * * @param \DOMElement $element DOM element to compile. * @param Directive $directive Directive with classes restriction('C'). * @return boolean Returns false if compilation should stop, true otherwise. */ protected function compileClass(\DOMElement $element, Directive $directive) { $directiveName = $directive->getName(); if (Utils::hasClass($element, $directiveName) === true) { $directive->compile($element, $this->getScope()); } return $directive->doesInterrupt(); }
/** * Renders given DOM element as subtemplate. * * @param \DOMElement $domElement DOM element to subrender. * @param Scope $scope Subtemplate Scope object. * @return string Rendered HTML. */ protected function subcompile(\DOMElement $domElement, $scope) { $template = new Template($this->phCompile); /** * Remove ng-repeat attribute so we won't fall into infinite loop while parsing. */ $domElement->removeAttribute('ng-repeat'); /** * Tag element with render class, for easy client-side JavaScript manipulation. */ Utils::addClass($domElement, $this->phCompile->getConfig('compile.class')); $template->setHTML($domElement->ownerDocument->saveHTML($domElement)); $template->setScope($scope); return $template->compile(); }
/** * @covers PhCompile\DOM\Utils::appendHTML * @dataProvider appendHtmlProvider */ public function testAppendHTML($html, $appendHtml, $expectedHtml) { $document = Utils::loadHTML($html); $element = $document->getElementsByTagName('span')->item(0); Utils::appendHTML($element, $appendHtml); $renderedHtml = Utils::saveHTML($document); $this->assertSame($expectedHtml, $renderedHtml); }
/** * @covers PhCompile\Template\Directive\NgRepeat::compile * @dataProvider repeatSpectialPropertiesProvider */ public function testRepeatSpecialProperties($expression, $expectedArray) { $this->scope->setData(array('bar' => array(1, 2, 3, 4, 5, 6))); $document = Utils::loadHTML('<span ng-repeat="n in bar">{{' . $expression . '}}</span>'); $element = $document->getElementsByTagName('span')->item(0); $renderClass = $this->phCompile->getConfig('compile.class'); $renderAttr = $this->phCompile->getConfig('compile.attr'); $this->ngRepeat->compile($element, $this->scope); $compiledHtml = Utils::saveHTML($document); $expectedHtml = '<span ng-repeat="n in bar" class="ng-hide">{{' . $expression . '}}</span>'; for ($i = 0; $i < 6; $i++) { $expectedHtml .= '<span class="' . $renderClass . '"><span ' . $renderAttr . '="' . $expression . '">' . $expectedArray[$i] . '</span></span>'; } $this->assertSame($expectedHtml, $compiledHtml); }