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; }
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; }
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; }
/// <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; }
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")); }
/// <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; }