コード例 #1
0
ファイル: TemplatePage.cs プロジェクト: jl632541832/cms-1
 /// <summary>
 /// 添加变量
 /// </summary>
 /// <param name="key"></param>
 /// <param name="value"></param>
 public TemplatePage AddVariable <T>(string key, T value)
 {
     _dc.DefineVariable(key, value);
     return(this);
 }
コード例 #2
0
        /// <summary>
        /// 执行方法并将返回值赋予变量
        /// </summary>
        /// <param name="data"></param>
        /// <param name="dc"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        private static string EvalMethodToVar(IDataContainer dc, string content, object data)
        {
            //正则模式,支持以下
            // //$menu="123456\" f" sdf
            // $menu=12 fsdf
            // $menu=item:123456
            // $menu=>getmenu(test,item,get)
            const string expressionPattern =
                "(/*/*)\\$([a-zA-Z][a-zA-Z0-9_]*)\\s*=>\\s*([a-zA-Z][a-zA-Z0-9_]*)\\((([^\\)]|\\\\\\))*)\\)(\\s+\\B)*"; //设置表达式

            string varName,
                   methodName,
                   paramArray;

            Type       type = data.GetType();
            MethodInfo method;

            Type[]   parameterTypes;
            object[] parameters;
            int      parametersNum;


            var outHtml = Regex.Replace(content, expressionPattern, m =>
            {
                //注释
                if (m.Groups[1].Value != "")
                {
                    return(String.Empty);
                }
                //获取变量及表达式
                varName    = m.Groups[2].Value;
                methodName = m.Groups[3].Value;
                paramArray = m.Groups[4].Value.Replace("\\,", "__CSP__");

                parameters    = paramArray.Trim().Length == 0 ? new object[0] : paramArray.Split(',');
                parametersNum = parameters.Length;

                //查找是否存在方法(方法参数均为string类型)
                parameterTypes = new Type[parametersNum];
                for (int i = 0; i < parametersNum; i++)
                {
                    parameterTypes[i] = typeof(String);
                    parameters[i]     = Regex.Replace(parameters[i].ToString(), "\\B\"|\"\\B", String.Empty).Replace("__CSP__", ",");
                }

                string key = type.FullName + ":" + methodName + "$" + parameters.Length;
                if (EvalMethodMap.ContainsKey(key))
                {
                    method = EvalMethodMap[key];
                }
                else
                {
                    var flag = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public |
                               BindingFlags.IgnoreCase;
                    method             = type.GetMethod(methodName, flag, null, parameterTypes, null);
                    EvalMethodMap[key] = method;
                }

                if (method != null)
                {
                    Type returnType = method.ReturnType;
                    if (returnType != typeof(void))
                    {
                        object result = method.Invoke(data, parameters);
                        if (result != null)
                        {
                            if (returnType.IsPrimitive || returnType == typeof(String))
                            {
                                dc.DefineVariable(varName, (result ?? "").ToString());
                            }
                            else
                            {
                                dc.DefineVariable(varName, new Variable {
                                    Key = varName, Value = result, Type = returnType
                                });
                            }
                        }
                    }
                }

                /*
                 * else
                 * {
                 *  //throw new MissingMethodException("在对象中找不到");
                 *
                 *  Config.DC.DefineVar(varName, "<span style=\"color:red\">在对象中找不到方法<b>"+methodName+"</b>"+
                 *      (parametersNum==0?"":",参数"+parametersNum.ToString()+"个")
                 +"。</span>");
                 * }
                 */

                return(String.Empty);
            }, RegexOptions.Singleline);

            return(outHtml);
        }
