예제 #1
0
        public override IList<Chunk> GetChunks(VisitorContext context, string path)
        {
            context.SyntaxProvider = this;
            context.ViewPath = path;

            var sourceContext = CreateSourceContext(context.ViewPath, context.ViewFolder);
            var position = new Position(sourceContext);

            var isShadeExtension = string.Equals(Path.GetExtension(path), Constants.DotShade, StringComparison.OrdinalIgnoreCase);

            var parser = (isShadeExtension ? _grammar.OffsetNodes : _grammar.Nodes);
            var result = parser(position);
            if (result.Rest.PotentialLength() != 0)
            {
                ThrowParseException(context.ViewPath, position, result.Rest);
            }

            context.Paint = result.Rest.GetPaint();

            var nodes = result.Value;
            foreach (var visitor in BuildNodeVisitors(context))
            {
                visitor.Accept(nodes);
                nodes = visitor.Nodes;
            }

            var chunkBuilder = new ChunkBuilderVisitor(context);
            chunkBuilder.Accept(nodes);
            return chunkBuilder.Chunks;
        }
예제 #2
0
        public override IList<Chunk> GetChunks(VisitorContext context, string path)
        {
            context.SyntaxProvider = this;
            context.ViewPath = path;

            var sourceContext = CreateSourceContext(context.ViewPath, context.ViewFolder);
            var position = new Position(sourceContext);

            var result = _grammar.Nodes(position);
            if (result.Rest.PotentialLength() != 0)
            {
                ThrowParseException(context.ViewPath, position, result.Rest);
            }

            context.Paint = result.Rest.GetPaint();

            var nodes = result.Value;
            foreach (var visitor in BuildNodeVisitors(context))
            {
                visitor.Accept(nodes);
                nodes = visitor.Nodes;
            }

            var chunkBuilder = new ChunkBuilderVisitor(context);
            chunkBuilder.Accept(nodes);
            return chunkBuilder.Chunks;
        }
예제 #3
0
 public void NonVoidElementDoesNotSelfClose()
 {
     var elt = new ElementNode("span", new AttributeNode[]{ }, true);
     var visitor = new ChunkBuilderVisitor(new VisitorContext());
     visitor.Accept(elt);
     Assert.AreEqual(1, visitor.Chunks.Count());
     Assert.AreEqual("<span></span>", ((SendLiteralChunk)visitor.Chunks[0]).Text);
 }
예제 #4
0
        private List<Completion> GetSpecialNodes()
        {
            if (_specialNodeCompletions != null) return _specialNodeCompletions;

            var chunkBuilder = new ChunkBuilderVisitor(new VisitorContext());
            var specialNodes = chunkBuilder.SpecialNodeMap.Keys;
            _specialNodeCompletions = new List<Completion>();

            foreach (var nodeName in specialNodes)
                _specialNodeCompletions.Add(new Completion(nodeName, nodeName, String.Format("Spark element: '{0}'", nodeName), GetIcon(Constants.ICON_SparkElement), null));

            return _specialNodeCompletions;
        }
예제 #5
0
        public void RenderPartialContainsChunks()
        {
            var nodes = ParseNodes(
                "<foo>hello</foo>",
                new SpecialNodeVisitor(new VisitorContext { PartialFileNames = new[] { "foo" } }));

            var visitor = new ChunkBuilderVisitor(new VisitorContext());
            visitor.Accept(nodes);
            Assert.AreEqual(1, visitor.Chunks.Count);
            var renderPartial = (RenderPartialChunk)((ScopeChunk)visitor.Chunks[0]).Body[0];
            Assert.AreEqual(1, renderPartial.Body.Count);
            var literal = (SendLiteralChunk)renderPartial.Body[0];
            Assert.AreEqual("hello", literal.Text);
        }
예제 #6
0
 public void MakeLiteralChunk()
 {
     var visitor = new ChunkBuilderVisitor(new VisitorContext());
     visitor.Accept(new Node[]
                        {
                            new ElementNode("span", new List<AttributeNode>(), false),
                            new TextNode("hello".ToArray()),
                            new EntityNode("nbsp"),
                            new TextNode("world".ToArray()),
                            new EndElementNode("span")
                        });
     Assert.AreEqual(1, visitor.Chunks.Count);
     Assert.AreEqual("<span>hello&nbsp;world</span>", ((SendLiteralChunk)visitor.Chunks[0]).Text);
 }
