/**
  * @param string $extensionKey
  * @param string $p1
  * @param string $p2
  * @param string $p3
  * @param string $p4
  * @param string $p5
  * @return string
  * @return void
  */
 public function indexAction($extensionKey = NULL, $p1 = NULL, $p2 = NULL, $p3 = NULL, $p4 = NULL, $p5 = NULL)
 {
     if (!$extensionKey && !$p1 && !$p2 && !$p3 && !$p4 && !$p5) {
         list($extensionKey, $p1, $p2, $p3, $p4, $p5) = array_pad((array) $this->getBackendUserAuthentication()->getModuleData('tools_schema_arguments'), 6, NULL);
     } else {
         $this->getBackendUserAuthentication()->pushModuleData('tools_schema_arguments', array($extensionKey, $p1, $p2, $p3, $p4, $p5));
     }
     if (NULL === $extensionKey) {
         $extensionKey = 'TYPO3.Fluid';
     }
     list($vendor, $legacyExtensionKey) = $this->schemaService->getRealExtensionKeyAndVendorFromCombinedExtensionKey($extensionKey);
     $version = ExtensionManagementUtility::getExtensionVersion($extensionKey);
     $namespaceName = str_replace('_', '', $legacyExtensionKey);
     $namespaceName = strtolower($namespaceName);
     $namespaceAlias = str_replace('_', '', $extensionKey);
     if (isset($this->extensionKeyToNamespaceMap[$legacyExtensionKey])) {
         $namespaceAlias = $this->extensionKeyToNamespaceMap[$legacyExtensionKey];
     }
     $segments = array($p1, $p2, $p3, $p4, $p5);
     $segments = $this->trimPathSegments($segments);
     $arguments = $this->segmentsToArguments($extensionKey, $segments);
     $extensionName = GeneralUtility::underscoredToUpperCamelCase($legacyExtensionKey);
     $extensionKeys = $this->detectExtensionsContainingViewHelpers();
     $displayHeadsUp = FALSE;
     if (isset($this->extensionKeyToNamespaceMap[$namespaceName])) {
         $namespaceName = $this->extensionKeyToNamespaceMap[$namespaceName];
     }
     $tree = $this->buildTreeFromClassPath(ExtensionManagementUtility::extPath($legacyExtensionKey, 'Classes/ViewHelpers/'));
     $viewHelperArguments = array();
     $node = NULL;
     $docComment = '';
     $className = implode('/', $segments);
     if (TRUE === ExtensionManagementUtility::isLoaded($legacyExtensionKey)) {
         $extensionPath = ExtensionManagementUtility::extPath($legacyExtensionKey);
         if (!empty($className)) {
             $className = $vendor . '\\' . $extensionName . '\\ViewHelpers\\' . str_replace('/', '\\', $className);
             $viewHelperArguments = $this->objectManager->get($className)->prepareArguments();
             $reflection = new ClassReflection($className);
             $docComment = $reflection->getDocComment();
             $this->docCommentParser->parseDocComment($docComment);
             $docComment = $this->docCommentParser->getDescription();
             $docComment = trim($docComment, "/ \n");
         } else {
             $readmeFile = $extensionPath . 'Classes/ViewHelpers/README.md';
             if (TRUE === file_exists($readmeFile)) {
                 $readmeFile = file_get_contents($readmeFile);
             } else {
                 unset($readmeFile);
             }
         }
     }
     $variables = array('view' => 'Index', 'action' => 'index', 'readmeFile' => $readmeFile, 'history' => $history, 'name' => end($segments), 'schemaFile' => $relativeSchemaFile, 'keys' => array(), 'namespaceUrl' => $targetNamespaceUrl, 'displayHeadsUp' => $displayHeadsUp, 'namespaceName' => $namespaceName, 'namespaceAlias' => $namespaceAlias, 'className' => $className, 'ns' => $namespaceName, 'isFile' => class_exists($className), 'arguments' => $arguments, 'segments' => $segments, 'markdownBlacklisted' => in_array($extensionKey, $this->markdownBlacklistedExtensionKeys), 'viewHelperArguments' => $viewHelperArguments, 'docComment' => $docComment, 'tree' => $tree, 'version' => $version, 'extensionKey' => $extensionKey, 'extensionKeys' => $extensionKeys, 'extensionName' => $extensionName);
     $this->view->assignMultiple($variables);
 }
 /**
  * Renders browsable schema for ViewHelpers in extension selected in
  * plugin onfiguration. Has a maximum namespace depth of five levels
  * from the Tx_ExtensionKey_ViewHelpers location which should fit
  * all reasonable setups.
  *
  * @param string $extensionKey
  * @param string $version
  * @param string $p1
  * @param string $p2
  * @param string $p3
  * @param string $p4
  * @param string $p5
  * @return string
  * @route NoMatch('bypass')
  */
 public function schemaAction($extensionKey = NULL, $version = NULL, $p1 = NULL, $p2 = NULL, $p3 = NULL, $p4 = NULL, $p5 = NULL)
 {
     if (NULL === $extensionKey) {
         $extensionKey = $this->getExtensionKeySetting();
         if (NULL === $extensionKey) {
             $extensionKey = 'TYPO3.Fluid';
         }
         if (NULL === $version) {
             $version = 'master';
         }
     }
     list($vendor, $extensionKey) = $this->schemaService->getRealExtensionKeyAndVendorFromCombinedExtensionKey($extensionKey);
     $schemaFile = $this->getXsdStoragePathSetting() . $extensionKey . '-' . $version . '.xsd';
     $schemaFile = GeneralUtility::getFileAbsFileName($schemaFile);
     $namespaceName = str_replace('_', '', $extensionKey);
     $namespaceName = strtolower($namespaceName);
     $namespaceAlias = str_replace('_', '', $extensionKey);
     if (isset($this->extensionKeyToNamespaceMap[$extensionKey])) {
         $namespaceAlias = $this->extensionKeyToNamespaceMap[$extensionKey];
     }
     $relativeSchemaFile = substr($schemaFile, strlen(GeneralUtility::getFileAbsFileName('.')) - 1);
     $segments = array($p1, $p2, $p3, $p4, $p5);
     $segments = $this->trimPathSegments($segments);
     if (TRUE === empty($version)) {
         $version = 'master';
     }
     $arguments = $this->segmentsToArguments($extensionKey, $version, $segments);
     $extensionName = GeneralUtility::underscoredToLowerCamelCase($extensionKey);
     $extensionName = ucfirst($extensionName);
     $extensionKeys = $this->getExtensionKeysSetting();
     $versions = $this->getVersionsByExtensionKey($extensionKey);
     $displayHeadsUp = FALSE;
     if (isset($this->extensionKeyToNamespaceMap[$namespaceName])) {
         $namespaceName = $this->extensionKeyToNamespaceMap[$namespaceName];
     }
     list($tree, $node, $viewHelperArguments, $docComment, $targetNamespaceUrl) = $this->getSchemaData($extensionKey, $version, $segments);
     $gitCommand = '/usr/bin/git';
     if (FALSE === file_exists($gitCommand)) {
         $gitCommand = '/usr/local/bin/git';
     }
     $className = implode('/', $segments);
     if (TRUE === ExtensionManagementUtility::isLoaded($extensionKey)) {
         if (empty($className)) {
             $extensionPath = ExtensionManagementUtility::extPath($extensionKey);
             $readmeFile = $extensionPath . 'Classes/ViewHelpers/README.md';
             if (TRUE === file_exists($readmeFile)) {
                 $readmeFile = file_get_contents($readmeFile);
             } else {
                 unset($readmeFile);
             }
         }
     }
     $variables = array('action' => 'schema', 'readmeFile' => $readmeFile, 'name' => end($segments), 'schemaFile' => $relativeSchemaFile, 'keys' => array(), 'namespaceUrl' => $targetNamespaceUrl, 'displayHeadsUp' => $displayHeadsUp, 'namespaceName' => $namespaceName, 'namespaceAlias' => $namespaceAlias, 'className' => $className, 'ns' => $namespaceName, 'isFile' => NULL !== $node, 'arguments' => $arguments, 'segments' => $segments, 'markdownBlacklisted' => in_array($extensionKey, $this->markdownBlacklistedExtensionKeys), 'viewHelperArguments' => $viewHelperArguments, 'docComment' => $docComment, 'tree' => $tree, 'version' => $version, 'versions' => $versions, 'extensionKey' => $extensionKey, 'extensionKeys' => $extensionKeys, 'extensionName' => $extensionName, 'showJumpLinks' => TRUE);
     $this->view->assignMultiple($variables);
 }
 /**
  * @param string $extensionKey
  * @param string $xsdNamespace
  * @param boolean $enablePhpTypes
  * @return string
  */
 protected function generate($extensionKey, $xsdNamespace = NULL, $enablePhpTypes = FALSE, $enableDocumentation = TRUE)
 {
     if ($xsdNamespace === NULL) {
         $xsdExtensionKeySegment = FALSE !== strpos($extensionKey, '.') ? str_replace('.', '/', $extensionKey) : $extensionKey;
         $xsdNamespace = sprintf('http://typo3.org/ns/%s/ViewHelpers', $xsdExtensionKeySegment);
     }
     $xsdSchema = $this->schemaService->generateXsd($extensionKey, $xsdNamespace, $enablePhpTypes, $enableDocumentation);
     if (function_exists('tidy_repair_string') === TRUE) {
         $xsdSchema = tidy_repair_string($xsdSchema, array('output-xml' => TRUE, 'input-xml' => TRUE));
     }
     return $xsdSchema;
 }
 /**
  * @dataProvider getRealExtensionKeyAndVendorFromCombinedExtensionKeyTestValues
  * @param string $input
  * @param string $expected
  */
 public function testGetRealExtensionKeyAndVendorFromCombinedExtensionKey($input, $expected)
 {
     $instance = new SchemaService();
     $result = $instance->getRealExtensionKeyAndVendorFromCombinedExtensionKey($input);
     $this->assertEquals($expected, $result);
 }
