Exemple #1
0
        private Token ReaderComment(CharIterator reader)
        {
            var isMulti = reader.NextIs('*');
            var i       = isMulti ? reader.IndexOf("*/") : reader.IndexOf("\n");
            var start   = reader.Position + 2;
            var end     = i < 0 ? reader.Length : i - 1;
            var content = reader.ReadSeek(start, end - start);

            reader.Position = i < 0 ? reader.Length : i + 1;
            return(new Token()
            {
                Type = TokenType.Comment, Content = content
            });
        }
Exemple #2
0
        private Token ReaderFor(CharIterator reader)
        {
            var end     = reader.IndexOf('}');
            var start   = reader.Position + (reader.NextIs('~') ? 2 : 4);
            var content = reader.ReadSeek(start, end - start);

            reader.Position = end;
            return(new BlockToken()
            {
                Type = TokenType.For,
                Content = content,
                Children = RenderBlockInner(reader, true)
            });
        }
Exemple #3
0
        private IList <Token> RenderBlockInner(CharIterator reader, bool checkEnd = true)
        {
            var items   = new List <Token>();
            var builder = new StringBuilder();

            while (reader.MoveNext())
            {
                if (reader.Current == '/' && reader.NextIs('*', '/'))
                {
                    items.Add(new Token()
                    {
                        Content = builder.ToString()
                    });
                    builder.Clear();
                    items.Add(ReaderComment(reader));
                    continue;
                }
                if (reader.Current == '\\' && reader.NextIs('{'))
                {
                    if (reader.ReverseCount('\\') % 2 == 1)
                    {
                        builder.Append(reader.Current);
                        continue;
                    }
                    builder.Append("{");
                    reader.MoveNext();
                    continue;
                }
                if (reader.Current == '{' && checkEnd && reader.NextIs("end}", "!}"))
                {
                    reader.Position += reader.NextIs('!') ? 2 : 4;
                    break;
                }
                if (reader.Current != '{' || !IsBlock(reader))
                {
                    builder.Append(reader.Current);
                    continue;
                }
                if (reader.NextIs("for", "~"))
                {
                    items.Add(new Token()
                    {
                        Content = builder.ToString()
                    });
                    builder.Clear();
                    items.Add(ReaderFor(reader));
                    continue;
                }
                if (reader.MinIndex("...", "}") == 0)
                {
                    items.Add(new Token()
                    {
                        Content = builder.ToString()
                    });
                    builder.Clear();
                    items.Add(ReaderIntFor(reader));
                    continue;
                }
                if (reader.MinIndex(',', '}') == 0)
                {
                    items.Add(new Token()
                    {
                        Content = builder.ToString()
                    });
                    builder.Clear();
                    items.Add(ReaderStringFor(reader));
                    continue;
                }
                if (reader.MinIndex(' ', '}') == 0)
                {
                    builder.Append(reader.Current);
                    continue;
                }
                items.Add(new Token()
                {
                    Content = builder.ToString()
                });
                builder.Clear();
                items.Add(ReaderValue(reader));
            }
            items.Add(new Token()
            {
                Content = builder.ToString()
            });
            builder.Clear();
            return(items);
        }