/** * @covers PhCompile\DOM\Utils::hasClass * @depends testAddClass */ public function testHasClass() { $document = Utils::loadHTML('<span></span>'); $element = $document->getElementsByTagName('span')->item(0); $this->assertFalse(Utils::hasClass($element, 'foo')); Utils::addClass($element, 'foo'); $this->assertTrue(Utils::hasClass($element, 'foo')); }
/** * 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; }
/** * 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(); }