Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace DrupalCodeGenerator;
|
Chris@0
|
4
|
Chris@0
|
5 use Symfony\Component\Console\Question\Question;
|
Chris@0
|
6
|
Chris@0
|
7 /**
|
Chris@0
|
8 * Helper methods for code generators.
|
Chris@0
|
9 */
|
Chris@0
|
10 class Utils {
|
Chris@0
|
11
|
Chris@0
|
12 /**
|
Chris@0
|
13 * Creates default plugin ID.
|
Chris@0
|
14 */
|
Chris@0
|
15 public static function defaultPluginId(array $vars) {
|
Chris@0
|
16 return $vars['machine_name'] . '_' . self::human2machine($vars['plugin_label']);
|
Chris@0
|
17 }
|
Chris@0
|
18
|
Chris@0
|
19 /**
|
Chris@0
|
20 * Transforms a machine name to human name.
|
Chris@0
|
21 */
|
Chris@0
|
22 public static function machine2human($machine_name) {
|
Chris@0
|
23 return ucfirst(trim(str_replace('_', ' ', $machine_name)));
|
Chris@0
|
24 }
|
Chris@0
|
25
|
Chris@0
|
26 /**
|
Chris@0
|
27 * Transforms a human name to machine name.
|
Chris@0
|
28 */
|
Chris@0
|
29 public static function human2machine($human_name) {
|
Chris@0
|
30 return trim(preg_replace(
|
Chris@0
|
31 ['/^[0-9]+/', '/[^a-z0-9_]+/'],
|
Chris@0
|
32 '_',
|
Chris@0
|
33 strtolower($human_name)
|
Chris@0
|
34 ), '_');
|
Chris@0
|
35 }
|
Chris@0
|
36
|
Chris@0
|
37 /**
|
Chris@0
|
38 * Camelize a string.
|
Chris@0
|
39 */
|
Chris@0
|
40 public static function camelize($string, $upper_camel = TRUE) {
|
Chris@0
|
41 $output = preg_replace('/([^A-Z])([A-Z])/', '$1 $2', $string);
|
Chris@0
|
42 $output = strtolower($output);
|
Chris@0
|
43 $output = preg_replace('/[^a-z0-9]/', ' ', $output);
|
Chris@0
|
44 $output = trim($output);
|
Chris@0
|
45 $output = ucwords($output);
|
Chris@0
|
46 $output = str_replace(' ', '', $output);
|
Chris@0
|
47 return $upper_camel ? $output : lcfirst($output);
|
Chris@0
|
48 }
|
Chris@0
|
49
|
Chris@0
|
50 /**
|
Chris@0
|
51 * Machine name validator.
|
Chris@0
|
52 */
|
Chris@0
|
53 public static function validateMachineName($value) {
|
Chris@0
|
54 if (!preg_match('/^[a-z][a-z0-9_]*[a-z0-9]$/', $value)) {
|
Chris@0
|
55 throw new \UnexpectedValueException('The value is not correct machine name.');
|
Chris@0
|
56 }
|
Chris@0
|
57 return $value;
|
Chris@0
|
58 }
|
Chris@0
|
59
|
Chris@0
|
60 /**
|
Chris@0
|
61 * Class name validator.
|
Chris@0
|
62 *
|
Chris@0
|
63 * @see http://php.net/manual/en/language.oop5.basic.php
|
Chris@0
|
64 */
|
Chris@0
|
65 public static function validateClassName($value) {
|
Chris@0
|
66 if (!preg_match('/^[A-Z][a-zA-Z0-9]+$/', $value)) {
|
Chris@0
|
67 throw new \UnexpectedValueException('The value is not correct class name.');
|
Chris@0
|
68 }
|
Chris@0
|
69 return $value;
|
Chris@0
|
70 }
|
Chris@0
|
71
|
Chris@0
|
72 /**
|
Chris@0
|
73 * Required value validator.
|
Chris@0
|
74 */
|
Chris@0
|
75 public static function validateRequired($value) {
|
Chris@0
|
76 // FALSE is not considered as empty value because question helper use
|
Chris@0
|
77 // it as negative answer on confirmation questions.
|
Chris@0
|
78 if ($value === NULL || $value === '') {
|
Chris@0
|
79 throw new \UnexpectedValueException('The value is required.');
|
Chris@0
|
80 }
|
Chris@0
|
81 return $value;
|
Chris@0
|
82 }
|
Chris@0
|
83
|
Chris@0
|
84 /**
|
Chris@0
|
85 * Returns normalized file path.
|
Chris@0
|
86 *
|
Chris@0
|
87 * @codeCoverageIgnore
|
Chris@0
|
88 * @deprecated
|
Chris@0
|
89 */
|
Chris@0
|
90 public static function normalizePath($path) {
|
Chris@0
|
91 $parts = [];
|
Chris@0
|
92 $path = str_replace('\\', '/', $path);
|
Chris@0
|
93 $path = preg_replace('/\/+/', '/', $path);
|
Chris@0
|
94 $segments = explode('/', $path);
|
Chris@0
|
95 foreach ($segments as $segment) {
|
Chris@0
|
96 if ($segment != '.') {
|
Chris@0
|
97 $test = array_pop($parts);
|
Chris@0
|
98 if (is_null($test)) {
|
Chris@0
|
99 $parts[] = $segment;
|
Chris@0
|
100 }
|
Chris@0
|
101 elseif ($segment == '..') {
|
Chris@0
|
102 if ($test == '..') {
|
Chris@0
|
103 $parts[] = $test;
|
Chris@0
|
104 }
|
Chris@0
|
105 if ($test == '..' || $test == '') {
|
Chris@0
|
106 $parts[] = $segment;
|
Chris@0
|
107 }
|
Chris@0
|
108 }
|
Chris@0
|
109 else {
|
Chris@0
|
110 $parts[] = $test;
|
Chris@0
|
111 $parts[] = $segment;
|
Chris@0
|
112 }
|
Chris@0
|
113 }
|
Chris@0
|
114 }
|
Chris@0
|
115 return implode('/', $parts);
|
Chris@0
|
116 }
|
Chris@0
|
117
|
Chris@0
|
118 /**
|
Chris@0
|
119 * Returns default questions for module generators.
|
Chris@0
|
120 *
|
Chris@0
|
121 * @return \Symfony\Component\Console\Question\Question[]
|
Chris@0
|
122 * Array of default questions.
|
Chris@0
|
123 */
|
Chris@0
|
124 public static function defaultQuestions() {
|
Chris@0
|
125 $questions['name'] = new Question('Module name');
|
Chris@0
|
126 $questions['name']->setValidator([Utils::class, 'validateRequired']);
|
Chris@0
|
127 $questions['machine_name'] = new Question('Module machine name');
|
Chris@0
|
128 $questions['machine_name']->setValidator([Utils::class, 'validateMachineName']);
|
Chris@0
|
129 return $questions;
|
Chris@0
|
130 }
|
Chris@0
|
131
|
Chris@0
|
132 /**
|
Chris@0
|
133 * Returns default questions for plugin generators.
|
Chris@0
|
134 *
|
Chris@0
|
135 * @return \Symfony\Component\Console\Question\Question[]
|
Chris@0
|
136 * Array of default questions.
|
Chris@0
|
137 */
|
Chris@0
|
138 public static function defaultPluginQuestions() {
|
Chris@0
|
139 $questions = Utils::defaultQuestions();
|
Chris@0
|
140 $questions['plugin_label'] = new Question('Plugin label', 'Example');
|
Chris@0
|
141 $questions['plugin_label']->setValidator([Utils::class, 'validateRequired']);
|
Chris@0
|
142 $questions['plugin_id'] = new Question('Plugin ID', [Utils::class, 'defaultPluginId']);
|
Chris@0
|
143 $questions['plugin_id']->setValidator([Utils::class, 'validateMachineName']);
|
Chris@0
|
144 return $questions;
|
Chris@0
|
145 }
|
Chris@0
|
146
|
Chris@0
|
147 /**
|
Chris@0
|
148 * Returns extension root.
|
Chris@0
|
149 *
|
Chris@0
|
150 * @return string|bool
|
Chris@0
|
151 * Extension root directory or false if it was not found.
|
Chris@0
|
152 */
|
Chris@0
|
153 public static function getExtensionRoot($directory) {
|
Chris@0
|
154 $extension_root = FALSE;
|
Chris@0
|
155 for ($i = 1; $i <= 5; $i++) {
|
Chris@0
|
156 $info_file = $directory . '/' . basename($directory) . '.info';
|
Chris@0
|
157 if (file_exists($info_file) || file_exists($info_file . '.yml')) {
|
Chris@0
|
158 $extension_root = $directory;
|
Chris@0
|
159 break;
|
Chris@0
|
160 }
|
Chris@0
|
161 $directory = dirname($directory);
|
Chris@0
|
162 }
|
Chris@0
|
163 return $extension_root;
|
Chris@0
|
164 }
|
Chris@0
|
165
|
Chris@0
|
166 /**
|
Chris@0
|
167 * Removes a given number of lines from the beginning of the string.
|
Chris@0
|
168 */
|
Chris@0
|
169 public static function removeHeader($content, $header_size) {
|
Chris@0
|
170 return implode("\n", array_slice(explode("\n", $content), $header_size));
|
Chris@0
|
171 }
|
Chris@0
|
172
|
Chris@0
|
173 /**
|
Chris@0
|
174 * Return the user's home directory.
|
Chris@0
|
175 */
|
Chris@0
|
176 public static function getHomeDirectory() {
|
Chris@0
|
177 return isset($_SERVER['HOME']) ? $_SERVER['HOME'] : getenv('HOME');
|
Chris@0
|
178 }
|
Chris@0
|
179
|
Chris@0
|
180 /**
|
Chris@0
|
181 * Replaces all tokens in a given string with appropriate values.
|
Chris@0
|
182 *
|
Chris@0
|
183 * @param string $text
|
Chris@0
|
184 * A string potentially containing replaceable tokens.
|
Chris@0
|
185 * @param array $data
|
Chris@0
|
186 * An array where keys are token names and values are replacements.
|
Chris@0
|
187 *
|
Chris@0
|
188 * @return string
|
Chris@0
|
189 * Text with tokens replaced.
|
Chris@0
|
190 */
|
Chris@0
|
191 public static function tokenReplace($text, array $data) {
|
Chris@0
|
192 $tokens = [];
|
Chris@0
|
193 foreach ($data as $var_name => $var) {
|
Chris@0
|
194 if (is_string($var)) {
|
Chris@0
|
195 $tokens['{' . $var_name . '}'] = $var;
|
Chris@0
|
196 }
|
Chris@0
|
197 }
|
Chris@0
|
198 return str_replace(array_keys($tokens), array_values($tokens), $text);
|
Chris@0
|
199 }
|
Chris@0
|
200
|
Chris@0
|
201 }
|