From 1d2afa097fe9cffdf37322571c277ec186c520b2 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 19 Nov 2010 13:20:22 +0100 Subject: [PATCH] added the spaceless tag --- CHANGELOG | 1 + doc/02-Twig-for-Template-Designers.markdown | 11 ++++ lib/Twig/Extension/Core.php | 1 + lib/Twig/Node/Spaceless.php | 41 ++++++++++++++++ lib/Twig/TokenParser/Spaceless.php | 45 ++++++++++++++++++ .../Twig/Tests/Fixtures/tags/spaceless/simple.test | 12 +++++ test/Twig/Tests/Node/SpacelessTest.php | 50 ++++++++++++++++++++ 7 files changed, 161 insertions(+), 0 deletions(-) create mode 100644 lib/Twig/Node/Spaceless.php create mode 100644 lib/Twig/TokenParser/Spaceless.php create mode 100644 test/Twig/Tests/Fixtures/tags/spaceless/simple.test create mode 100644 test/Twig/Tests/Node/SpacelessTest.php diff --git a/CHANGELOG b/CHANGELOG index 4401c17..02eae89 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -13,6 +13,7 @@ Backward incompatibilities: (the old behavior is still possible by adding the "only" keyword) * Moved Exceptions to Twig_Error_* (Twig_SyntaxError/Twig_RuntimeError are now Twig_Error_Syntax/Twig_Error_Runtime) + * added the spaceless tag * removed trim_blocks option * added support for is*() methods for attributes (foo.bar now looks for foo->getBar() or foo->isBar()) * changed all exceptions to extend Twig_Error diff --git a/doc/02-Twig-for-Template-Designers.markdown b/doc/02-Twig-for-Template-Designers.markdown index 341dee7..4a9d801 100644 --- a/doc/02-Twig-for-Template-Designers.markdown +++ b/doc/02-Twig-for-Template-Designers.markdown @@ -170,6 +170,17 @@ The first newline after a template tag is removed automatically (like in PHP.) Whitespace is not further modified by the template engine, so each whitespace (spaces, tabs, newlines etc.) is returned unchanged. +Use the `spaceless` tag to remove whitespace between HTML tags: + + [twig] + {% spaceless %} +
+ foo +
+ {% endspaceless %} + + {# output will be
foo
#} + Escaping -------- diff --git a/lib/Twig/Extension/Core.php b/lib/Twig/Extension/Core.php index c061c1f..84b45ff 100644 --- a/lib/Twig/Extension/Core.php +++ b/lib/Twig/Extension/Core.php @@ -29,6 +29,7 @@ class Twig_Extension_Core extends Twig_Extension new Twig_TokenParser_Macro(), new Twig_TokenParser_Import(), new Twig_TokenParser_Set(), + new Twig_TokenParser_Spaceless(), ); } diff --git a/lib/Twig/Node/Spaceless.php b/lib/Twig/Node/Spaceless.php new file mode 100644 index 0000000..c7fddda --- /dev/null +++ b/lib/Twig/Node/Spaceless.php @@ -0,0 +1,41 @@ + + */ +class Twig_Node_Spaceless extends Twig_Node +{ + public function __construct(Twig_NodeInterface $body, $lineno, $tag = 'spaceless') + { + parent::__construct(array('body' => $body), array(), $lineno, $tag); + } + + /** + * Compiles the node to PHP. + * + * @param Twig_Compiler A Twig_Compiler instance + */ + public function compile($compiler) + { + $compiler + ->addDebugInfo($this) + ->write("ob_start();\n") + ->subcompile($this->getNode('body')) + ->write("echo trim(preg_replace('/>\s+<', ob_get_clean()));\n") + ; + } +} diff --git a/lib/Twig/TokenParser/Spaceless.php b/lib/Twig/TokenParser/Spaceless.php new file mode 100644 index 0000000..bd533c2 --- /dev/null +++ b/lib/Twig/TokenParser/Spaceless.php @@ -0,0 +1,45 @@ +getLine(); + + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + $body = $this->parser->subparse(array($this, 'decideSpacelessEnd'), true); + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + + return new Twig_Node_Spaceless($body, $lineno, $this->getTag()); + } + + public function decideSpacelessEnd($token) + { + return $token->test('endspaceless'); + } + + /** + * Gets the tag name associated with this token parser. + * + * @param string The tag name + */ + public function getTag() + { + return 'spaceless'; + } +} diff --git a/test/Twig/Tests/Fixtures/tags/spaceless/simple.test b/test/Twig/Tests/Fixtures/tags/spaceless/simple.test new file mode 100644 index 0000000..dd06dec --- /dev/null +++ b/test/Twig/Tests/Fixtures/tags/spaceless/simple.test @@ -0,0 +1,12 @@ +--TEST-- +"spaceless" tag removes whites between HTML tags +--TEMPLATE-- +{% spaceless %} + +
foo
+ +{% endspaceless %} +--DATA-- +return array() +--EXPECT-- +
foo
diff --git a/test/Twig/Tests/Node/SpacelessTest.php b/test/Twig/Tests/Node/SpacelessTest.php new file mode 100644 index 0000000..55892f4 --- /dev/null +++ b/test/Twig/Tests/Node/SpacelessTest.php @@ -0,0 +1,50 @@ +
foo
', 0))); + $node = new Twig_Node_Spaceless($body, 0); + + $this->assertEquals($body, $node->getNode('body')); + } + + /** + * @covers Twig_Node_Spaceless::compile + * @dataProvider getTests + */ + public function testCompile($node, $source, $environment = null) + { + parent::testCompile($node, $source, $environment); + } + + public function getTests() + { + $body = new Twig_Node(array(new Twig_Node_Text('
foo
', 0))); + $node = new Twig_Node_Spaceless($body, 0); + + return array( + array($node, <<
foo
"; +echo trim(preg_replace('/>\s+<', ob_get_clean())); +EOF + ), + ); + } +} -- 1.7.2.5