diff --git a/CHANGELOG-2.1.md b/CHANGELOG-2.1.md index 6bbec4b093..779f93be69 100644 --- a/CHANGELOG-2.1.md +++ b/CHANGELOG-2.1.md @@ -148,6 +148,7 @@ To get the diff between two versions, go to https://github.com/symfony/symfony/c ### TwigBundle * added the real template name when an error occurs in a Twig template + * added the twig:lint command that will validate a Twig template syntax. ### WebProfilerBundle diff --git a/src/Symfony/Bundle/TwigBundle/Command/LintCommand.php b/src/Symfony/Bundle/TwigBundle/Command/LintCommand.php new file mode 100644 index 0000000000..8ed303829b --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/Command/LintCommand.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\TwigBundle\Command; + +use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Command that will validate your template syntax and output encountered errors. + * + * @author Marc Weistroff + */ +class LintCommand extends ContainerAwareCommand +{ + protected function configure() + { + $this + ->setName('twig:lint') + ->setDescription('Lints a template and outputs eventual errors.') + ->addArgument('filename') + ->setHelp(<<%command.name% command lints a template and outputs to stdout +the first encountered syntax error. + +php %command.full_name% filename + +The command will get the contents of "filename" and will validates its syntax. + +cat filename | php %command.full_name% + +The command will get the template contents from stdin and will validates its syntax. + +This command will return these error codes: + - 1 if template is invalid + - 2 if file doesn't exists or stdin is empty. +EOF + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $twig = $this->getContainer()->get('twig'); + $template = null; + $filename = $input->getArgument('filename'); + + if ($filename && !is_readable($filename)) { + $output->writeln(sprintf('File %s is not readable', $filename)); + + return 2; + } + + if ($filename) { + $template = file_get_contents($filename); + } else { + if (0 !== ftell(STDIN)) { + $output->writeln(sprintf('Please provide a filename or pipe template content to stdin.')); + + return 2; + } + while (!feof(STDIN)) { + $template .= fread(STDIN, 1024); + } + } + + try { + $twig->parse($twig->tokenize($template)); + } catch(\Twig_Error_Syntax $e) { + $output->writeln($e->getMessage()); + + return 1; + } + + $output->writeln("Template's syntax is valid."); + } +} +