DocumentationCommand.php 3,5 КБ
Newer Older
Jagepard's avatar
update  
Jagepard включено в состав коммита
1
2
<?php

Jagepard's avatar
Jagepard включено в состав коммита
3
4
5
6
7
8
9
declare(strict_types = 1);

/**
 * @author    : Jagepard <jagepard@yandex.ru">
 * @license   https://mit-license.org/ MIT
 */

Jagepard's avatar
Jagepard включено в состав коммита
10
namespace Rudra\Markdown\Commands;
Jagepard's avatar
update  
Jagepard включено в состав коммита
11
12
13

use Rudra\Cli\ConsoleFacade as Cli;
use Rudra\Container\Facades\Rudra;
Jagepard's avatar
Jagepard включено в состав коммита
14
15
16
use Rudra\Markdown\Creators\MarkdownCreator;
use Rudra\Markdown\Creators\DocumentationCreatorInterface;
use Rudra\Markdown\Creators\HtmlCreator;
Jagepard's avatar
update  
Jagepard включено в состав коммита
17
18
19

class DocumentationCommand
{
Jagepard's avatar
Jagepard включено в состав коммита
20
21
    protected DocumentationCreatorInterface $docCreator;

Jagepard's avatar
Jagepard включено в состав коммита
22
    public function actionIndex(): void
Jagepard's avatar
update  
Jagepard включено в состав коммита
23
    {
Jagepard's avatar
Jagepard включено в состав коммита
24
25
        $reflection = new \ReflectionClass(\Composer\Autoload\ClassLoader::class);
        $dir        = dirname(dirname(dirname($reflection->getFileName())));
Jagepard's avatar
update  
Jagepard включено в состав коммита
26
27
28
29
30
31
32
33
34
35

        Cli::printer("Enter source directory: ", "cyan");
        $sourceDir = trim(fgets(fopen("php://stdin", "r")));
        $inputPath = $dir . '/' . $sourceDir;

        if (!is_dir($inputPath)) {
            throw new \InvalidArgumentException();
        }

        Cli::printer("Enter file name: ", "cyan");
Jagepard's avatar
Jagepard включено в состав коммита
36
37
38
39
40
41
42
43
        $fileName = trim(fgets(fopen("php://stdin", "r")));

        Cli::printer("Enter output type: ", "magneta");
        Cli::printer("(Html: html)[Markdowm: md]: ", "cyan");
        $fileType = trim(fgets(fopen("php://stdin", "r")));

        if ($fileType === 'html') {
            Cli::printer("Сhoose a framework: ", "magneta");
Jagepard's avatar
Jagepard включено в состав коммита
44
            Cli::printer("(Foundation: f, Uikit: ui)[Bootstrap: bsp]: ", "cyan");
Jagepard's avatar
Jagepard включено в состав коммита
45
46
47
48
49
50
51
            $frameworkType    = trim(fgets(fopen("php://stdin", "r")));
            $this->docCreator = new HtmlCreator($frameworkType);
            $outputPath       = $dir . '/' . $fileName . '.html';
        } else {
            $this->docCreator = new MarkdownCreator();
            $outputPath       = $dir . '/' . $fileName . '.md';
        }
Jagepard's avatar
update  
Jagepard включено в состав коммита
52
53

        $this->scandir($inputPath, $outputPath);
Jagepard's avatar
Jagepard включено в состав коммита
54
        $this->docCreator->createDocs($outputPath);
Jagepard's avatar
update  
Jagepard включено в состав коммита
55

Jagepard's avatar
Jagepard включено в состав коммита
56
        Cli::printer("Documentation: " . $outputPath . " created\n", "green");
Jagepard's avatar
update  
Jagepard включено в состав коммита
57
58
    }

Jagepard's avatar
Jagepard включено в состав коммита
59
    protected function scandir(string $inputPath, string $outputPath): void
Jagepard's avatar
update  
Jagepard включено в состав коммита
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
    {
        $directory = array_diff(scandir($inputPath), array('..', '.'));

        foreach($directory as $item) {
            if (str_contains($item, ".php")) {
                if (ctype_upper($item[0])) {

                    $fileContent = file_get_contents($inputPath . '/' . $item);
                    $className   = str_replace(".php", "", $item);

                    if (preg_match('/namespace[\\s]+([A-Za-z0-9\\\\]+?);/sm', $fileContent, $match)) {

                        $fullClassName = $match[1] . "\\" . $className;

                        if (class_exists($fullClassName) or interface_exists($fullClassName) or trait_exists($fullClassName)) {
Jagepard's avatar
Jagepard включено в состав коммита
75
76
                            $this->setData($fullClassName);
                            $this->setData($fullClassName, "body");
Jagepard's avatar
update  
Jagepard включено в состав коммита
77
78
79
80
81
82
83
84
85
86
87
88
89
                        }
                    }
                }
            } else {
                $subDir = $inputPath . '/' . $item;

                if (is_dir($subDir)) {   
                    $this->scandir($subDir, $outputPath);
                }
            }
        }
    }

Jagepard's avatar
Jagepard включено в состав коммита
90
    protected function setData(string $fullClassName, string $type = 'header'): void
Jagepard's avatar
update  
Jagepard включено в состав коммита
91
    {
Jagepard's avatar
Jagepard включено в состав коммита
92
        $methodName = "create" . ucfirst($type) . "String";
Jagepard's avatar
update  
Jagepard включено в состав коммита
93

Jagepard's avatar
Jagepard включено в состав коммита
94
        if (Rudra::data()->has($type)) {
Jagepard's avatar
update  
Jagepard включено в состав коммита
95
            data([
Jagepard's avatar
Jagepard включено в состав коммита
96
                $type => data($type) . $this->docCreator->{$methodName}($fullClassName)
Jagepard's avatar
update  
Jagepard включено в состав коммита
97
98
99
100
            ]);
            return;
        }

Jagepard's avatar
Jagepard включено в состав коммита
101
        data([$type => $this->docCreator->{$methodName}($fullClassName)]);
Jagepard's avatar
Jagepard включено в состав коммита
102
    }
Jagepard's avatar
update  
Jagepard включено в состав коммита
103
}