Example #5
0
 /**
  * Renders browsable schema for ViewHelpers in extension selected in
  * plugin onfiguration. Has a maximum namespace depth of five levels
  * from the Tx_ExtensionKey_ViewHelpers location which should fit
  * all reasonable setups.
  *
  * @param string $extensionKey
  * @param string $version
  * @param string $p1
  * @param string $p2
  * @param string $p3
  * @param string $p4
  * @param string $p5
  * @return string
  * @route NoMatch('bypass')
  */
 public function schemaAction($extensionKey = NULL, $version = NULL, $p1 = NULL, $p2 = NULL, $p3 = NULL, $p4 = NULL, $p5 = NULL)
 {
     if (NULL === $extensionKey) {
         $extensionKey = $this->getExtensionKeySetting();
         if (NULL === $version) {
             $version = 'master';
         }
     }
     list($vendor, $extensionKey) = $this->schemaService->getRealExtensionKeyAndVendorFromCombinedExtensionKey($extensionKey);
     $schemaFile = $this->getXsdStoragePathSetting() . $extensionKey . '-' . $version . '.xsd';
     $schemaFile = GeneralUtility::getFileAbsFileName($schemaFile);
     $schemaFileExists = file_exists($schemaFile);
     $requestArguments = array('extensionKey' => $extensionKey, 'version' => 'master', 'p1' => $p1, 'p2' => $p2, 'p3' => $p3, 'p4' => $p4, 'p5' => $p5);
     $namespaceName = str_replace('_', '', $extensionKey);
     $namespaceName = strtolower($namespaceName);
     $namespaceAlias = str_replace('_', '', $extensionKey);
     if (isset($this->extensionKeyToNamespaceMap[$extensionKey])) {
         $namespaceAlias = $this->extensionKeyToNamespaceMap[$extensionKey];
     }
     $relativeSchemaFile = substr($schemaFile, strlen(GeneralUtility::getFileAbsFileName('.')) - 1);
     $segments = array($p1, $p2, $p3, $p4, $p5);
     $segments = $this->trimPathSegments($segments);
     if (TRUE === empty($version)) {
         $version = 'master';
     }
     $arguments = $this->segmentsToArguments($extensionKey, $version, $segments);
     $extensionName = GeneralUtility::underscoredToLowerCamelCase($extensionKey);
     $extensionName = ucfirst($extensionName);
     $extensionKeys = $this->getExtensionKeysSetting();
     $versions = $this->getVersionsByExtensionKey($extensionKey);
     $displayHeadsUp = FALSE;
     if (isset($this->extensionKeyToNamespaceMap[$namespaceName])) {
         $namespaceName = $this->extensionKeyToNamespaceMap[$namespaceName];
     }
     list($tree, $node, $viewHelperArguments, $docComment, $targetNamespaceUrl) = $this->getSchemaData($extensionKey, $version, $segments);
     $gitCommand = '/usr/bin/git';
     if (FALSE === file_exists($gitCommand)) {
         $gitCommand = '/usr/local/bin/git';
     }
     $className = implode('/', $segments);
     if (TRUE === ExtensionManagementUtility::isLoaded($extensionKey)) {
         $extensionPath = ExtensionManagementUtility::extPath($extensionKey);
         if (FALSE === empty($className)) {
             $relativeFilename = 'Classes/ViewHelpers/' . $className . '.php';
             $historyCacheFile = GeneralUtility::getFileAbsFileName('typo3temp/schemaker-git-log-' . str_replace('/', '-', $relativeFilename) . '.log');
             if (TRUE === file_exists($historyCacheFile) && time() - 21600 < filemtime($historyCacheFile)) {
                 $history = file_get_contents($historyCacheFile);
             } else {
                 $command = 'cd ' . $extensionPath . ' && ' . $gitCommand . ' log --reverse ' . $relativeFilename;
                 $history = shell_exec($command);
                 $history = preg_replace('/(([a-z0-9\\.^\\s]+)@([a-z0-9\\.^\\s]+))/u', '*****@$3', $history);
                 GeneralUtility::writeFile($historyCacheFile, $history);
             }
         } else {
             $readmeFile = $extensionPath . 'Classes/ViewHelpers/README.md';
             if (TRUE === file_exists($readmeFile)) {
                 $readmeFile = file_get_contents($readmeFile);
             } else {
                 unset($readmeFile);
             }
         }
     }
     $variables = array('readmeFile' => $readmeFile, 'history' => $history, 'name' => end($segments), 'schemaFile' => $relativeSchemaFile, 'keys' => array(), 'namespaceUrl' => $targetNamespaceUrl, 'displayHeadsUp' => $displayHeadsUp, 'namespaceName' => $namespaceName, 'namespaceAlias' => $namespaceAlias, 'className' => $className, 'tagExample' => $this->buildTagExample($namespaceAlias, implode('.', array_map('lcfirst', $segments)), $viewHelperArguments, FALSE), 'inlineExample' => $this->buildInlineExample($namespaceAlias, implode('.', array_map('lcfirst', $segments)), $viewHelperArguments), 'ns' => $namespaceName, 'isFile' => NULL !== $node, 'arguments' => $arguments, 'segments' => $segments, 'markdownBlacklisted' => in_array($extensionKey, $this->markdownBlacklistedExtensionKeys), 'viewHelperArguments' => $viewHelperArguments, 'docComment' => $docComment, 'tree' => $tree, 'version' => $version, 'versions' => $versions, 'extensionKey' => $extensionKey, 'extensionKeys' => $extensionKeys, 'extensionName' => $extensionName);
     $this->view->assignMultiple($variables);
 }