This repository has been archived on 2025-01-19. You can view files and clone it, but cannot push or open issues or pull requests.
drupalcampbristol/vendor/chi-teck/drupal-code-generator/src/Utils.php
2018-11-23 12:29:20 +00:00

259 lines
6.8 KiB
PHP

<?php
namespace DrupalCodeGenerator;
use Symfony\Component\Console\Question\Question;
/**
* Helper methods for code generators.
*/
class Utils {
/**
* Creates default plugin ID.
*/
public static function defaultPluginId(array $vars) {
return $vars['machine_name'] . '_' . self::human2machine($vars['plugin_label']);
}
/**
* Transforms a machine name to human name.
*/
public static function machine2human($machine_name) {
return ucfirst(trim(str_replace('_', ' ', $machine_name)));
}
/**
* Transforms a human name to machine name.
*/
public static function human2machine($human_name) {
return trim(preg_replace(
['/^[0-9]+/', '/[^a-z0-9_]+/'],
'_',
strtolower($human_name)
), '_');
}
/**
* Transforms a camelized sting to machine name.
*/
public static function camel2machine($input) {
return self::human2machine(preg_replace('/[A-Z]/', ' \0', $input));
}
/**
* Camelize a string.
*/
public static function camelize($string, $upper_camel = TRUE) {
$output = preg_replace('/([^A-Z])([A-Z])/', '$1 $2', $string);
$output = strtolower($output);
$output = preg_replace('/[^a-z0-9]/', ' ', $output);
$output = trim($output);
$output = ucwords($output);
$output = str_replace(' ', '', $output);
return $upper_camel ? $output : lcfirst($output);
}
/**
* Machine name validator.
*/
public static function validateMachineName($value) {
if (!preg_match('/^[a-z][a-z0-9_]*[a-z0-9]$/', $value)) {
throw new \UnexpectedValueException('The value is not correct machine name.');
}
return $value;
}
/**
* Class name validator.
*
* @see http://php.net/manual/en/language.oop5.basic.php
*/
public static function validateClassName($value) {
if (!preg_match('/^[A-Z][a-zA-Z0-9]+$/', $value)) {
throw new \UnexpectedValueException('The value is not correct class name.');
}
return $value;
}
/**
* Service name validator.
*/
public static function validateServiceName($value) {
if ($value !== '' && !preg_match('/^[a-z][a-z0-9_\.]*[a-z0-9]$/', $value)) {
throw new \UnexpectedValueException('The value is not correct service name.');
}
return $value;
}
/**
* Required value validator.
*/
public static function validateRequired($value) {
// FALSE is not considered as empty value because question helper use
// it as negative answer on confirmation questions.
if ($value === NULL || $value === '') {
throw new \UnexpectedValueException('The value is required.');
}
return $value;
}
/**
* Returns normalized file path.
*
* @codeCoverageIgnore
* @deprecated
*/
public static function normalizePath($path) {
$parts = [];
$path = str_replace('\\', '/', $path);
$path = preg_replace('/\/+/', '/', $path);
$segments = explode('/', $path);
foreach ($segments as $segment) {
if ($segment != '.') {
$test = array_pop($parts);
if (is_null($test)) {
$parts[] = $segment;
}
elseif ($segment == '..') {
if ($test == '..') {
$parts[] = $test;
}
if ($test == '..' || $test == '') {
$parts[] = $segment;
}
}
else {
$parts[] = $test;
$parts[] = $segment;
}
}
}
return implode('/', $parts);
}
/**
* Returns default questions for module generators.
*
* @return \Symfony\Component\Console\Question\Question[]
* Array of default questions.
*/
public static function defaultQuestions() {
$questions['name'] = new Question('Module name');
$questions['name']->setValidator([Utils::class, 'validateRequired']);
$questions['machine_name'] = new Question('Module machine name');
$questions['machine_name']->setValidator([Utils::class, 'validateMachineName']);
return $questions;
}
/**
* Returns default questions for plugin generators.
*
* @return \Symfony\Component\Console\Question\Question[]
* Array of default questions.
*/
public static function defaultPluginQuestions() {
$questions = Utils::defaultQuestions();
$questions['plugin_label'] = new Question('Plugin label', 'Example');
$questions['plugin_label']->setValidator([Utils::class, 'validateRequired']);
$questions['plugin_id'] = new Question('Plugin ID', [Utils::class, 'defaultPluginId']);
$questions['plugin_id']->setValidator([Utils::class, 'validateMachineName']);
return $questions;
}
/**
* Returns extension root.
*
* @return string|bool
* Extension root directory or false if it was not found.
*/
public static function getExtensionRoot($directory) {
$extension_root = FALSE;
for ($i = 1; $i <= 5; $i++) {
$info_file = $directory . '/' . basename($directory) . '.info';
if ((file_exists($info_file) && basename($directory) !== 'drush') || file_exists($info_file . '.yml')) {
$extension_root = $directory;
break;
}
$directory = dirname($directory);
}
return $extension_root;
}
/**
* Removes a given number of lines from the beginning of the string.
*/
public static function removeHeader($content, $header_size) {
return implode("\n", array_slice(explode("\n", $content), $header_size));
}
/**
* Return the user's home directory.
*/
public static function getHomeDirectory() {
return isset($_SERVER['HOME']) ? $_SERVER['HOME'] : getenv('HOME');
}
/**
* Replaces all tokens in a given string with appropriate values.
*
* @param string $text
* A string potentially containing replaceable tokens.
* @param array $data
* An array where keys are token names and values are replacements.
*
* @return string
* Text with tokens replaced.
*/
public static function tokenReplace($text, array $data) {
$tokens = [];
foreach ($data as $var_name => $var) {
if (is_string($var)) {
$tokens['{' . $var_name . '}'] = $var;
}
}
return str_replace(array_keys($tokens), array_values($tokens), $text);
}
/**
* Pluralizes a noun.
*
* @param string $string
* A noun to pluralize.
*
* @return string
* The pluralized noun.
*/
public static function pluralize($string) {
switch (substr($string, -1)) {
case 'y':
return substr($string, 0, -1) . 'ies';
case 's':
return $string . 'es';
default:
return $string . 's';
}
}
/**
* Prepares choices.
*
* @param array $raw_choices
* The choices to be prepared.
*
* @return array
* The prepared choices.
*/
public static function prepareChoices(array $raw_choices) {
// The $raw_choices can be an associative array.
$choices = array_values($raw_choices);
// Start choices list form '1'.
array_unshift($choices, NULL);
unset($choices[0]);
return $choices;
}
}