Exemplo n.º 1
0
 public static List<Block> Parse(string name, string content)
 {
     List<Block> blocks = new List<Block>();
     if (!string.IsNullOrEmpty(content))
     {
         foreach (Match match in templateParsingRegex.Matches(content))
         {
             Block item = new Block();
             Group group = null;
             if ((group = match.Groups["text"]).Success)
             {
                 item.Type = BlockType.Text;
             }
             else if ((group = match.Groups["directive"]).Success)
             {
                 item.Type = BlockType.Directive;
             }
             else if ((group = match.Groups["member"]).Success)
             {
                 item.Type = BlockType.Member;
             }
             else if ((group = match.Groups["expression"]).Success)
             {
                 item.Type = BlockType.Expression;
             }
             else if ((group = match.Groups["statement"]).Success)
             {
                 item.Type = BlockType.Statement;
             }
             if ((group != null) && group.Success)
             {
                 item.Text = group.Value;
                 item.Name = name;
                 blocks.Add(item);
             }
         }
         InsertPosition(blocks);
         foreach (Block block2 in blocks)
         {
             if (unescapedTagFindingRegex.Match(block2.Text).Success)
             {
                 throw new TemplateException(block2, @"不可识别的标记!可能有未编码的字符,比如\<#。");
             }
         }
         StripEscapeCharacters(blocks);
     }
     return blocks;
 }
Exemplo n.º 2
0
 private static bool ValidateDirectiveString(Block block)
 {
     Match match = nameValidatingRegex.Match(block.Text);
     if (!match.Success)
     {
         return false;
     }
     int length = match.Length;
     MatchCollection matchs = paramValueValidatingRegex.Matches(block.Text);
     if (matchs.Count == 0)
     {
         return false;
     }
     foreach (Match match2 in matchs)
     {
         if (match2.Index != length)
         {
             return false;
         }
         length += match2.Length;
     }
     if (length != block.Text.Length)
     {
         return false;
     }
     return true;
 }
Exemplo n.º 3
0
 public static Directive ParseDirectiveBlock(Block block)
 {
     if (block == null)
     {
         throw new ArgumentNullException("block");
     }
     if (!ValidateDirectiveString(block))
     {
         throw new TemplateException(block, "指令格式错误!");
     }
     MatchCollection matchs = directiveParsingRegex.Matches(block.Text);
     string name = null;
     Dictionary<string, string> parameters = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
     foreach (Match match in matchs)
     {
         Group group;
         if ((group = match.Groups["name"]).Success)
         {
             name = group.Value;
         }
         else
         {
             string key = null;
             string input = null;
             if ((group = match.Groups["pname"]).Success)
             {
                 key = group.Value;
             }
             if ((group = match.Groups["pvalue"]).Success)
             {
                 input = group.Value;
             }
             if ((key != null) && (input != null))
             {
                 if (parameters.ContainsKey(key))
                 {
                     throw new TemplateException(block, string.Format("指令中已存在名为[{0}]的参数!", key));
                 }
                 input = directiveEscapeFindingRegex.Replace(input, escapeReplacingEvaluator);
                 parameters.Add(key, input);
             }
         }
     }
     if (name != null)
     {
         return new Directive(name, parameters, block);
     }
     return null;
 }
Exemplo n.º 4
0
 /// <summary>生成成员代码块</summary>
 /// <param name="block"></param>
 /// <param name="generatorType"></param>
 /// <param name="lineNumbers"></param>
 /// <param name="provider"></param>
 /// <param name="options"></param>
 /// <param name="firstMemberFound"></param>
 /// <returns></returns>
 private static Boolean GenerateMemberForBlock(Block block, CodeTypeDeclaration generatorType, Boolean lineNumbers, CodeDomProvider provider, CodeGeneratorOptions options, Boolean firstMemberFound)
 {
     CodeSnippetTypeMember member = null;
     if (!firstMemberFound)
     {
         // 发现第一个<#!后,认为是类成员代码的开始,直到下一个<#!作为结束
         if (block.Type == BlockType.Member)
         {
             firstMemberFound = true;
             if (!String.IsNullOrEmpty(block.Text)) member = new CodeSnippetTypeMember(block.Text);
         }
     }
     else
     {
         // 再次遇到<#!,此时,成员代码准备结束
         if (block.Type == BlockType.Member)
         {
             firstMemberFound = false;
             if (!String.IsNullOrEmpty(block.Text)) member = new CodeSnippetTypeMember(block.Text);
         }
         else if (block.Type == BlockType.Text)
         {
             CodeMethodInvokeExpression expression = new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "Write", new CodeExpression[] { new CodePrimitiveExpression(block.Text) });
             CodeExpressionStatement statement = new CodeExpressionStatement(expression);
             using (StringWriter writer = new StringWriter())
             {
                 provider.GenerateCodeFromStatement(statement, writer, options);
                 member = new CodeSnippetTypeMember(writer.ToString());
             }
         }
         else if (block.Type == BlockType.Expression)
         {
             CodeMethodInvokeExpression expression = new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "Write", new CodeExpression[] { new CodeArgumentReferenceExpression(block.Text.Trim()) });
             CodeExpressionStatement statement = new CodeExpressionStatement(expression);
             using (StringWriter writer = new StringWriter())
             {
                 provider.GenerateCodeFromStatement(statement, writer, options);
                 member = new CodeSnippetTypeMember(writer.ToString());
             }
         }
         else if (block.Type == BlockType.Statement)
         {
             member = new CodeSnippetTypeMember(block.Text);
         }
     }
     if (member != null)
     {
         if (lineNumbers)
         {
             Boolean flag = String.IsNullOrEmpty(block.Name);
             Int32 lineNumber = (block.StartLine > 0) ? block.StartLine : 1;
             if (flag)
                 generatorType.Members.Add(new CodeSnippetTypeMember("#line " + lineNumber));
             else
                 member.LinePragma = new CodeLinePragma(block.Name, lineNumber);
             generatorType.Members.Add(member);
             if (flag) generatorType.Members.Add(new CodeSnippetTypeMember("#line default"));
         }
         else
             generatorType.Members.Add(member);
     }
     return firstMemberFound;
 }
Exemplo n.º 5
0
        private static void AddStatementWithLinePragma(Block block, CodeStatementCollection statements, CodeStatement statement)
        {
            Int32 lineNumber = (block.StartLine > 0) ? block.StartLine : 1;

            if (String.IsNullOrEmpty(block.Name))
                statements.Add(new CodeSnippetStatement("#line " + lineNumber));
            else
                statement.LinePragma = new CodeLinePragma(block.Name, lineNumber);
            statements.Add(statement);
            if (String.IsNullOrEmpty(block.Name)) statements.Add(new CodeSnippetStatement("#line default"));
        }
Exemplo n.º 6
0
 /// <summary>实例化一个指令对象</summary>
 /// <param name="name">名称</param>
 /// <param name="parameters">参数数组</param>
 /// <param name="block"></param>
 public Directive(String name, IDictionary<String, String> parameters, Block block)
 {
     _Name = name;
     _Parameters = parameters;
     _Block = block;
 }