private void ParseStart(RawTokenEnumerator enumerator, ref FlatTokenParserState state) { var peek = enumerator.Peek(4); if (peek == "---\n") { state = FlatTokenParserState.InFrontMatter; enumerator.Next(4); return; } peek = enumerator.Peek(5); if (peek == "---\r\n") { state = FlatTokenParserState.InFrontMatter; enumerator.Next(4); // Next() will trim /r/n return; } state = FlatTokenParserState.InPreamble; }
private void ParseFrontMatter(RawTokenEnumerator enumerator, ref StringBuilder frontMatterName, ref FlatTokenParserState state) { var peek = enumerator.Peek(4); if (peek == "---\n") { state = FlatTokenParserState.InPreamble; enumerator.Next(4); return; } peek = enumerator.Peek(5); if (peek == "---\r\n") { state = FlatTokenParserState.InPreamble; enumerator.Next(4); // Next() will trim \r\n return; } var next = enumerator.Next(); switch (next) { case "#": state = FlatTokenParserState.InFrontMatterComment; break; case "\n": break; default: state = FlatTokenParserState.InFrontMatterOption; frontMatterName.Append(next); break; } }
private void ParseTokenName(RawTemplate template, ref RawToken token, RawTokenEnumerator enumerator, ref FlatTokenParserState state) { var next = enumerator.Next(); var peek = enumerator.Peek(); switch (next) { case "{": throw new ParsingException($"Unexpected character '{{' in token '{token.Name}'", enumerator); case "}": template.Tokens.Add(token); token = new RawToken(); state = FlatTokenParserState.InPreamble; break; case "$": token.TerminateOnNewline = true; switch (peek) { case "?": case "*": case "}": case ":": break; default: throw new ParsingException($"Invalid character '{peek}' in token '{token.Name}'", enumerator); } break; case "?": token.Optional = true; switch (peek) { case "$": case "*": case "}": case ":": break; default: throw new ParsingException($"Invalid character '{peek}' in token '{token.Name}'", enumerator); } break; case "*": token.Repeating = true; token.Optional = true; switch (peek) { case "$": case "?": case "}": case ":": break; default: throw new ParsingException($"Invalid character '{peek}' in token '{token.Name}'", enumerator); } break; case ":": state = FlatTokenParserState.InDecorator; break; default: if (token.Name == null) { token.Name = string.Empty; } if (ValidTokenNameCharacters.Contains(next)) { token.Name += next; } else { throw new ParsingException($"Invalid character '{next}' in token '{token.Name}'", enumerator); } break; } }