public function compile(IObject $aObject, ObjectContainer $aObjectContainer, TargetCodeOutputStream $aDev, CompilerManager $aCompilerManager) { if ($aObject instanceof \org\jecat\framework\ui\xhtml\ObjectBase and !$aObject->count()) { Assert::type("org\\jecat\\framework\\ui\\xhtml\\Text", $aObject, 'aObject'); $sText = $aObject->source(); // locale translate do { if (!trim($sText)) { break; } // 排除 script/style 等标签中的内容 if ($aParent = $aObject->parent() and $aParent instanceof Node and in_array(strtolower($aParent->tagName()), array('script', 'style'))) { break; } // 仅 title alt 等属性 if ($aObject instanceof AttributeValue and !in_array(strtolower($aObject->name()), array('title', 'alt'))) { break; } // 过滤 注释 和 doctype 声明 if (preg_match('/^\\s*<\\!.*>\\s*$/', $sText)) { break; } $sText = Locale::singleton()->trans($sText, null, 'ui'); } while (0); $aDev->output($sText); } else { $this->compileChildren($aObject, $aObjectContainer, $aDev, $aCompilerManager); } }
protected function compileTag(Tag $aTag, ObjectContainer $aObjectContainer, TargetCodeOutputStream $aDev, CompilerManager $aCompilerManager) { $aDev->output('<'); if ($aTag->isTail()) { $aDev->output('/'); } $aDev->output($aTag->name()); // 属性 $aAttrs = $aTag->attributes(); foreach ($aAttrs->valueIterator() as $aAttrVal) { $aDev->output(' '); // 具名属性 if ($sName = $aAttrVal->name()) { $aDev->output($sName); $aDev->output('='); } $aDev->output($aAttrVal->quoteType()); if ($aAttrCompiler = $aCompilerManager->compiler($aAttrVal)) { $aAttrCompiler->compile($aAttrVal, $aObjectContainer, $aDev, $aCompilerManager); get_class($aAttrCompiler); } else { if ($sName) { $aDev->output(addcslashes($aAttrs->get($sName), $aAttrVal->quoteType() . '\\')); } else { $aDev->output(addcslashes($aAttrs->source(), $aAttrVal->quoteType() . '\\')); } } $aDev->output($aAttrVal->quoteType()); } if ($aTag->isSingle()) { $aDev->output(' /'); } $aDev->output('>'); }
public function compile(IObject $aObject, ObjectContainer $aObjectContainer, TargetCodeOutputStream $aDev, CompilerManager $aCompilerManager) { $aObject instanceof \org\jecat\framework\ui\xhtml\Node; if (!($sFuncName = $aObject->attributes()->string('function'))) { throw new Exception("render:js 节点缺少function属性(line:%d)", $aObject->line()); } $aDev->output(<<<JSCODE <script> // 模板渲染函数 function {$sFuncName}(aVariables) { \t// 输出缓存对像 \tvar aDevice = { \t\t_buffer: '' \t\t, write: function(data){ \t\t\tthis._buffer+= data ; \t\t} \t} JSCODE ); // 指定的模板文件 if ($aObject->attributes()->string('template')) { } else { if ($aObject->tailTag()) { $aChildCompiledBuff = new TargetCodeOutputStream(); $aChildCompiledBuff->useHereDoc(false); $this->compileChildren($aObject, $aObjectContainer, $aChildCompiledBuff, $aCompilerManager); $aJsBuff = new OutputStreamBuffer(); JavascriptTranslaterFactory::singleton()->create()->compile(new InputStreamCache('<?php ' . $aChildCompiledBuff->bufferBytes(false)), $aJsBuff); $aDev->output($aJsBuff); } else { } } $aDev->output(<<<JSCODE \treturn aDevice._buffer ; } </script>\t\t\t JSCODE ); }
protected function writeObject(Attributes $aAttrs, TargetCodeOutputStream $aDev, $sWidgetVarName) { // 通过 表达式 取得 widget 对象 if ($sInstanceExpress = $aAttrs->expression('ins') or $sInstanceExpress = $aAttrs->expression('instance')) { $sId = ''; $sInstanceOrigin = $aAttrs->string('ins') or $sInstanceOrigin = $aAttrs->string('instance'); $aDev->write("\r\n//// ------- 显示 Widget Instance ---------------------"); $aDev->write("{$sWidgetVarName} = {$sInstanceExpress} ;"); $aDev->write("if( !{$sWidgetVarName} or !({$sWidgetVarName} instanceof \\org\\jecat\\framework\\mvc\\view\\widget\\IViewWidget) ){"); $aDev->output("无效的widget对象:" . $sInstanceOrigin); $aDev->write("} else {"); if ($aAttrs->bool('instance.autoAddToView') or $aAttrs->bool('ins.autoAddToView') or !$aAttrs->has('instance.autoAddToView') and !$aAttrs->has('ins.autoAddToView')) { $aDev->write("\t// ins.autoAddToView=true"); $aDev->write("\tif( \$theView and {$sWidgetVarName}->view()===\$theView ){"); $aDev->write("\t\t\$theView->addWidget({$sWidgetVarName}) ;"); $aDev->write("\t}"); } } else { if ($aAttrs->has('id')) { $sId = $aAttrs->get('id'); $aDev->write("\r\n//// ------- 显示 Widget: {$sId} ---------------------"); $aDev->write("{$sWidgetVarName} = \$theView->widget({$sId}) ;"); $aDev->write("if(!{$sWidgetVarName}){"); $aDev->output("缺少 widget (id:{$sId})"); $aDev->write("}else{"); } else { if ($sInstanceExpress = $aAttrs->expression('new')) { $sClassName = $aAttrs->get('new'); $aDev->write("\r\n//// ------- 创建并显示widget: {$sClassName} ---------------------"); $aDev->write("\$__widget_class = \\org\\jecat\\framework\\bean\\BeanFactory::singleton()->beanClassNameByAlias({$sClassName})?: {$sClassName} ;"); $aDev->write("if( !class_exists(\$__widget_class) ){"); $aDev->output("缺少 widget (class:{$sClassName})"); $aDev->write("}else{"); $aDev->write("\t{$sWidgetVarName} = new \$__widget_class ;"); } else { $aDev->write("\$aDevice->write(\$this->locale()->trans('<widget>标签缺少必要属性:id,instance 或 new')) ;"); return false; } } } return true; }
public function output(TargetCodeOutputStream $aDev) { $aDev->output(highlight_string($this->sCode, true)); }