protected function execute(InputInterface $input, OutputInterface $output) { // This command must be run from the project root directory. A reasonable(ly hacky) way to check this is to check for // the existence of the composer.json file. if (!file_exists(getcwd() . '/composer.json')) { $output->writeln('<error>This command must be run from the project\'s root directory.</error>'); return; } // Given a fully qualified namespace, convert \ to / and make a file path with the md extension $namespaceToPath = Lambda::compose(Strings::concat('.md'), Strings::join('/'), Strings::split('\\')); // Given a fully qualified namespace, create the containing directory $namespaceToDir = Lambda::compose(Strings::join('/'), Arrays::init(), Strings::split('\\')); // A tree that represents the organization of the modules we're generating documentation for $moduleDirectory = []; // For each module, we're going to generate a documentation file and place it in the auto-generate folder in the // root docs directory. We're going to build up the module directory as we go foreach ($input->getArgument('modules') as $module) { $moduleDoc = FunctionDocFactory::createModuleDocFromName($module); $moduleDocMarkdownDirectory = getcwd() . '/docs/auto-generate/' . $namespaceToDir($module); $moduleDocMarkdownFileLocation = getcwd() . '/docs/auto-generate/' . $namespaceToPath($module); $moduleDirectory = Lens::setL(Lens::pathLensSafe(Strings::split('\\', $module)), 'auto-generate/' . $namespaceToPath($module), $moduleDirectory); // Sort the functions in the docs alphabetically $functions = Arrays::sort(function ($fA, $fB) { return $fA->properName() <=> $fB->properName(); }, $moduleDoc->getFunctionDocs()); // For each function in this module, add the markdown content to a buffer $buffer = ''; foreach ($functions as $function) { $buffer .= $this->generateFunctionDocMarkdown($function); } // Make sure the location we're putting it exists if (!is_dir($moduleDocMarkdownDirectory)) { // 777 all day every day mkdir($moduleDocMarkdownDirectory, 0777, true); } // Then put it there file_put_contents($moduleDocMarkdownFileLocation, $buffer); } // Write the mkdocs.yml file in the project directory file_put_contents(getcwd() . '/mkdocs.yml', $this->generateMkdocsYaml($moduleDirectory)); }