[ ...] */ require __DIR__ . '/../vendor/autoload.php'; use Twig\Environment; use Twig\Loader\ArrayLoader; use Twig\TwigFunction; use Twig\TwigFilter; use Twig\Source; $files = array_slice($argv, 1); if (!$files) { fwrite(STDERR, "usage: php scripts/twig-lint.php ...\n"); exit(2); } $twig = new Environment(new ArrayLoader([]), ['cache' => false, 'strict_variables' => false]); // Stub any custom function/filter (custPerm, finance, etc.) so parsing doesn't // reject them as unknown. $twig->registerUndefinedFunctionCallback(function ($name) { return new TwigFunction($name, function () { return ''; }); }); $twig->registerUndefinedFilterCallback(function ($name) { return new TwigFilter($name, function ($v) { return $v; }); }); $fail = 0; foreach ($files as $file) { $code = file_get_contents($file); if ($code === false) { fwrite(STDERR, "MISSING $file\n"); $fail++; continue; } try { $twig->parse($twig->tokenize(new Source($code, $file))); echo "OK $file\n"; } catch (\Twig\Error\Error $e) { fwrite(STDERR, "SYNTAX $file: " . $e->getMessage() . " (line " . $e->getTemplateLine() . ")\n"); $fail++; } } exit($fail > 0 ? 1 : 0);