/**
  * @validate $syntax NotEmpty
  * @validate $extensions NotEmpty
  * @validate $formats NotEmpty
  * @ignorevalidation $filteredFiles
  * @param array $syntax
  * @param array $extensions
  * @param array $formats
  * @param array $filteredFiles
  */
 public function syntaxAction(array $syntax, array $extensions, array $formats, array $filteredFiles = [])
 {
     /** @var DocumentTemplate $document */
     $document =& $GLOBALS['TBE_TEMPLATE'];
     $resourcePath = $document->backPath . ExtensionManagementUtility::extRelPath('builder') . 'Resources/Public/';
     $pageRenderer = new PageRenderer();
     $pageRenderer->addJsFile($resourcePath . 'Javascript/jqplot.min.js');
     $pageRenderer->addJsFile($resourcePath . 'Javascript/jqplot.canvasTextRenderer.min.js');
     $pageRenderer->addJsFile($resourcePath . 'Javascript/jqplot.canvasAxisTickRenderer.min.js');
     $pageRenderer->addJsFile($resourcePath . 'Javascript/jqplot.cursor.min.js');
     $pageRenderer->addJsFile($resourcePath . 'Javascript/jqplot.categoryAxisRenderer.min.js');
     $pageRenderer->addJsFile($resourcePath . 'Javascript/jqplot.barRenderer.min.js');
     $pageRenderer->addJsFile($resourcePath . 'Javascript/jqplot.pointLabels.min.js');
     $pageRenderer->addJsFile($resourcePath . 'Javascript/plotter.js');
     $reports = [];
     $csvFormats = trim(implode(',', $formats), ',');
     foreach ($extensions as $extensionKey) {
         if (true === empty($extensionKey)) {
             continue;
         }
         $extensionFolder = ExtensionManagementUtility::extPath($extensionKey);
         $reports[$extensionKey] = [];
         foreach ($syntax as $syntaxName) {
             if (true === empty($syntaxName)) {
                 continue;
             }
             $reportsForSyntaxName = [];
             if ('php' === $syntaxName) {
                 $reportsForSyntaxName = $this->syntaxService->syntaxCheckPhpFilesInPath($extensionFolder . '/Classes');
             } elseif ('fluid' === $syntaxName) {
                 $reportsForSyntaxName = $this->syntaxService->syntaxCheckFluidTemplateFilesInPath($extensionFolder . '/Resources', $csvFormats);
             } elseif ('profile' === $syntaxName) {
                 $files = GeneralUtility::getAllFilesAndFoldersInPath([], $extensionFolder, $csvFormats);
                 if (0 === count($filteredFiles)) {
                     $filteredFiles = $files;
                 }
                 $this->view->assign('files', $files);
                 $this->view->assign('basePathLength', strlen($extensionFolder . '/Resources/Private'));
                 foreach ($files as $file) {
                     if (0 < count($filteredFiles) && false === in_array($file, $filteredFiles)) {
                         continue;
                     }
                     $shortFilename = substr($file, strlen($extensionFolder . '/Resources/Private'));
                     /** @var TemplateAnalyzer $templateAnalyzer */
                     $templateAnalyzer = $this->objectManager->get(TemplateAnalyzer::class);
                     $reportsForSyntaxName[$shortFilename] = $templateAnalyzer->analyzePathAndFilename($file);
                 }
                 $reports[$extensionKey][$syntaxName]['json'] = $this->encodeMetricsToJson($reportsForSyntaxName);
             }
             $reports[$extensionKey][$syntaxName]['reports'] = $reportsForSyntaxName;
             $reports[$extensionKey][$syntaxName]['errors'] = $this->syntaxService->countErrorsInResultCollection($reportsForSyntaxName);
         }
     }
     $this->view->assign('filteredFiles', $filteredFiles);
     $this->view->assign('reports', $reports);
     $this->view->assign('extensions', $extensions);
     $this->view->assign('formats', $formats);
     $this->view->assign('syntax', $syntax);
     $this->view->assign('view', 'Index');
 }
 /**
  * Syntax check PHP code
  *
  * Checks PHP source files in $path, if extension
  * key is also given, only files in that path relative
  * to that extension are checked.
  *
  * @param string $extension Optional extension key (if path is set too it will apply to sub-folders in extension)
  * @param string $path file or folder path (if extensionKey is included, path is relative to this extension)
  * @param boolean $verbose If TRUE outputs more information about each file check - default is to only output errors
  * @return void
  */
 public function phpsyntaxCommand($extension = null, $path = null, $verbose = false)
 {
     $verbose = (bool) $verbose;
     $this->assertEitherExtensionKeyOrPathOrBothAreProvidedOrExit($extension, $path);
     if (null !== $extension) {
         $results = $this->syntaxService->syntaxCheckPhpFilesInExtension($extension);
     } else {
         $results = $this->syntaxService->syntaxCheckPhpFilesInPath($path);
     }
     $errors = false;
     foreach ($results as $filePathAndFilename => $result) {
         $result = $this->syntaxService->syntaxCheckPhpFile($filePathAndFilename);
         if (null !== $result->getError()) {
             $errors = true;
             $this->response->setContent('[ERROR] ' . $result->getError()->getMessage() . ' (' . $result->getError()->getCode() . ')' . LF);
         }
     }
     $this->stop($results, $errors, $verbose);
 }