/// <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}}!");
        }
Пример #3
0
        /// <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());
        }
Пример #4
0
        /// <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());
        }
Пример #5
0
 /// <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();
 }
Пример #8
0
 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());
     }
 }
Пример #9
0
 /// <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);
 }