悲剧呀,</summary>后面多了一个尖括号……
nnhy authored at 2012-03-30 11:00:56
7.73 KiB
X
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using NewLife;
using NewLife.Reflection;

namespace XTemplate.Templating
{
    /// <summary>模版基类,所有模版继承自该类</summary>
    /// <remarks>模版的原理其实就是生成一个继承自该类的模版类,并重载Render方法</remarks>
    [Serializable]
    public abstract class TemplateBase : DisposeBase
    {
        #region 构造和释放
        /// <summary>释放</summary>
        /// <param name="disposing"></param>
        protected override void OnDispose(bool disposing)
        {
            base.OnDispose(disposing);

            if (_Output != null) _Output = null;
        }
        #endregion

        #region 缩进
        private String _CurrentIndent = "";
        /// <summary>当前缩进</summary>
        public String CurrentIndent
        {
            get { return _CurrentIndent; }
        }

        private List<Int32> _indentLengths;
        /// <summary>缩进长度集合</summary>
        private List<Int32> indentLengths
        {
            get
            {
                if (_indentLengths == null) _indentLengths = new List<Int32>();

                return _indentLengths;
            }
        }

        /// <summary>清除缩进</summary>
        public void ClearIndent()
        {
            indentLengths.Clear();
            _CurrentIndent = "";
        }

        /// <summary>弹出缩进</summary>
        /// <returns></returns>
        public String RemoveIndent()
        {
            String str = "";
            if (indentLengths.Count > 0)
            {
                Int32 num = indentLengths[indentLengths.Count - 1];
                indentLengths.RemoveAt(indentLengths.Count - 1);
                if (num > 0)
                {
                    str = _CurrentIndent.Substring(_CurrentIndent.Length - num);
                    _CurrentIndent = _CurrentIndent.Remove(_CurrentIndent.Length - num);
                }
            }
            return str;
        }

        /// <summary>压入缩进</summary>
        /// <param name="indent"></param>
        public void AddIndent(String indent)
        {
            if (indent == null) throw new ArgumentNullException("indent");

            _CurrentIndent = _CurrentIndent + indent;
            indentLengths.Add(indent.Length);
        }
        #endregion

        #region 输出
        private Boolean endsWithNewline;
        /// <summary>写入文本</summary>
        /// <param name="str"></param>
        public void Write(String str)
        {
            if (String.IsNullOrEmpty(str)) return;

            if ((Output.Length == 0) || endsWithNewline)
            {
                Output.Append(_CurrentIndent);
                endsWithNewline = false;
            }
            if (str.EndsWith(Environment.NewLine, StringComparison.CurrentCulture)) endsWithNewline = true;
            if (_CurrentIndent.Length == 0)
            {
                Output.Append(str);
            }
            else
            {
                str = str.Replace(Environment.NewLine, Environment.NewLine + _CurrentIndent);
                if (endsWithNewline)
                    Output.Append(str, 0, str.Length - _CurrentIndent.Length);
                else
                    Output.Append(str);
            }
        }

        /// <summary>写入文本</summary>
        /// <param name="obj"></param>
        public void Write(Object obj)
        {
            if (obj == null) return;
            Write(obj.ToString());
        }

        /// <summary>写入文本</summary>
        /// <param name="format"></param>
        /// <param name="args"></param>
        public void Write(String format, params Object[] args)
        {
            if (String.IsNullOrEmpty(format)) return;

            if (args != null && args.Length > 0)
                Write(String.Format(CultureInfo.CurrentCulture, format, args));
            else
                Write(format);
        }

        /// <summary>写入文本</summary>
        /// <param name="str"></param>
        public void WriteLine(String str)
        {
            Write(str);

            Output.AppendLine();
            endsWithNewline = true;
        }

        /// <summary>写入文本</summary>
        /// <param name="obj"></param>
        public void WriteLine(Object obj)
        {
            if (obj != null) Write(obj.ToString());

            Output.AppendLine();
            endsWithNewline = true;
        }

        /// <summary>写入行</summary>
        /// <param name="format"></param>
        /// <param name="args"></param>
        public void WriteLine(String format, params Object[] args)
        {
            if (!String.IsNullOrEmpty(format))
            {
                if (args != null && args.Length > 0)
                    Write(String.Format(CultureInfo.CurrentCulture, format, args));
                else
                    Write(format);
            }

            Output.AppendLine();
            endsWithNewline = true;
        }

        /// <summary>写入一个换行</summary>
        public void WriteLine()
        {
            Output.AppendLine();
            endsWithNewline = true;
        }
        #endregion

        #region 属性
        private Template _Template;
        /// <summary>模版引擎实例</summary>
        public Template Template { get { return _Template; } set { _Template = value; } }

        private TemplateItem _TemplateItem;
        /// <summary>模版项实例</summary>
        public TemplateItem TemplateItem { get { return _TemplateItem; } set { _TemplateItem = value; } }
        #endregion

        #region 生成
        /// <summary>初始化</summary>
        public virtual void Initialize() { }

        /// <summary>转换文本</summary>
        /// <returns></returns>
        public virtual String Render() { return Output.ToString(); }

        private StringBuilder _Output;
        /// <summary>输出</summary>
        protected StringBuilder Output
        {
            get
            {
                if (_Output == null) _Output = new StringBuilder();

                return _Output;
            }
            set { _Output = value; }
        }
        #endregion

        #region 数据属性
        private IDictionary<String, Object> _Data;
        /// <summary>数据</summary>
        public IDictionary<String, Object> Data
        {
            get { return _Data ?? (_Data = new Dictionary<String, Object>()); }
            set { _Data = value; }
        }

        /// <summary>获取数据,主要处理数据字典中不存在的元素</summary>
        /// <param name="name"></param>
        /// <returns></returns>
        protected Object GetData(String name)
        {
            Object obj = null;
            return Data.TryGetValue(name, out obj) ? obj : null;
        }

        /// <summary>获取数据,主要处理类型转换</summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="name"></param>
        /// <returns></returns>
        protected T GetData<T>(String name)
        {
            Object obj = GetData(name);
            if (obj == null) return default(T);

            return (T)TypeX.ChangeType(obj, typeof(T));
        }
        #endregion

        #region 模版变量
        private IDictionary<String, Type> _Vars;
        /// <summary>模版变量集合</summary>
        public IDictionary<String, Type> Vars
        {
            get { return _Vars ?? (_Vars = new Dictionary<String, Type>()); }
            set { _Vars = value; }
        }
        #endregion
    }
}