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; }
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; }
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); }
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; }
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); }
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 world</span>", ((SendLiteralChunk)visitor.Chunks[0]).Text); }
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; }
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); }
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); }
public Frame(ChunkBuilderVisitor visitor, IList <Chunk> chunks) : this(visitor, chunks, null) { }
public ViewComponentVisitor(ChunkBuilderVisitor chunkBuilderVisitor, ViewComponentInfo info) { this.chunkBuilderVisitor = chunkBuilderVisitor; this.info = info; bodyChunks = chunkBuilderVisitor.Chunks; }
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); }
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); }
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&\"/>", ((SendLiteralChunk)visitor.Chunks[0]).Text); }
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; }
public Frame(ChunkBuilderVisitor visitor, IList<Chunk> chunks) : this(visitor, chunks, null) { }
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; }
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; }