Completed
Push — master ( bb9cc9...361c05 )
by Andrii
02:32
created

Readme::renderBadges()   A

Complexity

Conditions 6
Paths 11

Size

Total Lines 19
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

Changes 0
Metric Value
cc 6
eloc 12
nc 11
nop 0
dl 0
loc 19
rs 9.2222
c 0
b 0
f 0
ccs 0
cts 13
cp 0
crap 42
1
<?php
2
/**
3
 * README plugin for HiDev
4
 *
5
 * @link      https://github.com/hiqdev/hidev-readme
6
 * @package   hidev-readme
7
 * @license   BSD-3-Clause
8
 * @copyright Copyright (c) 2015-2017, HiQDev (http://hiqdev.com/)
9
 */
10
11
namespace hidev\readme\components;
12
13
use hidev\helpers\FileHelper;
14
use hidev\helpers\Helper;
15
use Yii;
16
17
/**
18
 * README generation component.
19
 * @author Andrii Vasyliev <[email protected]>
20
 */
21
class Readme extends \hidev\base\Component
22
{
23
    /**
24
     * @var \Twig_Environment
25
     */
26
    protected $_twig;
27
28
    /**
29
     * @var array list of sections to render
30
     */
31
    protected $_sections;
32
33
    public $knownBadges = [];
34
35
    public $badges;
36
37
    public function save($path, $type)
38
    {
39
        FileHelper::write($path, $this->render($this->getTemplate($type)));
40
    }
41
42
    public function getTemplate($type)
43
    {
44
        return 'readme-' . $type;
45
    }
46
47
    /**
48
     * Get charset.
49
     * @return string
50
     */
51
    public function getCharset()
52
    {
53
        return (isset(Yii::$app->charset) ? Yii::$app->charset : null) ?: mb_internal_encoding();
0 ignored issues
show
Bug Best Practice introduced by
The expression return IssetNode ? Yii::... mb_internal_encoding() also could return the type boolean which is incompatible with the documented return type string.
Loading history...
54
    }
55
56 2
    public function renderH($title, $prefix)
57
    {
58 2
        return $prefix . ' ' . $title . "\n";
59
    }
60
61 1
    public function renderH1($title)
62
    {
63 1
        return $this->renderH($title, '#');
64
    }
65
66 1
    public function renderH2($title)
67
    {
68 1
        return $this->renderH($title, '##');
69
    }
70
71
    public function renderH3($title)
72
    {
73
        return $this->renderH($title, '###');
74
    }
75
76
    public function renderText($text)
77
    {
78
        $text = trim($text);
79
80
        return $text ? "\n$text\n" : '';
81
    }
82
83
    public function renderBold($text)
84
    {
85
        $text = trim($text);
86
87
        return $this->renderText('**' . $text . '**');
88
    }
89
90
    public function renderSection($section, $default = null)
91
    {
92
        $file = 'readme/' . str_replace(' ', '', $section);
93
        $path = Yii::getAlias("@root/docs/$file.md");
94
        $text = file_exists($path) ? file_get_contents($path) : $this->getSection($file, $default);
95
        $text = trim($text);
96
97
        return $text ? "\n## $section\n\n$text\n" : '';
98
    }
99
100
    public function getSection($file, $default = null)
101
    {
102
        $tpl = '@hidev/views/' . Helper::file2template($file);
103
        try {
104
            $res = $this->render($tpl);
105
        } catch (\Exception $e) {
106
            $res = '';
107
        }
108
109
        return $res ?: $default;
110
    }
111
112
    /**
113
     * Set sections list.
114
     * @param array $value
115
     */
116
    public function setSections($value)
117
    {
118
        $this->_sections = (array) $value;
119
    }
120
121
    /**
122
     * Returns sections list. Returns default list if not set.
123
     * @return array
124
     */
125
    public function getSections()
126
    {
127
        if (empty($this->_sections)) {
128
            $this->_sections = ['Requirements', 'Installation', 'Idea', 'Configuration', 'Basic Usage', 'Usage', 'Support', 'Disclaimer', 'License', 'Acknowledgements', 'Acknowledgments'];
129
        }
130
131
        return array_unique($this->_sections);
132
    }
133
134
    /**
135
     * Render all configured sections.
136
     * @return string
137
     */
138
    public function renderSections($sections = null)
139
    {
140
        if ($sections === null) {
141
            $sections = $this->getSections();
142
        }
143
        $res = '';
144
        foreach ($sections as $section) {
145
            $res .= $this->renderSection($section);
146
        }
147
148
        return $res;
149
    }
150
151
    /**
152
     * Render all configured badges.
153
     * @return string
154
     */
155
    public function renderBadges()
156
    {
157
        $badges = $this->badges;
158
        if (!$badges) {
159
            return '';
160
        }
161
        $pm = $this->take('package')->getPackageManager();
0 ignored issues
show
Unused Code introduced by
The assignment to $pm is dead and can be removed.
Loading history...
162
        $res = '';
163
        foreach ($badges as $badge => $tpl) {
164
            if (!$tpl) {
165
                $tpl = $this->knownBadges[$badge];
166
            }
167
            if ($tpl === 'disabled') {
168
                continue;
169
            }
170
            $res .= $this->renderBadge($tpl) . "\n";
171
        }
172
173
        return $res ? "\n$res" : '';
174
    }
175
176
    /**
177
     * Render badge by given template.
178
     * @param string $template string to render
179
     * @return string
180
     */
181
    public function renderBadge($template)
182
    {
183
        $tpl = $this->getTwig()->createTemplate($template);
184
185
        return $tpl->render(['app' => Yii::$app]);
186
    }
187
188
    /**
189
     * Twig getter.
190
     * @return \Twig_Environment
191
     */
192
    public function getTwig()
193
    {
194
        if ($this->_twig === null) {
195
            $this->_twig = new \Twig_Environment(new \Twig_Loader_Array());
0 ignored issues
show
Deprecated Code introduced by
The class Twig_Loader_Array has been deprecated: since Twig 2.7, use "Twig\Loader\ArrayLoader" instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

195
            $this->_twig = new \Twig_Environment(/** @scrutinizer ignore-deprecated */ new \Twig_Loader_Array());
Loading history...
Deprecated Code introduced by
The class Twig_Environment has been deprecated: since Twig 2.7, use "Twig\Environment" instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

195
            $this->_twig = /** @scrutinizer ignore-deprecated */ new \Twig_Environment(new \Twig_Loader_Array());
Loading history...
196
        }
197
198
        return $this->_twig;
199
    }
200
}
201