DocumentationCommand.php 3,9 КБ
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

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

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

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

Коротков Данила's avatar
Коротков Данила включено в состав коммита
27
        Cli::printer("Enter source directory: ", "magneta");
Jagepard's avatar
update  
Jagepard включено в состав коммита
28
29
30
31
32
33
34
        $sourceDir = trim(fgets(fopen("php://stdin", "r")));
        $inputPath = $dir . '/' . $sourceDir;

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

Коротков Данила's avatar
Коротков Данила включено в состав коммита
35
        Cli::printer("Enter file name: ", "magneta");
Jagepard's avatar
Jagepard включено в состав коммита
36
37
38
        $fileName = trim(fgets(fopen("php://stdin", "r")));

        Cli::printer("Enter output type: ", "magneta");
Коротков Данила's avatar
Коротков Данила включено в состав коммита
39
        Cli::printer("(Html: html)[Markdowm: md]: ", "magneta");
Jagepard's avatar
Jagepard включено в состав коммита
40
41
42
43
        $fileType = trim(fgets(fopen("php://stdin", "r")));

        if ($fileType === 'html') {
            Cli::printer("Сhoose a framework: ", "magneta");
Коротков Данила's avatar
Коротков Данила включено в состав коммита
44
            Cli::printer("(Foundation: f, Uikit: ui)[Bootstrap: bsp]: ", "magneta");
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

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

Коротков Данила's avatar
update    
Коротков Данила включено в состав коммита
59
60
61
62
63
64
65
66
    /**
     * Recursively scans a directory for PHP classes and processes files with uppercase filenames.
     * 
     * @param  string $inputPath
     * @param  string $outputPath
     * @return void
     */
    private function scandir(string $inputPath, string $outputPath): void
Jagepard's avatar
update  
Jagepard включено в состав коммита
67
68
69
70
71
72
73
74
75
76
77
78
79
    {
        $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 включено в состав коммита
80
81
                            $this->setData($fullClassName);
                            $this->setData($fullClassName, "body");
Jagepard's avatar
update  
Jagepard включено в состав коммита
82
83
84
85
86
87
88
89
90
91
92
93
94
                        }
                    }
                }
            } else {
                $subDir = $inputPath . '/' . $item;

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

Коротков Данила's avatar
update    
Коротков Данила включено в состав коммита
95
96
97
98
99
100
101
102
    /**
     * Generates and appends documentation content for a class based on the specified type.
     * 
     * @param  string $fullClassName
     * @param  string $type
     * @return void
     */
    private function setData(string $fullClassName, string $type = 'header'): void
Jagepard's avatar
update  
Jagepard включено в состав коммита
103
    {
Jagepard's avatar
Jagepard включено в состав коммита
104
        $methodName = "create" . ucfirst($type) . "String";
Jagepard's avatar
update  
Jagepard включено в состав коммита
105

Jagepard's avatar
Jagepard включено в состав коммита
106
        if (Rudra::shared()->has($type)) {
Jagepard's avatar
update  
Jagepard включено в состав коммита
107
            data([
Jagepard's avatar
Jagepard включено в состав коммита
108
                $type => data($type) . $this->docCreator->{$methodName}($fullClassName)
Jagepard's avatar
update  
Jagepard включено в состав коммита
109
110
111
112
            ]);
            return;
        }

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