package org.nutz.lang.tmpl;

import org.nutz.lang.Strings;
import org.nutz.lang.util.NutBean;
import org.nutz.mapl.Mapl;

abstract class TmplDynamicEle implements TmplEle {

    private String _type;

    private String key;

    private String _org_fmt;

    private String _dft_val;

    private String _dft_key;

    protected String fmt;

    protected TmplDynamicEle(String type, String key, String fmt, String dft_str) {
        this._type = type;
        this.key = key;
        this._org_fmt = fmt;

        // 默认值取 key @xxx
        if (!Strings.isBlank(dft_str) && dft_str.startsWith("@")) {
            this._dft_key = dft_str.substring(1);
        }
        // 默认值是静态的
        else {
            this._dft_val = dft_str;
        }
    }

    public String toString() {
        StringBuilder sb = new StringBuilder("${").append(key);
        if (null != _type) {
            sb.append('<').append(_type);
            if (null != _org_fmt) {
                sb.append(':').append(_org_fmt);
            }
            sb.append('>');
        }
        // 默认键
        if (null != _dft_key) {
            sb.append('?').append('@').append(_dft_val);
        }
        // 默认值
        else if (null != _dft_val) {
            sb.append('?').append(_dft_val);
        }
        return sb.append('}').toString();
    }

    public void join(StringBuilder sb, NutBean context, boolean showKey) {
        Object val = Mapl.cell(context, key);

        if (null == val) {
            // 默认键
            if (null != _dft_key) {
                val = Mapl.cell(context, _dft_key);
            }
            // 默认值
            else if (null != _dft_val) {
                val = _dft_val;
            }
        }

        String str = _val(val);

        // 如果木值
        if (null == str) {
            if (showKey) {
                sb.append("${").append(key).append('}');
            }
        }
        // 否则填充
        else {
            sb.append(str);
        }
    }

    protected abstract String _val(Object val);

}

@@ -215,24 +215,110 @@
 tring key;%0A%0A
+    // %E6%A0%87%E8%AF%86%E9%94%AE%E6%98%AF%E5%90%A6%E5%8C%85%E6%8B%AC '%5B' '%5D' %E6%88%96%E8%80%85 '.' %E7%AD%89%E5%8F%AF%E4%BB%A5%E8%A2%AB Mapl %E8%A7%A3%E6%9E%90%E7%9A%84%E5%8F%96%E5%80%BC%E8%B7%AF%E5%BE%84%0A    private boolean _is_key_as_path;%0A%0A
     private 
@@ -557,16 +557,150 @@
  = key;%0A
+        this._is_key_as_path = key.indexOf('.') %3E 0%0A                               %7C%7C (key.indexOf('%5B') %3E 0 && key.indexOf('%5D') %3E 0);%0A
         
@@ -1602,32 +1602,50 @@
 lean showKey) %7B%0A
+        // %E7%9C%8B%E7%9C%8B%E6%9C%89%E6%B2%A1%E6%9C%89%E5%80%BC%0A
         Object v
@@ -1645,32 +1645,32 @@
 bject val = 
-Mapl.cel
+__get_va
 l(context, k
@@ -1671,24 +1671,44 @@
 ext, key);%0A%0A
+        // %E8%AF%95%E5%9B%BE%E7%94%A8%E9%BB%98%E8%AE%A4%E9%94%AE%E5%8F%96%E5%80%BC%0A
         if (
@@ -1803,16 +1803,16 @@
 l = 
-Mapl.cel
+__get_va
 l(co
@@ -1956,24 +1956,42 @@
 %0A        %7D%0A%0A
+        // %E8%BD%AC%E6%8D%A2%E6%88%90%E5%AD%97%E7%AC%A6%E4%B8%B2%0A
         Stri
@@ -2234,24 +2234,292 @@
    %7D%0A    %7D%0A%0A
+    private Object __get_val(NutBean context, String k) %7B%0A        // %E5%BE%97%E5%88%B0%E5%80%BC%0A        Object val = context.get(k);%0A%0A        // %E5%A6%82%E6%9E%9C%E6%B2%A1%E5%80%BC%EF%BC%8C%E7%9C%8B%E7%9C%8B%E6%98%AF%E5%90%A6%E9%9C%80%E8%A6%81%E7%94%A8 mapl %E6%90%9E%E4%B8%80%E4%B8%8B%0A        if (null == val && _is_key_as_path) %7B%0A            val = Mapl.cell(context, k);%0A        %7D%0A        return val;%0A    %7D%0A%0A
     protecte

修正一下 Tmpl，让其优先用 Map 的 get 而不是 Mapl.cell