Version 1
[yaffs-website] / vendor / drupal / console / src / Command / Develop / GenerateDocDashCommand.php
diff --git a/vendor/drupal/console/src/Command/Develop/GenerateDocDashCommand.php b/vendor/drupal/console/src/Command/Develop/GenerateDocDashCommand.php
new file mode 100644 (file)
index 0000000..82f7f58
--- /dev/null
@@ -0,0 +1,279 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Console\Command\Develop\GenerateDocDashCommand.
+ */
+
+namespace Drupal\Console\Command\Develop;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Filesystem\Exception\IOException;
+use Symfony\Component\Filesystem\Filesystem;
+use Symfony\Component\Console\Command\Command;
+use Drupal\Console\Core\Style\DrupalStyle;
+use Drupal\Console\Core\Command\Shared\CommandTrait;
+use Drupal\Console\Core\Utils\TwigRenderer;
+use Drupal\Console\Core\Utils\ConfigurationManager;
+
+class GenerateDocDashCommand extends Command
+{
+    use CommandTrait;
+
+    /**
+     * @var TwigRenderer $renderer
+     */
+    protected $renderer;
+    protected $consoleRoot;
+    /**
+     * @constant Contents of the plist file required by the docset format.
+     */
+    const PLIST = <<<PLIST
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>CFBundleIdentifier</key>
+       <string>drupalconsole</string>
+       <key>CFBundleName</key>
+       <string>Drupal Console</string>
+       <key>DocSetPlatformFamily</key>
+       <string>drupalconsole</string>
+       <key>isDashDocset</key>
+       <true/>
+       <key>dashIndexFilePath</key>
+    <string>index.html</string>
+</dict>
+</plist>
+PLIST;
+
+    private $single_commands = [
+      'about',
+      'chain',
+      'drush',
+      'help',
+      'init',
+      'list',
+      'self-update'
+    ];
+
+    /**
+     * @var SQLite3 Controller for the sqlite db required by the docset format.
+     */
+    private $sqlite;
+
+    /**
+     * @var ConfigurationManager $configurationManager
+     */
+    protected $configurationManager;
+
+    /**
+     * GenerateDocDashCommand constructor.
+     *
+     * @param $renderer
+     * @param $consoleRoot
+     */
+    public function __construct(TwigRenderer $renderer, $consoleRoot)
+    {
+        $this->renderer = $renderer;
+        $this->consoleRoot = $consoleRoot;
+        parent::__construct();
+    }
+
+
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setName('generate:doc:dash')
+            ->setDescription($this->trans('commands.generate.doc.dash.description'))
+            ->addOption(
+                'path',
+                null,
+                InputOption::VALUE_OPTIONAL,
+                $this->trans('commands.generate.doc.dash.options.path')
+            );
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $io = new DrupalStyle($input, $output);
+
+        $path = null;
+        if ($input->hasOption('path')) {
+            $path = $input->getOption('path');
+        }
+
+        if (!$path) {
+            $io->error(
+                $this->trans('commands.generate.doc.dash.messages.missing_path')
+            );
+
+            return 1;
+        }
+
+        // Setup the docset structure
+        $this->initDocset($path);
+
+        $application = $this->getApplication();
+        $command_list = [];
+
+        foreach ($this->single_commands as $single_command) {
+            $command = $application->find($single_command);
+            $command_list['none'][] = [
+              'name' => $command->getName(),
+              'description' => $command->getDescription(),
+            ];
+            $this->renderCommand($command, $path, $this->renderer);
+            $this->registerCommand($command, $path);
+        }
+
+        $namespaces = $application->getNamespaces();
+        sort($namespaces);
+
+        $namespaces = array_filter(
+            $namespaces, function ($item) {
+                return (strpos($item, ':') <= 0);
+            }
+        );
+
+        foreach ($namespaces as $namespace) {
+            $commands = $application->all($namespace);
+
+            usort(
+                $commands, function ($cmd1, $cmd2) {
+                    return strcmp($cmd1->getName(), $cmd2->getName());
+                }
+            );
+
+            foreach ($commands as $command) {
+                if ($command->getModule() == 'Console') {
+                    $command_list[$namespace][] = [
+                      'name' => $command->getName(),
+                      'description' => $command->getDescription(),
+                    ];
+                    $this->renderCommand($command, $path, $this->renderer);
+                    $this->registerCommand($command, $path);
+                }
+            }
+        }
+
+        $input = $application->getDefinition();
+        $options = $input->getOptions();
+        $arguments = $input->getArguments();
+        $parameters = [
+          'command_list' => $command_list,
+          'options' => $options,
+          'arguments' => $arguments,
+          'css_path' => 'style.css'
+        ];
+
+        // Set the index page
+        $this->renderFile(
+            'dash/index.html.twig',
+            $path . '/DrupalConsole.docset/Contents/Resources/Documents/index.html',
+            $parameters,
+            null,
+            $this->renderer
+        );
+    }
+
+    private function renderCommand($command, $path, $renderer)
+    {
+        $input = $command->getDefinition();
+        $options = $input->getOptions();
+        $arguments = $input->getArguments();
+
+        $parameters = [
+          'options' => $options,
+          'arguments' => $arguments,
+          'command' => $command->getName(),
+          'description' => $command->getDescription(),
+          'aliases' => $command->getAliases(),
+          'css_path' => '../style.css'
+        ];
+
+        $this->renderFile(
+            'dash/generate-doc.html.twig',
+            $path . '/DrupalConsole.docset/Contents/Resources/Documents/commands/'
+            . str_replace(':', '-', $command->getName()) . '.html',
+            $parameters,
+            null,
+            $renderer
+        );
+    }
+
+    private function registerCommand($command)
+    {
+        try {
+            $statement = $this->sqlite->prepare('INSERT OR IGNORE INTO searchIndex(name, type, path) VALUES (:name, :type, :path)');
+            $statement->bindValue(':name', $command->getName(), SQLITE3_TEXT);
+            $statement->bindValue(':type', 'Command', SQLITE3_TEXT);
+            $statement->bindValue(
+                ':path',
+                'commands/'
+                . str_replace(':', '-', $command->getName()) . '.html',
+                SQLITE3_TEXT
+            );
+            $statement->execute();
+        } catch (\Exception $e) {
+            throw $e;
+        }
+    }
+
+    private function renderFile(
+        $template,
+        $target,
+        $parameters,
+        $renderer
+    ) {
+        $filesystem = new Filesystem();
+        try {
+            $filesystem->dumpFile(
+                $target,
+                $renderer->render($template, $parameters)
+            );
+        } catch (IOException $e) {
+            throw $e;
+        }
+    }
+
+    private function initDocset($path)
+    {
+        try {
+            $filesystem = new Filesystem();
+            $filesystem->mkdir(
+                $path . '/DrupalConsole.docset/Contents/Resources/Documents/',
+                0777
+            );
+            $filesystem->dumpFile(
+                $path . '/DrupalConsole.docset/Contents/Info.plist',
+                self::PLIST
+            );
+
+            $filesystem->copy(
+                $this->consoleRoot . '/resources/drupal-console.png',
+                $path . '/DrupalConsole.docset/icon.png'
+            );
+            $filesystem->copy(
+                $this->consoleRoot . '/resources/dash.css',
+                $path . '/DrupalConsole.docset/Contents/Resources/Documents/style.css'
+            );
+            // create the required sqlite db
+            $this->sqlite = new \SQLite3($path . '/DrupalConsole.docset/Contents/Resources/docSet.dsidx');
+            $this->sqlite->query("CREATE TABLE searchIndex(id INTEGER PRIMARY KEY, name TEXT, type TEXT, path TEXT)");
+            $this->sqlite->query("CREATE UNIQUE INDEX anchor ON searchIndex (name, type, path)");
+        } catch (\Exception $e) {
+            throw $e;
+        }
+    }
+}