protected virtual void _Init() { _Functions = new Dictionary<string, TemplateFunction>(StringComparer.InvariantCultureIgnoreCase); _Variables = new VariableScope(); this.Reset(); _Functions.Add("equals", new TemplateFunction(FuncEquals)); _Functions.Add("notequals", new TemplateFunction(FuncNotEquals)); _Functions.Add("iseven", new TemplateFunction(FuncIsEven)); _Functions.Add("isodd", new TemplateFunction(FuncIsOdd)); _Functions.Add("isempty", new TemplateFunction(FuncIsEmpty)); _Functions.Add("isnotempty", new TemplateFunction(FuncIsNotEmpty)); _Functions.Add("isnumber", new TemplateFunction(FuncIsNumber)); _Functions.Add("toupper", new TemplateFunction(FuncToUpper)); _Functions.Add("tolower", new TemplateFunction(FuncToLower)); _Functions.Add("isdefined", new TemplateFunction(FuncIsDefined)); _Functions.Add("ifdefined", new TemplateFunction(FuncIfDefined)); _Functions.Add("len", new TemplateFunction(FuncLen)); _Functions.Add("tolist", new TemplateFunction(FuncToList)); _Functions.Add("isnull", new TemplateFunction(FuncIsNull)); _Functions.Add("not", new TemplateFunction(FuncNot)); _Functions.Add("iif", new TemplateFunction(FuncIif)); _Functions.Add("format", new TemplateFunction(FuncFormat)); _Functions.Add("trim", new TemplateFunction(FuncTrim)); _Functions.Add("filter", new TemplateFunction(FuncFilter)); _Functions.Add("isgt", new TemplateFunction(FuncGt)); _Functions.Add("islt", new TemplateFunction(FuncLt)); _Functions.Add("compare", new TemplateFunction(FuncCompare)); _Functions.Add("ior", new TemplateFunction(FuncOr)); _Functions.Add("iand", new TemplateFunction(FuncAnd)); _Functions.Add("comparenocase", new TemplateFunction(FuncCompareNoCase)); _Functions.Add("stripnewlines", new TemplateFunction(FuncStripNewLines)); _Functions.Add("typeof", new TemplateFunction(FuncTypeOf)); _Functions.Add("cbool", new TemplateFunction(FuncCBool)); _Functions.Add("cint", new TemplateFunction(FuncCInt)); _Functions.Add("cdouble", new TemplateFunction(FuncCDouble)); _Functions.Add("cdate", new TemplateFunction(FuncCDate)); _Functions.Add("now", new TemplateFunction(FuncNow)); _Functions.Add("createtypereference", new TemplateFunction(FuncCreateTypeReference)); }
/// <summary> /// 初始化变量视图,并为其指定父视图。 /// </summary> /// <param name="parent"></param> public VariableScope(VariableScope parent) { _Parent = parent; _Values = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase); }
/// <summary> /// 处理模板。 /// </summary> /// <param name="name">指定模板名。</param> /// <param name="tag">指定一个标签实例。</param> protected void ProcessTemplate(string name, Tag tag) { if (_CustomTags != null && _CustomTags.ContainsKey(name)) { ExecuteCustomTag(tag); return; } Template useTemplate = _CurrentTemplate.FindTemplate(name); if (useTemplate == null) { string msg = string.Format("模板未找到:'{0}'", name); throw new TemplateRuntimeException(msg, tag.Line, tag.Col); } // process inner elements and save content TextWriter saveWriter = _Writer; _Writer = new StringWriter(); string content = string.Empty; try { this.ProcessElements(tag.InnerElements); content = _Writer.ToString(); } finally { _Writer = saveWriter; } Template saveTemplate = _CurrentTemplate; _Variables = new VariableScope(_Variables); _Variables["innerText"] = content; try { foreach (TagAttribute attrib in tag.Attributes) { object val = this.EvalExpression(attrib.Expression); _Variables[attrib.Name] = val; } _CurrentTemplate = useTemplate; this.ProcessElements(_CurrentTemplate.Elements); } finally { _Variables = _Variables.Parent; _CurrentTemplate = saveTemplate; } }