public void CollapsesPreviousWhiteSpace()
		{
			var factory = new Factory();
			
			// "Hello {{~test}}"
			var document = factory.Document(
				factory.Text("Hello"),
				factory.WhiteSpace(1),
				factory.Expression(
					factory.MetaCode("{{", T.OpenTag),
					factory.MetaCode("~", T.Tilde),
					factory.Span(SpanKind.Expression, factory.Symbol("this", T.Identifier)),
					factory.MetaCode("}}", T.CloseTag)));

			factory = new Factory();

			// "Hello{{~test}}"
			var expected = factory.Document(
				factory.Text("Hello"),
				factory.WhiteSpace(1, collapsed: true),
				factory.Expression(
					factory.MetaCode("{{", T.OpenTag),
					factory.MetaCode("~", T.Tilde),
					factory.Span(SpanKind.Expression, factory.Symbol("this", T.Identifier)),
					factory.MetaCode("}}", T.CloseTag)));

			var visitor = new WhiteSpaceCollapsingParserVisitor();
			visitor.VisitBlock(document);

			var builder = new StringBuilder();
			var comparer = new EquivalanceComparer(builder, 0);

			Assert.True(comparer.Equals(expected, document), builder.ToString());
		}
Пример #2
0
		/// <inheritdoc />
		public Func<object, string> Compile(string template)
		{
			var document = CreateDocument(template);

			// Collapse any whitespace.
			var whitespace = new WhiteSpaceCollapsingParserVisitor();
			document.Accept(whitespace);

			return (model) =>
			       {
				       using (var writer = new StringWriter())
				       {
					       var render = new RenderingParserVisitor(writer, model, ModelMetadataProvider ?? new DefaultModelMetadataProvider())
					                    {
						                    Service = this
					                    };

					       // Render the document.
					       document.Accept(render);

					       return writer.GetStringBuilder().ToString();
				       }
			       };
		}
		public void CollapsesWhiteSpaceInParentBlocks()
		{
			var factory = new Factory();

			// "Message:{{#this~}} Hello {{~/this~}} There"
			var document = factory.Document(
				factory.Text("Message:"),
				factory.Tag("this",
					factory.TagElement("this",
						factory.MetaCode("{{", T.OpenTag),
						factory.MetaCode("#", T.Hash),
						factory.Expression(factory.Parameter("this")),
						factory.MetaCode("~", T.Tilde),
						factory.MetaCode("}}", T.CloseTag)),
					factory.WhiteSpace(1),
					factory.Text("Hello"),
					factory.WhiteSpace(1),
						factory.TagElement("this",
							factory.MetaCode("{{", T.OpenTag),
							factory.MetaCode("~", T.Tilde),
							factory.MetaCode("/", T.Slash),
							factory.Expression(factory.Parameter("this")),
							factory.MetaCode("~", T.Tilde),
							factory.MetaCode("}}", T.CloseTag))),
				factory.WhiteSpace(1),
				factory.Text("There"));

			factory = new Factory();

			// "Message:{{#this~}}Hello{{~/this~}}There"
			var expected = factory.Document(
				factory.Text("Message:"),
				factory.Tag("this",
					factory.TagElement("this",
						factory.MetaCode("{{", T.OpenTag),
						factory.MetaCode("#", T.Hash),
						factory.Expression(factory.Parameter("this")),
						factory.MetaCode("~", T.Tilde),
						factory.MetaCode("}}", T.CloseTag)),
					factory.WhiteSpace(1, collapsed: true),
					factory.Text("Hello"),
					factory.WhiteSpace(1, collapsed: true),
						factory.TagElement("this",
							factory.MetaCode("{{", T.OpenTag),
							factory.MetaCode("~", T.Tilde),
							factory.MetaCode("/", T.Slash),
							factory.Expression(factory.Parameter("this")),
							factory.MetaCode("~", T.Tilde),
							factory.MetaCode("}}", T.CloseTag))),
				factory.WhiteSpace(1, collapsed: true),
				factory.Text("There"));

			var visitor = new WhiteSpaceCollapsingParserVisitor();
			visitor.VisitBlock(document);

			var builder = new StringBuilder();
			var comparer = new EquivalanceComparer(builder, 0);

			Assert.True(comparer.Equals(expected, document), builder.ToString());
		}