コード例 #3
0
        /// <summary>
        /// 赋值到变量
        /// $v = form('key')
        /// </summary>
        private static string SetToVariable(IDataContainer dc, string content)
        {
            //正则模式,支持以下
            // //$menu="123456\" f" sdf
            // $menu=12 fsdf
            // $menu=item:123456
            // $menu=>getmenu(test,item,get)
            //const string expressionPattern = "(/*/*|#*)\\$([_a-zA-Z][a-zA-Z0-9_]*)\\s*=\\s*(\"(\"|[^\"\\n])*\"|[^<>\\s\\n\"\\$/]+)(\\s+\\B)*";
            const string expressionPattern = "(/*/*|#*)\\$([_a-zA-Z][a-zA-Z0-9_]*)\\s*=\\s*([^()]+)\\(((\\{[^}]*\\})|([^)]*))\\)";

            //设置表达式
            //const string specialVarPattern = "(item|cache|query|form)\\([\"']*(.+?)[\"']*\\)"; //特殊数据

            var outHtml = Regex.Replace(content, expressionPattern, m =>
            {
                //注释
                if (m.Groups[1].Value != "")
                {
                    return(String.Empty);
                }


                //获取变量及表达式
                var varName  = m.Groups[2].Value;
                var expName  = m.Groups[3].Value;
                var expValue = TemplateUtils.GetFunctionParamValue(m.Groups[4].Value);
                var value    = String.Empty;
                switch (expName)
                {
                case "item":
                    value = dc.GetAdapter().GetItem(expValue).ToString();
                    break;

                case "cache":
                    value = dc.GetAdapter().GetCache(expValue).ToString();
                    break;

                case "query":
                    value = dc.GetAdapter().GetQueryParam(expValue);
                    break;

                case "form":
                    value = dc.GetAdapter().GetFormParam(expValue);
                    break;
                }

                dc.DefineVariable(varName, value ?? "");

                /*
                 * }
                 * else
                 * {
                 * string varRealValue = Regex.Replace(expValue, "\\B\"|\"\\B", String.Empty);
                 *
                 * //如果为字符,否则读取指定值的变量
                 * if (Regex.IsMatch(expValue, "\\B\"|\"\\B"))
                 * {
                 *  dc.DefineVariable(varName, varRealValue);
                 * }
                 * else
                 * {
                 *  object obj = dc.GetVariable(varRealValue);
                 *  if (obj != null)
                 *  {
                 *      if (obj is Variable)
                 *      {
                 *          dc.DefineVariable(varName, (Variable) obj);
                 *      }
                 *      else
                 *      {
                 *          dc.DefineVariable(varName, obj.ToString());
                 *      }
                 *  }
                 *  else
                 *  {
                 *      string message = "";
                 *      int i = 0;
                 *      foreach (string key in dc.GetDefineVariable().Keys)
                 *      {
                 *          message += (++i == 1 ? "" : "," + key);
                 *      }
                 *      throw new NotSupportedException("数据引用键错误:" + m.Value + "\n"
                 +
                 +                                      (message != ""
                 +                                          ? "受支持可引用的数据键包括" + message + "\n使用\"$" + varName +
                 +                                            "=>键\"进行调用!"
                 +                                          : ""));
                 +  }
                 + }
                 + }
                 */

                return(String.Empty);
            }, RegexOptions.Singleline);

            return(outHtml);
        }
コード例 #4
0
ファイル: Eval.cs プロジェクト: 921819535/cms
        /// <summary>
        /// 赋值到变量
        /// $v = form('key')
        /// </summary>
        private static string SetToVariable(IDataContainer dc, string content)
        {
            //正则模式,支持以下
            // //$menu="123456\" f" sdf
            // $menu=12 fsdf
            // $menu=item:123456
            // $menu=>getmenu(test,item,get)
            const string expressionPattern =
                "(/*/*|#*)\\$([_a-zA-Z][a-zA-Z0-9_]*)\\s*=\\s*(\"(\"|[^\"\\n])*\"|[^<>\\s\\n\"\\$/]+)(\\s+\\B)*";
            //设置表达式
            const string specialVarPattern = "(item|cache|query|form)\\([\"']*(.+?)[\"']*\\)"; //特殊数据

            string outHtml,
                   varName,
                   varValue,
                   varKey;

            Match valueMatch;

            outHtml = Regex.Replace(content, expressionPattern, m =>
            {
                //注释
                if (m.Groups[1].Value != "")
                {
                    return(String.Empty);
                }


                //获取变量及表达式
                varName  = m.Groups[2].Value;
                varValue = m.Groups[3].Value;
                if (Regex.IsMatch(varValue, specialVarPattern, RegexOptions.IgnoreCase))
                {
                    valueMatch   = Regex.Match(varValue, specialVarPattern, RegexOptions.IgnoreCase);
                    varKey       = valueMatch.Groups[2].Value;
                    var varType  = valueMatch.Groups[1].Value.ToLower();
                    object value = "";
                    switch (valueMatch.Groups[1].Value.ToLower())
                    {
                    case "item":
                        value = dc.GetAdapter().GetItem(varKey);
                        break;

                    case "cache":
                        value = dc.GetAdapter().GetCache(varKey);
                        break;

                    case "query":
                        value = dc.GetAdapter().GetQueryParam(varKey);
                        break;

                    case "form":
                        value = dc.GetAdapter().GetFormParam(varKey);
                        break;
                    }
                    dc.DefineVariable(varName, value);
                }
                else
                {
                    string varRealValue = Regex.Replace(varValue, "\\B\"|\"\\B", String.Empty);

                    //如果为字符,否则读取指定值的变量
                    if (Regex.IsMatch(varValue, "\\B\"|\"\\B"))
                    {
                        dc.DefineVariable(varName, varRealValue);
                    }
                    else
                    {
                        object obj = dc.GetVariable(varRealValue);
                        if (obj != null)
                        {
                            if (obj is Variable)
                            {
                                dc.DefineVariable(varName, (Variable)obj);
                            }
                            else
                            {
                                dc.DefineVariable(varName, obj.ToString());
                            }
                        }
                        else
                        {
                            string message = "";
                            int i          = 0;
                            foreach (string key in dc.GetDefineVariable().Keys)
                            {
                                message += (++i == 1 ? "" : "," + key);
                            }
                            throw new NotSupportedException("数据引用键错误:" + m.Value + "\n"
                                                            +
                                                            (message != ""
                                                                ? "受支持可引用的数据键包括" + message + "\n使用\"$" + varName +
                                                             "=>键\"进行调用!"
                                                                : ""));
                        }
                    }
                }

                return(String.Empty);
            }, RegexOptions.Singleline);
            return(outHtml);
        }