Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
0
        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);
            }
        }