Permalink
Browse files

Adds a linter command for templates

  • Loading branch information...
marc.weistroff
marc.weistroff committed Apr 6, 2012
1 parent 85535de commit 1d7e9d975390b42dc73cb9138c6dd09df085be1b
Showing with 88 additions and 0 deletions.
  1. +1 −0 CHANGELOG-2.1.md
  2. +87 −0 src/Symfony/Bundle/TwigBundle/Command/LintCommand.php
View
@@ -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
@@ -0,0 +1,87 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * 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 <marc.weistroff@sensiolabs.com>
+ */
+class LintCommand extends ContainerAwareCommand
+{
+ protected function configure()
+ {
+ $this
+ ->setName('twig:lint')
+ ->setDescription('Lints a template and outputs eventual errors.')
+ ->addArgument('filename')
+ ->setHelp(<<<EOF
+the <info>%command.name%</info> command lints a template and outputs to stdout
+the first encountered syntax error.
+
+<info>php %command.full_name% filename</info>
+
+The command will get the contents of "filename" and will validates its syntax.
+
+<info>cat filename | php %command.full_name%</info>
+
+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('<error>File %s is not readable</error>', $filename));
+
+ return 2;

This comment has been minimized.

Show comment Hide comment
@SowingSadness

SowingSadness May 15, 2012

Hardcode literals, is it good?
Are usefull using constants, mb?

return LintCommand::FILE_DOES_NOT_EXISTS

@SowingSadness

SowingSadness May 15, 2012

Hardcode literals, is it good?
Are usefull using constants, mb?

return LintCommand::FILE_DOES_NOT_EXISTS

+ }
+
+ if ($filename) {
+ $template = file_get_contents($filename);
+ } else {
+ if (0 !== ftell(STDIN)) {
+ $output->writeln(sprintf('<error>Please provide a filename or pipe template content to stdin.</error>'));
+
+ 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("<info>Template's syntax is valid.</info>");
+ }
+}
+

0 comments on commit 1d7e9d9

Please sign in to comment.