示例#1
0
 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);
     }
 }
示例#2
0
 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('>');
 }
示例#3
0
    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
);
    }
示例#4
0
 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('&lt;widget&gt;标签缺少必要属性:id,instance 或 new')) ;");
                 return false;
             }
         }
     }
     return true;
 }
示例#5
0
 public function output(TargetCodeOutputStream $aDev)
 {
     $aDev->output(highlight_string($this->sCode, true));
 }