using Mozi.HttpEmbedded.Encode; using Mozi.HttpEmbedded.Generic; using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Text.RegularExpressions; namespace Mozi.HttpEmbedded.Template { //TODO 2021/07/06 考虑将这个模板引擎单独剥离成一个项目 /// /// 页面生成器 /// public class PageEngine { private readonly Dictionary _params = new Dictionary(new StringCompareIgnoreCase()); private readonly Dictionary> _datas = new Dictionary>(new StringCompareIgnoreCase()); private string _template = ""; private string _page = ""; public PageEngine() { } internal PageEngine Load(string filePath) { return this; } internal PageEngine LoadFromStream(Stream stream) { return this; } /// /// 从文本载入模板 /// /// /// public PageEngine LoadFromText(string template) { _template = template; return this; } public PageEngine Prepare() { _page = _template; ApplyAll(); return this; } /// /// 应用所有规则 /// /// private PageEngine ApplyAll() { //首先解析语句 //填充全局变量 InflateGlobal(); //填充变量 InflateValues(); //填充format指令执行结果 InflateExpressionFormat(); return this; } /// /// 注入全局数据 /// /// private PageEngine InflateGlobal() { return this; } /// /// 注入临时数据 /// /// private PageEngine InflateValues() { Regex regParam = new Regex("\\${[A-Za-z0-9_]+(\\.[A-Za-z0-9_]+)?}"); MatchCollection matchesParam = regParam.Matches(_page); foreach (var m in matchesParam) { var param = m.ToString().Trim(new char[] { '$', '{', '}' }); var paramValue = GetPatternValue(param); if (paramValue != null) { _page = _page.Replace(m.ToString(), paramValue); } } return this; } /// /// 解析if /// /// private PageEngine ParseStatementIf() { return this; } private PageEngine ParseStatementForeach() { return this; } private PageEngine ParseStatementSwitch() { return this; } private PageEngine ParseStatementFor() { return this; } private string GetPatternValue(string pattern) { string result =null; if (!pattern.Contains(".")) { result=Get(pattern).ToString(); } else { string[] target = pattern.Split(new char[] { '.' }); object pValue = _params[target[0]]; PropertyInfo props = pValue.GetType().GetProperty(target[1], BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); var targetValue = props.GetValue(pValue, null); result=targetValue.ToString(); } return result; } /// /// 内置变量 /// /// private string InflateVariableSystem() { throw new NotImplementedException(); } /// /// $set表达式 /// /// private PageEngine InflateExpressionSet() { throw new NotImplementedException(); } /// /// $math表达式 /// /// private PageEngine InflateExpressionMath() { Regex regParam = new Regex("\\$math\\.\\d+\\(.*\\)"); MatchCollection matchesParam = regParam.Matches(_page); foreach (var m in matchesParam) { var pattern = m.ToString().Trim(new char[] { '$', '{', '}' }); var paramValue = GetPatternValue(pattern); if (paramValue != null) { _page = _page.Replace(m.ToString(), paramValue); } } return this; } /// /// $format表达式 /// /// private PageEngine InflateExpressionFormat() { Regex regParam = new Regex("\\$format\\(.*\\)"); MatchCollection matchesParam = regParam.Matches(_page); foreach (var m in matchesParam) { var pattern = m.ToString().Replace("$format", "").Trim(new char[] { '(', ')' }); var splitIndex = pattern.IndexOf("\","); var format = pattern.Substring(1, splitIndex-1); var paramexp = pattern.Substring(splitIndex + 2); var pms = paramexp.Split(new char[] { ',' }); var pmvs = new object[pms.Length]; for (int i = 0; i < pms.Length; i++) { pmvs[i] = GetPatternValue(pms[i]); } _page = _page.Replace(m.ToString(),string.Format(format, pmvs)); } return this; } /// /// IIF表达式 /// /// private PageEngine InflateExpressionIIF() { Regex regParam = new Regex("\\$iif\\(.*\\)"); MatchCollection matchesParam = regParam.Matches(_page); foreach (var m in matchesParam) { var pattern = m.ToString().Replace("$iif", "").Trim(new char[] { '(', ')' }); var splitIndex = pattern.IndexOf("\","); var format = pattern.Substring(1, splitIndex - 1); var paramexp = pattern.Substring(splitIndex + 2); var pms = paramexp.Split(new char[] { ',' }); var pmvs = new object[pms.Length]; for (int i = 0; i < pms.Length; i++) { pmvs[i] = GetPatternValue(pms[i]); } _page = _page.Replace(m.ToString(), string.Format(format, pmvs)); } return this; } /// /// == != <> && || /// /// private PageEngine ParseOperator() { throw new NotImplementedException(); } private PageEngine ParseArithmeticOperator() { throw new NotImplementedException(); } private PageEngine ParseLogicalOpeartor() { throw new NotImplementedException(); } /// /// 获取参数值 /// /// /// public object Get(string paramName) { if (_params.ContainsKey(paramName)) { return _params[paramName]; } else { return null; } } /// /// 注入参数 /// /// 参数名 /// 参数值 /// public PageEngine Set(string paramName, object paramValue) { if (_params.ContainsKey(paramName)) { _params[paramName] = paramValue; } else { _params.Add(paramName, paramValue); } return this; } /// /// 注入可枚举集合 /// /// /// /// internal PageEngine RegData(string dataName, IEnumerable data) { if (_datas.ContainsKey(dataName)) { _datas[dataName] = data; } else { _datas.Add(dataName, data); } return this; } /// /// 取出缓冲区数据 /// /// public byte[] GetBuffer() { return StringEncoder.Encode(_page); } } }