protected static void AppendText(string text, TemplateClassBuilder builder, TemplateOptions options) { var encodeHtml = options.EncodeHtml; if (text.StartsWith("!")) { text = text.Substring(1, text.Length - 1); text.TrimStart(' '); encodeHtml = false; } if (text.StartsWith("&")) { text = text.Substring(1, text.Length - 1); text.TrimStart(' '); encodeHtml = true; } var parser = new ExpressionStringParser(text); parser.Parse(); foreach (var expressionStringToken in parser.ExpressionStringTokens) { if (expressionStringToken.IsExpression) { builder.AppendCode(expressionStringToken.Value, encodeHtml); } else { builder.AppendOutput(expressionStringToken.Value); } } }
public override BlockClosingAction Render(ViewSourceReader viewSourceReader, TemplateOptions options, TemplateClassBuilder builder) { var inputLine = viewSourceReader.CurrentInputLine; builder.AppendOutput( inputLine.Indent ); builder.AppendCode( inputLine.NormalizedText.Trim(), false ); builder.AppendOutputLine(); return EmptyClosingAction; }
public override BlockClosingAction Render(ViewSourceReader viewSourceReader, TemplateOptions options, TemplateClassBuilder builder) { var currentInputLine = viewSourceReader.CurrentInputLine; var input = PreprocessLine(currentInputLine); var match = _tagRegex.Match(input); if (!match.Success) { SyntaxException.Throw(currentInputLine, ErrorParsingTag, currentInputLine); } var groups = match.Groups; var tagName = groups[1].Value.Replace("\\", string.Empty); var isWhitespaceSensitive = _whitespaceSensitiveTags.Contains(tagName); var openingTag = string.Format("{0}<{1}", currentInputLine.Indent, tagName); var closingTag = string.Format("</{0}>", tagName); builder.AppendOutput(openingTag); ParseAndRenderAttributes(builder, match); var action = groups[6].Value.Trim(); if (string.Equals("/", action) || options.IsAutoClosingTag(tagName)) { builder.AppendOutput(" />"); builder.AppendOutputLine(); return EmptyClosingAction; } var content = groups[7].Value.Trim(); if (string.IsNullOrEmpty(content)) { builder.AppendOutput(">"); builder.AppendOutputLine(); closingTag = currentInputLine.Indent + closingTag; } else { if ((content.Length > 50) || ("=" == action) || ("&=" == action) || ("!=" == action)) { builder.AppendOutput(">"); if (!isWhitespaceSensitive) { builder.AppendOutputLine(); builder.AppendOutput(viewSourceReader.NextIndent); } if (string.Equals("=", action)) { builder.AppendCode(content, options.EncodeHtml); } else if (string.Equals("&=", action)) { builder.AppendCode(content, true); } else if (string.Equals("!=", action)) { builder.AppendCode(content, false); } else { AppendText(content, builder, options); } if (!isWhitespaceSensitive) { builder.AppendOutputLine(); closingTag = currentInputLine.Indent + closingTag; } } else { builder.AppendOutput(">"); AppendText(content, builder, options); if ((currentInputLine.IndentCount + 1) == viewSourceReader.NextInputLine.IndentCount) { builder.AppendOutputLine(); closingTag = currentInputLine.Indent + closingTag; } } } return () => { builder.AppendOutput(closingTag); builder.AppendOutputLine(); }; }