public override AstNode Process(ParserReader parser) { var reader = parser.Input; if(!reader.Read()) return null; if (reader.CurrentChar == '!') { reader.CurrentLine.EscapeLine = false; reader.Skip("!"); } else if (reader.CurrentChar == '&') { reader.CurrentLine.EscapeLine = true; reader.Skip("&"); } else if (reader.CurrentChar == '\\') { reader.Skip("\\"); } var index = reader.Index; var text = reader.ReadToEndMultiLine(); return parser.ParseText(text.TrimStart(), index); }
public void MarkTest() { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write("hi pals"); writer.Flush(); stream.Seek(0, SeekOrigin.Begin); using (TextReader reader = new StreamReader(stream)) { ParserReader parser = new ParserReader(reader); Assert.AreEqual('h', (char)parser.GetCurrent(), "MarkTest#100"); parser.Mark(); //mark a save point Assert.AreEqual('h', (char)parser.Read(), "MarkTest#200"); Assert.AreEqual('i', (char)parser.Read(), "MarkTest#300"); Assert.AreEqual(' ', (char)parser.Read(), "MarkTest#400"); Assert.AreEqual('p', (char)parser.GetCurrent(), "MarkTest#500"); Assert.AreEqual('p', (char)parser.Read(), "MarkTest#550"); Assert.AreEqual("hi p", parser.GetString(), "MarkTest#575"); parser.Reset(); // reset to the last save point Assert.AreEqual('h', (char)parser.GetCurrent(), "MarkTest#600"); parser.Mark(); Assert.AreEqual('h', (char)parser.GetCurrent(), "MarkTest#700"); parser.Unmark(); Assert.AreEqual('h', (char)parser.GetCurrent(), "MarkTest#800"); Assert.AreEqual('h', (char)parser.Read(), "MarkTest#900"); Assert.AreEqual('i', (char)parser.Read(), "MarkTest#925"); Assert.AreEqual(' ', (char)parser.GetCurrent(), "MarkTest#950"); Assert.AreEqual('h', (char)parser.GetPrevious(), "MarkTest#1000"); } }
public void EmptyStreamTests() { MemoryStream stream = new MemoryStream(); using (TextReader reader = new StreamReader(stream)) { ParserReader parser = new ParserReader(reader); Assert.AreEqual(-1, parser.Read(), "EmptyStreamTests#100"); } }
public override AstNode Process(ParserReader parser) { var reader = parser.Input; reader.Skip("-"); var code = reader.ReadToEndMultiLine(); var node = new CodeBlockNode(code); if (reader.NextLine != null && reader.NextLine.Indent > reader.CurrentLine.Indent) { node.Child = parser.ParseChildren(parser.Indent, node.Child); } return node; }
public void MarkDepthTest() { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write("hi pals"); writer.Flush(); stream.Seek(0, SeekOrigin.Begin); using (TextReader reader = new StreamReader(stream)) { ParserReader parser = new ParserReader(reader); parser.Mark(); parser.Mark(); parser.Mark(); parser.Mark(); parser.Mark();//5 parser.Mark(); parser.Mark(); parser.Mark(); parser.Mark(); parser.Mark();//10 parser.Mark(); parser.Mark(); parser.Mark(); parser.Mark(); parser.Mark();//15 parser.Mark(); parser.Mark(); parser.Mark(); parser.Mark(); parser.Mark();//20 parser.Mark(); parser.Mark(); parser.Mark(); parser.Mark(); parser.Mark();//25 parser.Mark(); parser.Mark(); parser.Mark(); parser.Mark(); parser.Mark(); //30 parser.Mark(); parser.Mark(); //32 we should get here and throw on the next mark. parser.Mark(); // } }
public override AstNode Process(ParserReader parser) { var reader = parser.Input; reader.Skip("!!!"); var node = new DocTypeNode(); if(!reader.IsEndOfStream) { reader.SkipWhiteSpaces(); node.Text = reader.ReadToEndMultiLine(); } return node; }
public override AstNode Process(ParserReader parser) { var reader = parser.Input; if(parser.Text.StartsWith("-#")) { // skip all children parser.ParseChildren(parser.Indent, null); return null; } var node = new CommentNode(); reader.Skip("/"); reader.SkipWhiteSpaces(); if(reader.CurrentChar == '[') { reader.Skip("["); node.Condition = reader.ReadWhile(c => c != ']'); } else if(!reader.IsEndOfStream) { var index = reader.Index; var text = reader.ReadToEndMultiLine(); node.Child = parser.ParseText(text, index); } if (reader.NextLine != null && reader.NextLine.Indent > reader.CurrentLine.Indent) { node.Child = parser.ParseChildren(parser.Indent, node.Child); } return node; }
public void GetStringLargerThenBuffer() { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write("hi pals"); writer.Flush(); stream.Seek(0, SeekOrigin.Begin); using (TextReader reader = new StreamReader(stream)) { ParserReader parser = new ParserReader(reader, 5); parser.Mark(); Assert.AreEqual('h', (char)parser.Read(), "GetStringLargerThenBuffer#100"); Assert.AreEqual('i', (char)parser.Read(), "GetStringLargerThenBuffer#200"); Assert.AreEqual(' ', (char)parser.Read(), "GetStringLargerThenBuffer#300"); Assert.AreEqual('p', (char)parser.Read(), "GetStringLargerThenBuffer#400"); Assert.AreEqual('a', (char)parser.Read(), "GetStringLargerThenBuffer#500"); Assert.AreEqual('l', (char)parser.Read(), "GetStringLargerThenBuffer#600"); Assert.AreEqual('s', (char)parser.Read(), "GetStringLargerThenBuffer#700"); Assert.AreEqual("hi pals", parser.GetString(), "GetStringLargerThenBuffer#800"); parser.Unmark(); } }
public override AstNode Process(ParserReader parser) { var reader = parser.Input; var attributeParser = new AttributeParser(parser); var baseIndent = parser.Indent; if(!reader.Read()) return null; var node = ReadTagNode(reader); while(!reader.IsEndOfStream) switch(reader.CurrentChar) { case '/': { reader.Skip("/"); node.AutoClose = true; break; } case '#': { reader.Skip("#"); //Todo: should be a port of output var attribute = node.Attributes.Find(a => a.Name.Equals("id", StringComparison.InvariantCultureIgnoreCase)); if(attribute == null) { attribute = new AttributeNode("id"); node.Attributes.Add(attribute); } attribute.Value = parser.ParseText(reader.ReadNameEscaped(), reader.Index); continue; } case '.': { reader.Skip("."); node.Attributes.Add(new AttributeNode("class") { Value = parser.ParseText(reader.ReadNameEscaped(), reader.Index) }); continue; } case '&': reader.CurrentLine.EscapeLine = true; reader.Skip("&"); break; case '!': reader.CurrentLine.EscapeLine = false; reader.Skip("!"); break; case '=': { reader.Skip("="); reader.SkipWhiteSpaces(); node.Child = new CodeNode(reader.ReadToEndMultiLine(), reader.CurrentLine.EscapeLine); break; } case '(': { node.Attributes.AddRange(attributeParser.ParseHtmlStyle()); break; } case '{': { node.Attributes.AddRange(attributeParser.ParseRubyStyle()); break; } default: { var index = reader.Index; var text = reader.ReadToEndMultiLine(); node.Child = parser.ParseText(text.TrimStart(), index); break; } } if (reader.NextLine != null && reader.NextLine.Indent > reader.CurrentLine.Indent) { node.Child = parser.ParseChildren(baseIndent, node.Child); } node.EndInfo = reader.SourceInfo; return node; }
public abstract AstNode Process(ParserReader reader);
public override AstNode Process(ParserReader parser) { var reader = parser.Input; var attributeParser = new AttributeParser(parser); var baseIndent = parser.Indent; bool isPartial = false; if (!reader.Read()) return null; string name; if (reader.CurrentChar == '_') { reader.Skip("_"); name = "contentplaceholder"; isPartial = true; } else { reader.Skip("@"); name = reader.ReadName(); isPartial = false; } var node = new MetaNode(name); reader.SkipWhiteSpaces(); if (isPartial && (reader.CurrentChar != null)) { node.Name = "partialcontent"; node.Value = reader.ReadWhile(c => !Char.IsWhiteSpace(c) && c != '(' && c != '{'); } else { node.Value = "Main"; } while (!reader.IsEndOfStream) { switch (reader.CurrentChar) { case '=': { if (!isPartial) { reader.Skip("="); reader.SkipWhiteSpaces(); switch (reader.CurrentChar) { case '\'': reader.Skip("'"); node.Value = reader.ReadWhile(c => c != '\''); reader.Skip("'"); break; case '"': reader.Skip("\""); node.Value = reader.ReadWhile(c => c != '"'); reader.Skip("\""); break; default: node.Value = reader.ReadWhile(c => !Char.IsWhiteSpace(c) && c != '(' && c != '{'); break; } } else { throw new ParserException(reader, "'=' is not allowed in partial definitions"); } break; } case '(': { node.Attributes.AddRange(attributeParser.ParseHtmlStyle(false)); break; } case '{': { node.Attributes.AddRange(attributeParser.ParseRubyStyle(false)); break; } default: { var index = reader.Index; var text = reader.ReadToEndMultiLine(); node.Child = parser.ParseText(text.TrimStart(), index); break; } } reader.SkipWhiteSpaces(); } if (reader.NextLine != null && reader.NextLine.Indent > reader.CurrentLine.Indent) { node.Child = parser.ParseChildren(baseIndent, node.Child); } node.EndInfo = reader.SourceInfo; if (!_node.Metadata.ContainsKey(name)) _node.Metadata[name] = new List<MetaNode>(); _node.Metadata[name].Add(node); return node; }