示例#1
0
 /**
  * @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);
 }
示例#2
0
 /**
  * @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);
 }
示例#3
0
 /**
  * @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);
 }
示例#4
0
 /**
  * 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;
 }
示例#5
0
 /**
  * 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;
 }
示例#6
0
 /**
  * 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;
 }
示例#7
0
 /**
  * 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();
 }
示例#8
0
 /**
  * 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();
 }
示例#9
0
 /**
  * @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);
 }
示例#10
0
 /**
  * @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);
 }