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);
        }
Exemple #2
0
        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");
            }
        }
Exemple #3
0
        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;
        }
Exemple #5
0
        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(); //
            }
        }
Exemple #6
0
        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;
        }
Exemple #7
0
        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;
        }
Exemple #8
0
        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();
            }
        }
Exemple #9
0
        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;
        }
Exemple #10
0
 public abstract AstNode Process(ParserReader reader);
Exemple #11
0
        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;
        }