/// <summary> /// 通过当前对象执行语法所得到的字符串。 /// </summary> /// <param name="element">属性实例对象。</param> /// <param name="executor">解析器接口。</param> /// <returns>返回脚本代码</returns> public string Begin(TemplateSyntaxElement element, ITemplateExecutor executor) { var sb = new StringBuilder(); sb.Append("if(").Append(element.Args).Append("){"); return(sb.ToString()); }
/// <summary> /// 通过当前对象执行语法所得到的字符串。 /// </summary> /// <param name="element">属性实例对象。</param> /// <param name="executor">解析器接口。</param> /// <returns>返回脚本代码</returns> public string Begin(TemplateSyntaxElement element, ITemplateExecutor executor) { var items = element.Args.Trim().Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); if (items.Length == 3 && items[1] == "in") { return($"{items[2]}.forEach(function({items[0]},index){{"); } throw new Exception("语法错误,必须为{{foreach xx in xxs}}!"); }
/// <summary> /// 通过当前对象执行语法所得到的字符串。 /// </summary> /// <param name="element">属性实例对象。</param> /// <param name="executor">解析器接口。</param> /// <returns>返回脚本代码</returns> public string Begin(TemplateSyntaxElement element, ITemplateExecutor executor) { if (element.IsSelfClosed || !element.Any()) { return("if($model.count>0){$model.children.forEach(function(item){appender(item);});}"); } var sb = new StringBuilder(); sb.Append("function children($model){"); foreach (var node in element) { sb.Append(node.ToJsString(executor)); } sb.Append("};"); sb.Append("if($model.count>0){$model.children.forEach(function(item){children(item);});}"); return(sb.ToString()); }
/// <summary> /// 通过当前对象执行语法所得到的字符串。 /// </summary> /// <param name="element">属性实例对象。</param> /// <param name="executor">解析器接口。</param> /// <param name="instance">当前实例对象。</param> /// <param name="func">获取当前对象属性值的方法。</param> /// <returns>返回脚本代码</returns> public string Begin(TemplateSyntaxElement element, ITemplateExecutor executor, object instance, Func <object, string, object> func) { var sb = new StringBuilder(); if (instance is IParentable models) { if (element.IsSelfClosed || !element.Any()) { foreach (var model in models.Children) { sb.Append(element.Document.ToHtmlString(executor, model, func)); } } else { foreach (var model in models.Children) { sb.Append(element.ToHtmlString(executor, model, func)); } } } return(sb.ToString()); }
/// <summary> /// 尝试获取语法解析器。 /// </summary> /// <param name="element">元素实例对象。</param> /// <param name="executor">返回的解析器。</param> /// <returns>返回获取结果。</returns> public bool TryGetExecutor(TemplateSyntaxElement element, out ITemplateSyntaxExecutor executor) { return(_executors.TryGetValue(element.Keyword, out executor)); }
/// <summary> /// 通过当前对象执行语法所得到的字符串。 /// </summary> /// <param name="element">属性实例对象。</param> /// <param name="executor">解析器接口。</param> /// <returns>返回脚本代码</returns> public string End(TemplateSyntaxElement element, ITemplateExecutor executor) { return("});"); }
/// <summary> /// 通过当前对象执行语法所得到的字符串。 /// </summary> /// <param name="element">属性实例对象。</param> /// <param name="executor">解析器接口。</param> /// <param name="instance">当前实例对象。</param> /// <param name="func">获取当前对象属性值的方法。</param> /// <returns>返回脚本代码</returns> public string Begin(TemplateSyntaxElement element, ITemplateExecutor executor, object instance, Func <object, string, object> func) { throw new NotImplementedException(); }
private void ParseDocument(char current) { //开始位置 if (current == '{' && Next == '{') {//语法或代码节点开始 var code = ReadCode(); if (code[code.Length - 1] == '/') {//自闭和 var element = new TemplateSyntaxElement(code.Substring(0, code.Length - 1), _position); element.IsSelfClosed = true; _stack.Push(element); } else if (code[0] == '/') {//结束 code = code.Substring(1).Trim(); var children = new List <TemplateElementBase>(); var element = _stack.Pop(); while (true) { if (element is TemplateCodeElement ce && ce.Keyword == code) { var syntax = new TemplateSyntaxElement(ce); children.Reverse(); syntax.AddRange(children); _stack.Push(syntax); return; } children.Add(element); if (_stack.Count == 0) { children.Reverse(); AddRange(children); return; } element = _stack.Pop(); } } else {//代码块 _stack.Push(new TemplateCodeElement(code, _position)); } } else if (current == '<') { //html节点开始 if (Next == '/') { //结束节点 _index += 2; var name = ReadTagName(); _index++;//跳过>符号 var children = new List <TemplateElementBase>(); var element = _stack.Pop(); while (true) { if (element is TemplateHtmlElement ce && ce.TagName == name) { children.Reverse(); ce.AddRange(children); _stack.Push(ce); return; } children.Add(element); if (_stack.Count == 0) { children.Reverse(); AddRange(children); return; } element = _stack.Pop(); } } else { _index++; var element = new TemplateHtmlElement(ReadTagName(), _position); PassOptionalWhitespace(); do { if (IsHtmlEnd()) { break; } var attribute = ReadAttribute(); element[attribute.Name] = attribute; }while (true); element.IsSelfClosed = Current == '/'; _stack.Push(element); if (element.IsSelfClosed) { _index++; } _index++; } } else { _stack.Push(ReadText()); } }
/// <summary> /// 通过当前对象执行语法所得到的字符串。 /// </summary> /// <param name="element">属性实例对象。</param> /// <param name="executor">解析器接口。</param> /// <param name="instance">当前实例对象。</param> /// <param name="func">获取当前对象属性值的方法。</param> /// <returns>返回脚本代码</returns> public string End(TemplateSyntaxElement element, ITemplateExecutor executor, object instance, Func <object, string, object> func) { return(null); }