/** * $aObject 这是一个Node对象.它是模板引擎分析模板文件后的产品之一.Node对象包含了标签中的所有内容,包括Node的类型,内容,参数,等等,这些信息都是模板引擎分析模板得来. * 比如这个if标签,你可以通过Node对象拿到它的源码,if的模板源码类似: * <if '(bool)$nTrue'> * <span>true</span> * </if> * 也可以取得if标签的参数,if标签的参数就是上面源码中if后面的部分: * (bool)$nTrue * $aDev 输出设备,一般指网页 * $aCompilerManager 编译管理器 */ public function compile(IObject $aObject, ObjectContainer $aObjectContainer, TargetCodeOutputStream $aDev, CompilerManager $aCompilerManager) { //确保传入的$aObject参数是node对象 Type::check("org\\jecat\\framework\\ui\\xhtml\\Node", $aObject); //以下是编译过程 //把<if>标签转换成php代码,也就是"if(" //获得<if>标签中的条件语句,原封不动的放到if后面的括号中充当条件 //但是这里并没有给代码块结尾,因为结尾在别的编译器中了,对于if标签来说,它的结尾工作放在</if>编译器那里了.是的,if标签是至少需要两个编译器才能完整编译 $aDev->write('if(' . ExpressionCompiler::compileExpression($aObject->attributes()->anonymous()->source(), $aObjectContainer->variableDeclares()) . '){'); /* * 处理单行标签.单行格式是为了解决跨模板文件问题 * if标签的多行格式是: * <if> * <else/> * </if> * 单行格式是 * <if/> * <else/> * <if:end/> */ if (!$aObject->headTag()->isSingle()) { $this->compileChildren($aObject, $aObjectContainer, $aDev, $aCompilerManager); $aDev->write("} "); } }
public function compile(IObject $aObject, ObjectContainer $aObjectContainer, TargetCodeOutputStream $aDev, CompilerManager $aCompilerManager) { Type::check("org\\jecat\\framework\\ui\\xhtml\\Node", $aObject); $aDev->write(' }elseif('); $aDev->write(ExpressionCompiler::compileExpression($aObject->attributes()->anonymous()->source(), $aObjectContainer->variableDeclares())); $aDev->write("){ "); $this->compileChildren($aObject, $aObjectContainer, $aDev, $aCompilerManager); }
public function compile(IObject $aObject, ObjectContainer $aObjectContainer, TargetCodeOutputStream $aDev, CompilerManager $aCompilerManager) { Type::check("org\\jecat\\framework\\ui\\xhtml\\Node", $aObject); if (!$aObjectContainer->variableDeclares()->hasDeclared('aStackForLoopIsEnableToRun')) { $aObjectContainer->variableDeclares()->declareVarible('aStackForLoopIsEnableToRun', 'new \\org\\jecat\\framework\\util\\Stack()'); } $sIdxUserName = $aObject->attributes()->has('idx') ? $aObject->attributes()->string('idx') : ''; $sIdxAutoName = NodeCompiler::assignVariableName('$__while_idx_'); if (!empty($sIdxUserName)) { $aDev->write(" {$sIdxAutoName} = -1; \$aStackForLoopIsEnableToRun->put(false); "); } $aDev->write(" while("); $aDev->write(ExpressionCompiler::compileExpression($aObject->attributes()->anonymous()->source(), $aObjectContainer->variableDeclares())); $aDev->write("){ \$bLoopIsEnableToRun = & \$aStackForLoopIsEnableToRun->getRef();\r\n\t\t\t\$bLoopIsEnableToRun = true;"); if (!empty($sIdxUserName)) { $aDev->write(" {$sIdxAutoName}++; \r\n\t\t\t\t\t\t\t\$aVariables->{$sIdxUserName}={$sIdxAutoName}; "); } if (!$aObject->headTag()->isSingle()) { $this->compileChildren($aObject, $aObjectContainer, $aDev, $aCompilerManager); $aDev->write(" } "); } }
public function compile(IObject $aObject, ObjectContainer $aObjectContainer, TargetCodeOutputStream $aDev, CompilerManager $aCompilerManager) { Type::check("org\\jecat\\framework\\ui\\xhtml\\Node", $aObject); $aAttrs = $aObject->attributes(); $sType = strtolower($aAttrs->string('type')); if (in_array($sType, array('text/php', 'php'))) { foreach ($aObject->iterator() as $aChild) { if ($aChild instanceof AttributeValue) { continue; } $aDev->write(ExpressionCompiler::compileExpression($aChild->source(), $aObjectContainer->variableDeclares(), false, true)); } } else { if ($aAttrs->has('src') and !$aAttrs->bool('ignore')) { $sSrc = $aAttrs->get('src'); $aDev->preprocessStream()->write("\\org\\jecat\\framework\\resrc\\HtmlResourcePool::singleton()->addRequire({$sSrc},\\org\\jecat\\framework\\resrc\\HtmlResourcePool::RESRC_JS) ;"); // 清除后文中的空白字符 ClearCompiler::clearAfterWhitespace($aObject); } else { parent::compile($aObject, $aObjectContainer, $aDev, $aCompilerManager); } } }
public function compile(IObject $aObject, ObjectContainer $aObjectContainer, TargetCodeOutputStream $aDev, CompilerManager $aCompilerManager) { Type::check("org\\jecat\\framework\\ui\\xhtml\\Node", $aObject); $aDev->write(' continue ' . ExpressionCompiler::compileExpression($aObject->attributes()->source(), $aObjectContainer->variableDeclares()) . '; '); }
public function expression($sName) { if (!($aText = parent::get($sName))) { return null; } if (!($aObContainer = $aText->objectContainer())) { throw new Exception('AttributeVar::objectContainer() 返回空'); } return ExpressionCompiler::compileExpression($aText->source(), $aObContainer->variableDeclares()); }
public function compile(IObject $aObject, ObjectContainer $aObjectContainer, TargetCodeOutputStream $aDev, CompilerManager $aCompilerManager) { Type::check("org\\jecat\\framework\\ui\\xhtml\\Node", $aObject); $aAttributes = $aObject->attributes(); if ($aAttributes->has("name")) { $sSubTemplateName = $aAttributes->string("name"); } else { if (!($aSubTemplateNameVal = $aAttributes->anonymous())) { throw new Exception("subtemplate:define 节点缺少name属性(line:%d)", $aObject->line()); } $sSubTemplateName = $aSubTemplateNameVal->source(); } if (!is_callable($sSubTemplateName, true)) { throw new Exception("subtemplate:define 节点的name属性使用了无效的字符:%d", $sSubTemplateName); } $sSubTemplateFuncName = '__subtemplate_' . $sSubTemplateName; $aDev->write("\r\n// -- call subtemplate:{$sSubTemplateName} start---------------------"); // 是否继承父模板中的变量 $bExtendParentVars = $aAttributes->has("vars") ? $aAttributes->bool('vars') : false; // variables if (!$bExtendParentVars) { $aDev->write("\$__subtemplate_aVariables = new \\org\\jecat\\framework\\util\\DataSrc() ;"); $aDev->write("\$__subtemplate_aVariables->addChild(\$aVariables) ;"); } else { $aDev->write("\$__subtemplate_aVariables = \$aVariables ;"); } // other variables foreach ($aAttributes as $sName => $aValue) { if (substr($sName, 0, 4) == 'var.' and $sVarName = substr($sName, 4)) { $sVarName = '"' . addslashes($sVarName) . '"'; $sValue = ExpressionCompiler::compileExpression($aValue->source(), $aObjectContainer->variableDeclares()); $aDev->write("\$__subtemplate_aVariables->set({$sVarName},{$sValue}) ;"); } } $aDev->write("if( !function_exists('{$sSubTemplateFuncName}') ){"); $aDev->write("\t\$aDevice->write(\"正在调用无效的子模板:{$sSubTemplateName}\") ;"); $aDev->write("} else {"); $aDev->write("\tcall_user_func_array('{$sSubTemplateFuncName}',array(\$__subtemplate_aVariables,\$aDevice)) ;"); $aDev->write("}"); $aDev->write("// -- call subtemplate:{$sSubTemplateName} end ---------------------\r\n\r\n"); }
public function compile(IObject $aObject, ObjectContainer $aObjectContainer, TargetCodeOutputStream $aDev, CompilerManager $aCompilerManager) { $aDev->write(ExpressionCompiler::compileExpression($aObject->source(), $aObjectContainer->variableDeclares(), false, true) . ';'); }
public function compile(IObject $aObject, ObjectContainer $aObjectContainer, TargetCodeOutputStream $aDev, CompilerManager $aCompilerManager) { $aDev->write("\$aDevice->write(" . ExpressionCompiler::compileExpression($aObject->source(), $aObjectContainer->variableDeclares()) . ") ;\r\n"); }