Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Adds a linter command for templates
  • Loading branch information
marc.weistroff committed Apr 7, 2012
1 parent 85535de commit 1d7e9d9
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG-2.1.md
Expand Up @@ -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

Expand Down
87 changes: 87 additions & 0 deletions src/Symfony/Bundle/TwigBundle/Command/LintCommand.php
@@ -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.

Copy link
@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.