예제 #7
0
        public override IList<Chunk> GetChunks(VisitorContext context, string path)
        {
            context.ViewPath = path;
            var sourceContext = CreateSourceContext(context.ViewPath, context.ViewFolder);
            var position = new Position(sourceContext);

            var nodes = _grammar.Nodes(position);
            if (nodes.Rest.PotentialLength() != 0)
            {
                ThrowParseException(context.ViewPath, position, nodes.Rest);
            }
            context.Paint = nodes.Rest.GetPaint();

            var chunkBuilder = new ChunkBuilderVisitor(context);
            chunkBuilder.Accept(nodes.Value);
            return chunkBuilder.Chunks;
        }
예제 #8
0
        public void RenderPartialContainsSections()
        {
            var nodes = ParseNodes(
                "<foo><section:two>beta</section:two><section:one>alpha</section:one></foo>",
                new PrefixExpandingVisitor(new VisitorContext()),
                new SpecialNodeVisitor(new VisitorContext { PartialFileNames = new[] { "foo" } }));

            var visitor = new ChunkBuilderVisitor(new VisitorContext());
            visitor.Accept(nodes);
            Assert.AreEqual(1, visitor.Chunks.Count);
            var renderPartial = (RenderPartialChunk)((ScopeChunk)visitor.Chunks[0]).Body[0];
            Assert.AreEqual(0, renderPartial.Body.Count);
            Assert.AreEqual(2, renderPartial.Sections.Count);
            Assert.That(renderPartial.Sections.ContainsKey("one"));
            Assert.That(renderPartial.Sections.ContainsKey("two"));
            var scope = (ScopeChunk)renderPartial.Sections["one"][0];
            var literal = (SendLiteralChunk)scope.Body[0];
            Assert.AreEqual("alpha", literal.Text);
        }
예제 #9
0
        public void FindLoopParameters()
        {
            var context = new VisitorContext
                              {
                                  SyntaxProvider = new DefaultSyntaxProvider(new SparkSettings())
                              };
            var nodes = ParseNodes("<for each='var x in new [] {1,2,3}'>${xIndex}${xIsLast}</for>",
                                   new SpecialNodeVisitor(context));

            var visitor = new ChunkBuilderVisitor(context);
            visitor.Accept(nodes);

            var expressionVisitor = new DetectCodeExpressionVisitor(null);
            var index = expressionVisitor.Add("xIndex");
            var count = expressionVisitor.Add("xCount");
            var isFirst = expressionVisitor.Add("xIsFirst");
            var isLast = expressionVisitor.Add("xIsLast");
            expressionVisitor.Accept(visitor.Chunks);

            Assert.IsTrue(index.Detected);
            Assert.IsFalse(count.Detected);
            Assert.IsFalse(isFirst.Detected);
            Assert.IsTrue(isLast.Detected);
        }
예제 #10
0
 public Frame(ChunkBuilderVisitor visitor,
              IList <Chunk> chunks)
     : this(visitor, chunks, null)
 {
 }
예제 #11
0
 public ViewComponentVisitor(ChunkBuilderVisitor chunkBuilderVisitor, ViewComponentInfo info)
 {
     this.chunkBuilderVisitor = chunkBuilderVisitor;
     this.info = info;
     bodyChunks = chunkBuilderVisitor.Chunks;
 }
예제 #12
0
        public void WritingDocTypes()
        {
            var justName = new DoctypeNode { Name = "html" };
            var systemName = new DoctypeNode { Name = "html2", ExternalId = new ExternalIdInfo { ExternalIdType = "SYSTEM", SystemId = "my-'system'-id" } };
            var publicName = new DoctypeNode { Name = "html3", ExternalId = new ExternalIdInfo { ExternalIdType = "PUBLIC", PublicId = "my-public-id", SystemId = "my-\"other\"system-id" } };

            var visitor = new ChunkBuilderVisitor(new VisitorContext());
            visitor.Accept(new Node[] { justName, systemName, publicName });
            Assert.AreEqual(1, visitor.Chunks.Count);
            Assert.AreEqual("<!DOCTYPE html><!DOCTYPE html2 SYSTEM \"my-'system'-id\"><!DOCTYPE html3 PUBLIC \"my-public-id\" 'my-\"other\"system-id'>", ((SendLiteralChunk)visitor.Chunks[0]).Text);
        }
