Exemple #1
0
        private void ParseDecorator(RawTemplate template, ref RawToken token, RawTokenEnumerator enumerator, ref FlatTokenParserState state, ref RawTokenDecorator decorator)
        {
            var next = enumerator.Next();

            if (string.IsNullOrWhiteSpace(next))
            {
                return;
            }

            switch (next)
            {
            case "}":
                token.Decorators.Add(decorator);
                template.Tokens.Add(token);
                token     = new RawToken();
                decorator = new RawTokenDecorator();
                state     = FlatTokenParserState.InPreamble;
                break;

            case ",":
                token.Decorators.Add(decorator);
                decorator = new RawTokenDecorator();
                break;

            case "(":
                state = FlatTokenParserState.InDecoratorArgument;
                break;

            default:
                decorator.AppendName(next);
                break;
            }
        }
Exemple #2
0
        private void ParseDecoratorArgumentRunOff(RawTokenEnumerator enumerator, ref FlatTokenParserState state, ref RawTokenDecorator decorator, ref string argument)
        {
            var next = enumerator.Next();

            if (string.IsNullOrWhiteSpace(next))
            {
                return;
            }

            switch (next)
            {
            case ",":
                state = FlatTokenParserState.InDecoratorArgument;
                break;

            case ")":
                state = FlatTokenParserState.InDecorator;
                break;

            default:
                throw new TokenizerException($"Unexpected character: '{next}'");
            }
        }
Exemple #3
0
        private void ParseDecoratorArgumentInDoubleQuotes(RawTokenEnumerator enumerator, ref FlatTokenParserState state, ref RawTokenDecorator decorator, ref string argument)
        {
            var next = enumerator.Next();

            switch (next)
            {
            case @"""":
                decorator.Args.Add(argument);
                argument = string.Empty;
                state    = FlatTokenParserState.InDecoratorArgumentRunOff;
                break;

            default:
                argument += next;
                break;
            }
        }
Exemple #4
0
        private void ParseDecoratorArgument(RawTokenEnumerator enumerator, ref FlatTokenParserState state, ref RawTokenDecorator decorator, ref string argument)
        {
            var next = enumerator.Next();

            if (string.IsNullOrWhiteSpace(argument) &&
                string.IsNullOrWhiteSpace(next))
            {
                return;
            }

            switch (next)
            {
            case ")":
                decorator.Args.Add(argument.Trim());
                argument = string.Empty;
                state    = FlatTokenParserState.InDecorator;
                break;

            case "'":
                if (string.IsNullOrWhiteSpace(argument))
                {
                    argument = string.Empty;
                    state    = FlatTokenParserState.InDecoratorArgumentSingleQuotes;
                }
                else
                {
                    argument += next;
                }
                break;

            case @"""":
                if (string.IsNullOrWhiteSpace(argument))
                {
                    argument = string.Empty;
                    state    = FlatTokenParserState.InDecoratorArgumentDoubleQuotes;
                }
                else
                {
                    argument += next;
                }
                break;

            case ",":
                decorator.Args.Add(argument.Trim());
                argument = string.Empty;
                state    = FlatTokenParserState.InDecoratorArgument;
                break;

            default:
                argument += next;
                break;
            }
        }
Exemple #5
0
        public RawTemplate Parse(string pattern, TokenizerOptions options)
        {
            var template = new RawTemplate();

            template.Options = options.Clone();

            var enumerator = new RawTokenEnumerator(pattern);

            if (enumerator.IsEmpty)
            {
                return(template);
            }

            var state            = FlatTokenParserState.AtStart;
            var token            = new RawToken();
            var decorator        = new RawTokenDecorator();
            var argument         = string.Empty;
            var frontMatterName  = new StringBuilder();
            var frontMatterValue = new StringBuilder();

            while (enumerator.IsEmpty == false)
            {
                switch (state)
                {
                case FlatTokenParserState.AtStart:
                    ParseStart(enumerator, ref state);
                    break;

                case FlatTokenParserState.InFrontMatter:
                    ParseFrontMatter(enumerator, ref frontMatterName, ref state);
                    break;

                case FlatTokenParserState.InFrontMatterComment:
                    ParseFrontMatterComment(enumerator, ref state);
                    break;

                case FlatTokenParserState.InFrontMatterOption:
                    ParseFrontMatterOption(enumerator, ref frontMatterName, ref state);
                    break;

                case FlatTokenParserState.InFrontMatterOptionValue:
                    ParseFrontMatterOptionValue(template, enumerator, ref frontMatterName, ref frontMatterValue, ref state);
                    break;

                case FlatTokenParserState.InPreamble:
                    ParsePreamble(ref token, enumerator, ref state);
                    break;

                case FlatTokenParserState.InTokenName:
                    ParseTokenName(template, ref token, enumerator, ref state);
                    break;

                case FlatTokenParserState.InDecorator:
                    ParseDecorator(template, ref token, enumerator, ref state, ref decorator);
                    break;

                case FlatTokenParserState.InDecoratorArgument:
                    ParseDecoratorArgument(enumerator, ref state, ref decorator, ref argument);
                    break;

                case FlatTokenParserState.InDecoratorArgumentSingleQuotes:
                    ParseDecoratorArgumentInSingleQuotes(enumerator, ref state, ref decorator, ref argument);
                    break;

                case FlatTokenParserState.InDecoratorArgumentDoubleQuotes:
                    ParseDecoratorArgumentInDoubleQuotes(enumerator, ref state, ref decorator, ref argument);
                    break;

                case FlatTokenParserState.InDecoratorArgumentRunOff:
                    ParseDecoratorArgumentRunOff(enumerator, ref state, ref decorator, ref argument);
                    break;


                default:
                    throw new TokenizerException($"Unknown FlatTokenParserState: {state}");
                }
            }

            // Append current token if it has contents
            // Note: allow empty token values, as these will serve to truncate the last
            // token in the template
            if (string.IsNullOrWhiteSpace(token.Preamble) == false)
            {
                template.Tokens.Add(token);
            }

            return(template);
        }