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 }); }
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) }); }
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); }