Version 1
[yaffs-website] / vendor / drupal / console / src / Command / Develop / GenerateDocCheatsheetCommand.php
diff --git a/vendor/drupal/console/src/Command/Develop/GenerateDocCheatsheetCommand.php b/vendor/drupal/console/src/Command/Develop/GenerateDocCheatsheetCommand.php
new file mode 100644 (file)
index 0000000..474ab6e
--- /dev/null
@@ -0,0 +1,266 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Console\Command\Develop\GenerateDocCheatsheetCommand.
+ *
+ * @TODO: use twig
+ */
+
+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\Console\Command\Command;
+use Drupal\Console\Core\Style\DrupalStyle;
+use Knp\Snappy\Pdf;
+use Drupal\Console\Core\Command\Shared\CommandTrait;
+
+class GenerateDocCheatsheetCommand extends Command
+{
+    use CommandTrait;
+
+    private $singleCommands = [
+      'about',
+      'chain',
+      'help',
+      'list',
+      'server'
+    ];
+
+    //exclude: yaml, translation
+    private $orderCommands = [
+      'cache',
+      'chain',
+      'config',
+      'database',
+      'create',
+      'cron',
+      'image',
+      'container',
+      'locale',
+      'migrate',
+      'module',
+      'multisite',
+      'rest',
+      'settings',
+      'views',
+      'router',
+      'state',
+      'user',
+      'site',
+      'update',
+      'theme'
+
+    ];
+
+    private $logoUrl = 'http://drupalconsole.com/themes/custom/drupalconsole/assets/src/images/drupal-console.png';
+
+    private $wkhtmltopdfPath = "/usr/bin/wkhtmltopdf";
+
+    /**
+     * GenerateDocCheatsheetCommand constructor.
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setName('generate:doc:cheatsheet')
+            ->setDescription($this->trans('commands.generate.doc.cheatsheet.description'))
+            ->addOption(
+                'path',
+                null,
+                InputOption::VALUE_OPTIONAL,
+                $this->trans('commands.generate.doc.cheatsheet.options.path')
+            )
+            ->addOption(
+                'wkhtmltopdf',
+                null,
+                InputOption::VALUE_OPTIONAL,
+                $this->trans('commands.generate.doc.cheatsheet.options.wkhtmltopdf')
+            );
+        ;
+    }
+
+    /**
+     * {@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.gitbook.messages.missing_path')
+            );
+
+            return 1;
+        }
+
+        // $wkhtmltopdfPath is overwritable by command option
+
+        if ($input->getOption('wkhtmltopdf')) {
+            $this->wkhtmltopdfPath = $input->getOption('wkhtmltopdf');
+        }
+
+        $application = $this->getApplication();
+        $command_list = [];
+
+        foreach ($this->singleCommands as $single_command) {
+            $command = $application->find($single_command);
+            $command_list['none'][] = [
+                'name' => $command->getName(),
+                'description' => $command->getDescription(),
+            ];
+        }
+
+        $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(),
+                    ];
+                }
+            }
+        }
+
+        if (!empty($command_list)) {
+            $this->prepareHtml($command_list, $path, $io);
+        }
+    }
+
+
+    /**
+     * Generates (programatically, not with twig) the HTML to convert to PDF
+     *
+     * @param array  $array_content
+     * @param string $path
+     */
+    protected function prepareHtml($array_content, $path, $io)
+    {
+        $str  = '<meta charset="UTF-8" />';
+        $str .= "<center><div style='font-size: 12px;'>Drupal Console cheatsheet</div></center>";
+
+        // 1st page
+        foreach ($this->orderCommands as $command) {
+            $str .= $this->doTable($command, $array_content[$command]);
+        }
+
+        // 2nd page
+        $str .= "<br/><br/><table style='width:99%;page-break-before:always;padding-top:10%'><tr><td><img src='".
+              $this->logoUrl ."' width='150px' style='float:left'/></td>";
+
+        $str .= "<td style='vertical-align: bottom;'><h1>DrupalConsole Cheatsheet</h1></td></tr></table><br/><br/>";
+
+        $str .= $this->doTable("generate", $array_content["generate"]);
+        $str .= $this->doTable("miscelaneous", $array_content["none"]);
+
+        $this->doPdf($str, $path, $io);
+    }
+
+
+    /**
+     * Generates the pdf with Snappy
+     *
+     * @param string $content
+     * @param string $path
+     *
+     * @return string
+     */
+    protected function doPdf($content, $path, $io)
+    {
+        $snappy = new Pdf();
+        //@TODO: catch exception if binary path doesn't exist!
+        $snappy->setBinary($this->wkhtmltopdfPath);
+        $snappy->setOption('orientation', "Landscape");
+        $snappy->generateFromHtml($content, "/" .$path . 'dc-cheatsheet.pdf');
+        $io->success("cheatsheet generated at /" .$path ."/dc-cheatsheet.pdf");
+
+        // command execution ends here
+    }
+
+    /**
+   * Encloses text in <td> tags
+   *
+   * @param string $str
+   *
+   * @return string
+   */
+    public function td($str, $mode = null)
+    {
+        if ("header" == $mode) {
+            return "<td colspan='2' style='background-color:whitesmoke;font-size: 12px;'><b>" . strtoupper($str) . "</b></td>";
+        } else {
+            if ("body" == $mode) {
+                return "<td style='font-size: 11px;width=35%'><i>". $str. "</i></td>";
+            } else {
+                return "<td>" . $str . "</td>";
+            }
+        }
+    }
+
+    /**
+   * Encloses text in <tr> tags
+   *
+   * @param string $str
+   * @param array  $element
+   *
+   * @return string
+   */
+    public function tr($str)
+    {
+        return "<tr>" . $str . "</tr>";
+    }
+
+    /**
+   * Encloses text in <table> tag
+   *
+   * @param string $key_element - header
+   * @param array  $element     - command, description
+   *
+   * @return string
+   */
+    public function doTable($key_element, $element)
+    {
+        $str = "<table cellspacing='0' border='0' style='float:left;width:49%;'>";
+        $str .= $this->td($key_element, "header");
+
+        foreach ($element as $section) {
+            $str .= $this->tr($this->td($section["name"], "body") . $this->td($section["description"], "body"));
+        }
+
+        return $str . "</table>\n\r";
+    }
+}