예제 #13
0
 public void VoidElementsSelfClose(string tagName)
 {
     var elt = new ElementNode(tagName, new AttributeNode[] { }, true);
     var visitor = new ChunkBuilderVisitor(new VisitorContext());
     visitor.Accept(elt);
     Assert.AreEqual(1, visitor.Chunks.Count());
     Assert.AreEqual(string.Format("<{0}/>", tagName), ((SendLiteralChunk)visitor.Chunks[0]).Text);
 }
예제 #14
0
 public void SelfClosingElementWithAttributes()
 {
     var elt = new ElementNode("img", new[]
                                          {
                                              new AttributeNode("href", '"', new []{new TextNode("urn:picture".ToArray())}),
                                              new AttributeNode("alt", '"', new Node[]{new TextNode("A Picture".ToArray()), new EntityNode("amp")})
                                          }, true);
     var visitor = new ChunkBuilderVisitor(new VisitorContext());
     visitor.Accept(elt);
     Assert.AreEqual(1, visitor.Chunks.Count);
     Assert.AreEqual("<img href=\"urn:picture\" alt=\"A Picture&amp;\"/>", ((SendLiteralChunk)visitor.Chunks[0]).Text);
 }
예제 #15
0
            public Frame(ChunkBuilderVisitor visitor,
                IList<Chunk> chunks,
                IDictionary<string, IList<Chunk>> sectionChunks)
            {
                _visitor = visitor;

                _chunks = _visitor.Chunks;
                _sectionChunks = _visitor.SectionChunks;

                _visitor.Chunks = chunks;
                _visitor.SectionChunks = sectionChunks;
            }
예제 #16
0
 public Frame(ChunkBuilderVisitor visitor,
     IList<Chunk> chunks)
     : this(visitor, chunks, null)
 {
 }
예제 #17
0
        public override IList<Chunk> GetChunks(VisitorContext context, string path)
        {
            if (!_releaseMode) return base.GetChunks(context, path);
            context.SyntaxProvider = this;
            context.ViewPath = path;

            var sourceContext = CreateSourceContext(context.ViewPath, context.ViewFolder);
            var position = new Position(sourceContext);

            var result = _grammar.Nodes(position);
            if (result.Rest.PotentialLength() != 0)
            {
                ThrowParseException(context.ViewPath, position, result.Rest);
            }

            context.Paint = result.Rest.GetPaint();

            var nodes = result.Value;

            //Minification
            ((List<Node>)nodes).RemoveAll(x => (x.GetType() == typeof(CommentNode)));
            var nodesToRem = new List<Node>();
            foreach (var textNode in nodes.OfType<TextNode>())
            {
                if (String.IsNullOrEmpty(textNode.Text.Trim()))
                {
                    nodesToRem.Add(textNode);
                    continue;
                }
                textNode.Text = Regex.Replace(textNode.Text, "\\s+", " ");
            }
            ((List<Node>)nodes).RemoveAll(x => nodesToRem.Contains(x));
            foreach (var elementNode in nodes.OfType<ElementNode>())
            {
                elementNode.PreceedingWhitespace = null;
            }
            foreach (var elementNode in nodes.OfType<EndElementNode>())
            {
                elementNode.PreceedingWhitespace = null;
            }
            //end of Minification

            foreach (var visitor in BuildNodeVisitors(context))
            {
                visitor.Accept(nodes);
                nodes = visitor.Nodes;
            }

            var chunkBuilder = new ChunkBuilderVisitor(context);
            chunkBuilder.Accept(nodes);
            return chunkBuilder.Chunks;
        }
예제 #18
0
파일: SparkSyntax.cs 프로젝트: aloker/spark
        public static IList<Chunk> ParseElementChunks(string content, int position)
        {
            var node = ParseNode(content, position);
            var contentToParse = node is ElementNode ? GetElementNodeAsString((ElementNode)node) : content;

            var grammar = new MarkupGrammar();
            var visitorContext = new VisitorContext { SyntaxProvider = new DefaultSyntaxProvider(new ParserSettings()) };
            var result = grammar.Nodes(Source(contentToParse));
            var nodes = result.Value;
            foreach (var visitor in BuildChunkVisitors(visitorContext))
            {
                visitor.Accept(nodes);
                nodes = visitor.Nodes;
            }

            var chunkBuilder = new ChunkBuilderVisitor(visitorContext);
            chunkBuilder.Accept(nodes);
            var chunks = chunkBuilder.Chunks;
            return chunks;
        }