private void ParsePreamble(ref PreToken token, PreTokenEnumerator enumerator, ref FlatTokenParserState state, ref StringBuilder tokenContent) { var next = enumerator.Next(); switch (next) { case "{": if (enumerator.Peek() == "{") { token.AppendPreamble("{"); enumerator.Next(); } else { token.Location = enumerator.Location.Clone(); tokenContent.Append("{"); state = FlatTokenParserState.InTokenName; } break; case "}": if (enumerator.Peek() == "}") { token.AppendPreamble("}"); enumerator.Next(); break; } throw new ParsingException($"Unescaped character '}}' in template.", enumerator); default: token.AppendPreamble(next); break; } }
private void AppendToken(PreTemplate template, PreToken token, ref StringBuilder tokenContent, TokenizerOptions options) { token.Content = tokenContent.ToString(); token.Id = template.Tokens.Count + 1; token.IsNull = string.Compare(token.Name, "null", StringComparison.InvariantCultureIgnoreCase) == 0; if (options.TrimPreambleBeforeNewLine) { token.TrimPreambleBeforeNewLine(); } if (options.TerminateOnNewline) { token.TerminateOnNewline = true; } tokenContent.Clear(); var preamble = GetRepeatingMultilinePreamble(token); if (string.IsNullOrEmpty(preamble) == false && token.Repeating) { token.Repeating = false; template.Tokens.Add(token); var repeat = new PreToken { Optional = true, Repeating = true, TerminateOnNewline = token.TerminateOnNewline, Content = token.Content }; repeat.AppendName(token.Name); repeat.AppendPreamble(preamble); repeat.AppendDecorators(token.Decorators); repeat.Id = template.Tokens.Count + 1; repeat.DependsOnId = token.Id; template.Tokens.Add(repeat); } else { template.Tokens.Add(token); } }