Example #1
0
 public function active(IObject $aParent, string $aSource, $nPosition)
 {
     Assert::type("org\\jecat\\framework\\ui\\xhtml\\Tag", $aParent, 'aParent');
     $sByte = $aSource->byte($nPosition);
     if (in_array($sByte, array('"', "'"))) {
         $nStartPos = $nPosition + 1;
         $sBorder = $sByte;
     } else {
         $nStartPos = $nPosition;
         $sBorder = null;
     }
     $aAttriVal = new AttributeValue(null, $sBorder, $nStartPos, ObjectBase::getLine($aSource, $nStartPos));
     $aParent->attributes()->add($aAttriVal);
     $aAttriVal->setParent($aParent);
     if ($sByte == '=') {
         $aAttriVal->setEndPosition($nPosition);
         $aAttriVal->setSource($sByte);
         return $aParent;
     } else {
         // 只有一个字节的属性值
         $nNextPos = $nPosition + 1;
         if (ParserStateTag::singleton()->examineEnd($aSource, $nNextPos, $aAttriVal)) {
             return $this->complete($aAttriVal, $aSource, $nPosition);
         }
         return $aAttriVal;
     }
 }
Example #2
0
 public function active(IObject $aParent, string $aSource, $nPosition)
 {
     $sStartMacro = $this->determineMacroBorder($aSource, $nPosition);
     $aMacro = new Macro($aSource->byte($nPosition + strlen($sStartMacro)), $nPosition, 0, ObjectBase::getLine($aSource, $nPosition), '');
     $aMacro->setBorder($sStartMacro, $this->arrMacroBorder[$sStartMacro]);
     $aParent->add($aMacro);
     return $aMacro;
 }
Example #3
0
 /**
  * return IObject
  */
 public function parse(string $aSource, ObjectContainer $aObjectContainer, UI $aUI)
 {
     $nProcIndex = 0;
     $aState = ParserStateDefault::singleton();
     $aCurrentObject = $aRootObject = new ObjectBase(0, $aSource->length() - 1, 0, '');
     while ($nProcIndex < $aSource->length()) {
         $aNewState = $aState->examineStateChange($aSource, $nProcIndex, $aCurrentObject);
         if ($aNewState) {
             // 切换状态
             if ($aNewState != $aState) {
                 //
                 $aCurrentObject = $aState->sleep($aCurrentObject, $aSource, $nProcIndex - 1);
                 $aCurrentObject = $aNewState->active($aCurrentObject, $aSource, $nProcIndex);
                 // 状态变化
                 $aState = ParserState::queryState($aCurrentObject);
             }
         } else {
             $aCurrentObject = $aState->complete($aCurrentObject, $aSource, $nProcIndex);
             if (!$aCurrentObject) {
                 break;
             }
             $aCurrentObject = ParserState::queryState($aCurrentObject)->wakeup($aCurrentObject, $aSource, $nProcIndex);
             // 状态变化
             $aState = ParserState::queryState($aCurrentObject);
         }
         $nProcIndex++;
     }
     // 未完成的对象
     if ($aCurrentObject != $aRootObject) {
         $aBuff = new OutputStreamBuffer();
         $aRootObject->printStruct($aBuff);
         throw new Exception("<pre>\r\n分析UI模板时遇到未完成的对象:%s\r\n%s\r\n</pre>", array($aCurrentObject->summary(), $aBuff));
     }
     $aObjectContainer->clear();
     foreach ($aRootObject->iterator() as $aObject) {
         $aObjectContainer->add($aObject);
     }
 }
Example #4
0
 public function active(IObject $aParent, string $aSource, &$nPosition)
 {
     $nLine = ObjectBase::getLine($aSource, $nPosition);
     $nStartPos = $nPosition;
     // 标签名称
     if (!($sTagName = $this->parseTagName($aSource, $nPosition))) {
         throw new Exception("UI引擎在分析模板时遇到无效的xhtml节点:缺少节点名称(位置:%d行)", $nLine);
     }
     $aTag = new Tag($sTagName, null, 0, $nStartPos, 0, $nLine, '');
     // 尾标签
     if ($sTagName[0] == '/') {
         if (!$aParent instanceof Node) {
             throw new Exception("错误类型");
         }
         $aTag->setTagType(Tag::TYPE_TAIL);
         $aTag->setName(substr($sTagName, 1));
         $aParent->setTailTag($aTag);
     } else {
         $aTag->setTagType(Tag::TYPE_HEAD);
         $aNode = new Node($aTag);
         $aParent->add($aNode);
     }
     return $aTag;
 }
Example #5
0
 public function summary()
 {
     return parent::summary() . "; tag name: " . $this->tagName();
 }
Example #6
0
 public function active(IObject $aParent, string $aSource, $nPosition)
 {
     $aText = new Text($nPosition, 0, ObjectBase::getLine($aSource, $nPosition), '');
     $aParent->add($aText);
     return $aText;
 }