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; } }
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; }
/** * 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); } }
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; }
public function summary() { return parent::summary() . "; tag name: " . $this->tagName(); }
public function active(IObject $aParent, string $aSource, $nPosition) { $aText = new Text($nPosition, 0, ObjectBase::getLine($aSource, $nPosition), ''); $aParent->add($aText); return $aText; }