annotate vendor/chi-teck/drupal-code-generator/src/Utils.php @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children a9cd425dd02b
rev   line source
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 }