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

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

/**
Коротков Данила's avatar
Коротков Данила включено в состав коммита
6
7
8
9
10
11
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/.
 *
 * @author  Korotkov Danila (Jagepard) <jagepard@yandex.ru>
 * @license https://mozilla.org/MPL/2.0/  MPL-2.0
Jagepard's avatar
Jagepard включено в состав коммита
12
13
 */

Коротков Данила's avatar
Коротков Данила включено в состав коммита
14
namespace Rudra\Markdown\Command;
Jagepard's avatar
update  
Jagepard включено в состав коммита
15
16

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

Коротков Данила's avatar
Коротков Данила включено в состав коммита
22
class MakeDocumentation
Jagepard's avatar
update  
Jagepard включено в состав коммита
23
{
Коротков Данила's avatar
update    
Коротков Данила включено в состав коммита
24
    private DocumentationCreatorInterface $docCreator;
Jagepard's avatar
Jagepard включено в состав коммита
25

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

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

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

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

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

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

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

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

Коротков Данила's avatar
update    
Коротков Данила включено в состав коммита
63
64
65
66
67
68
69
70
    /**
     * 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 включено в состав коммита
71
72
73
74
75
76
77
78
79
80
81
82
83
    {
        $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 включено в состав коммита
84
85
                            $this->setData($fullClassName);
                            $this->setData($fullClassName, "body");
Jagepard's avatar
update  
Jagepard включено в состав коммита
86
87
88
89
90
91
92
93
94
95
96
97
98
                        }
                    }
                }
            } else {
                $subDir = $inputPath . '/' . $item;

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

Коротков Данила's avatar
update    
Коротков Данила включено в состав коммита
99
100
101
102
103
104
105
106
    /**
     * 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 включено в состав коммита
107
    {
Jagepard's avatar
Jagepard включено в состав коммита
108
        $methodName = "create" . ucfirst($type) . "String";
Jagepard's avatar
update  
Jagepard включено в состав коммита
109

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

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