123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- <?php
- namespace Drupal\Component\Utility;
- /**
- * Defines a utility class for creating random data.
- *
- * @ingroup utility
- */
- class Random {
- /**
- * The maximum number of times name() and string() can loop.
- *
- * This prevents infinite loops if the length of the random value is very
- * small.
- *
- * @see \Drupal\Tests\Component\Utility\RandomTest
- */
- const MAXIMUM_TRIES = 100;
- /**
- * A list of unique strings generated by string().
- *
- * @var array
- */
- protected $strings = [];
- /**
- * A list of unique names generated by name().
- *
- * @var array
- */
- protected $names = [];
- /**
- * Generates a random string of ASCII characters of codes 32 to 126.
- *
- * The generated string includes alpha-numeric characters and common
- * miscellaneous characters. Use this method when testing general input
- * where the content is not restricted.
- *
- * @param int $length
- * Length of random string to generate.
- * @param bool $unique
- * (optional) If TRUE ensures that the random string returned is unique.
- * Defaults to FALSE.
- * @param callable $validator
- * (optional) A callable to validate the string. Defaults to NULL.
- *
- * @return string
- * Randomly generated string.
- *
- * @see \Drupal\Component\Utility\Random::name()
- */
- public function string($length = 8, $unique = FALSE, $validator = NULL) {
- $counter = 0;
- // Continue to loop if $unique is TRUE and the generated string is not
- // unique or if $validator is a callable that returns FALSE. To generate a
- // random string this loop must be carried out at least once.
- do {
- if ($counter == static::MAXIMUM_TRIES) {
- throw new \RuntimeException('Unable to generate a unique random name');
- }
- $str = '';
- for ($i = 0; $i < $length; $i++) {
- $str .= chr(mt_rand(32, 126));
- }
- $counter++;
- $continue = FALSE;
- if ($unique) {
- $continue = isset($this->strings[$str]);
- }
- if (!$continue && is_callable($validator)) {
- // If the validator callback returns FALSE generate another random
- // string.
- $continue = !call_user_func($validator, $str);
- }
- } while ($continue);
- if ($unique) {
- $this->strings[$str] = TRUE;
- }
- return $str;
- }
- /**
- * Generates a random string containing letters and numbers.
- *
- * The string will always start with a letter. The letters may be upper or
- * lower case. This method is better for restricted inputs that do not
- * accept certain characters. For example, when testing input fields that
- * require machine readable values (i.e. without spaces and non-standard
- * characters) this method is best.
- *
- * @param int $length
- * Length of random string to generate.
- * @param bool $unique
- * (optional) If TRUE ensures that the random string returned is unique.
- * Defaults to FALSE.
- *
- * @return string
- * Randomly generated string.
- *
- * @see \Drupal\Component\Utility\Random::string()
- */
- public function name($length = 8, $unique = FALSE) {
- $values = array_merge(range(65, 90), range(97, 122), range(48, 57));
- $max = count($values) - 1;
- $counter = 0;
- do {
- if ($counter == static::MAXIMUM_TRIES) {
- throw new \RuntimeException('Unable to generate a unique random name');
- }
- $str = chr(mt_rand(97, 122));
- for ($i = 1; $i < $length; $i++) {
- $str .= chr($values[mt_rand(0, $max)]);
- }
- $counter++;
- } while ($unique && isset($this->names[$str]));
- if ($unique) {
- $this->names[$str] = TRUE;
- }
- return $str;
- }
- /**
- * Generate a string that looks like a word (letters only, alternating consonants and vowels).
- *
- * @param int $length
- * The desired word length.
- *
- * @return string
- */
- public function word($length) {
- mt_srand((double) microtime() * 1000000);
- $vowels = ["a", "e", "i", "o", "u"];
- $cons = ["b", "c", "d", "g", "h", "j", "k", "l", "m", "n", "p", "r", "s", "t", "u", "v", "w", "tr",
- "cr", "br", "fr", "th", "dr", "ch", "ph", "wr", "st", "sp", "sw", "pr",
- "sl", "cl", "sh",
- ];
- $num_vowels = count($vowels);
- $num_cons = count($cons);
- $word = '';
- while (strlen($word) < $length) {
- $word .= $cons[mt_rand(0, $num_cons - 1)] . $vowels[mt_rand(0, $num_vowels - 1)];
- }
- return substr($word, 0, $length);
- }
- /**
- * Generates a random PHP object.
- *
- * @param int $size
- * The number of random keys to add to the object.
- *
- * @return \stdClass
- * The generated object, with the specified number of random keys. Each key
- * has a random string value.
- */
- public function object($size = 4) {
- $object = new \stdClass();
- for ($i = 0; $i < $size; $i++) {
- $random_key = $this->name();
- $random_value = $this->string();
- $object->{$random_key} = $random_value;
- }
- return $object;
- }
- /**
- * Generates sentences Latin words, often used as placeholder text.
- *
- * @param int $min_word_count
- * The minimum number of words in the return string. Total word count
- * can slightly exceed provided this value in order to deliver
- * sentences of random length.
- * @param bool $capitalize
- * Uppercase all the words in the string.
- *
- * @return string
- * Nonsense latin words which form sentence(s).
- */
- public function sentences($min_word_count, $capitalize = FALSE) {
- $dictionary = ["abbas", "abdo", "abico", "abigo", "abluo", "accumsan",
- "acsi", "ad", "adipiscing", "aliquam", "aliquip", "amet", "antehabeo",
- "appellatio", "aptent", "at", "augue", "autem", "bene", "blandit",
- "brevitas", "caecus", "camur", "capto", "causa", "cogo", "comis",
- "commodo", "commoveo", "consectetuer", "consequat", "conventio", "cui",
- "damnum", "decet", "defui", "diam", "dignissim", "distineo", "dolor",
- "dolore", "dolus", "duis", "ea", "eligo", "elit", "enim", "erat",
- "eros", "esca", "esse", "et", "eu", "euismod", "eum", "ex", "exerci",
- "exputo", "facilisi", "facilisis", "fere", "feugiat", "gemino",
- "genitus", "gilvus", "gravis", "haero", "hendrerit", "hos", "huic",
- "humo", "iaceo", "ibidem", "ideo", "ille", "illum", "immitto",
- "importunus", "imputo", "in", "incassum", "inhibeo", "interdico",
- "iriure", "iusto", "iustum", "jugis", "jumentum", "jus", "laoreet",
- "lenis", "letalis", "lobortis", "loquor", "lucidus", "luctus", "ludus",
- "luptatum", "macto", "magna", "mauris", "melior", "metuo", "meus",
- "minim", "modo", "molior", "mos", "natu", "neo", "neque", "nibh",
- "nimis", "nisl", "nobis", "nostrud", "nulla", "nunc", "nutus", "obruo",
- "occuro", "odio", "olim", "oppeto", "os", "pagus", "pala", "paratus",
- "patria", "paulatim", "pecus", "persto", "pertineo", "plaga", "pneum",
- "populus", "praemitto", "praesent", "premo", "probo", "proprius",
- "quadrum", "quae", "qui", "quia", "quibus", "quidem", "quidne", "quis",
- "ratis", "refero", "refoveo", "roto", "rusticus", "saepius",
- "sagaciter", "saluto", "scisco", "secundum", "sed", "si", "similis",
- "singularis", "sino", "sit", "sudo", "suscipere", "suscipit", "tamen",
- "tation", "te", "tego", "tincidunt", "torqueo", "tum", "turpis",
- "typicus", "ulciscor", "ullamcorper", "usitas", "ut", "utinam",
- "utrum", "uxor", "valde", "valetudo", "validus", "vel", "velit",
- "veniam", "venio", "vereor", "vero", "verto", "vicis", "vindico",
- "virtus", "voco", "volutpat", "vulpes", "vulputate", "wisi", "ymo",
- "zelus",
- ];
- $dictionary_flipped = array_flip($dictionary);
- $greeking = '';
- if (!$capitalize) {
- $words_remaining = $min_word_count;
- while ($words_remaining > 0) {
- $sentence_length = mt_rand(3, 10);
- $words = array_rand($dictionary_flipped, $sentence_length);
- $sentence = implode(' ', $words);
- $greeking .= ucfirst($sentence) . '. ';
- $words_remaining -= $sentence_length;
- }
- }
- else {
- // Use slightly different method for titles.
- $words = array_rand($dictionary_flipped, $min_word_count);
- $words = is_array($words) ? implode(' ', $words) : $words;
- $greeking = ucwords($words);
- }
- return trim($greeking);
- }
- /**
- * Generate paragraphs separated by double new line.
- *
- * @param int $paragraph_count
- * @return string
- */
- public function paragraphs($paragraph_count = 12) {
- $output = '';
- for ($i = 1; $i <= $paragraph_count; $i++) {
- $output .= $this->sentences(mt_rand(20, 60)) . "\n\n";
- }
- return $output;
- }
- /**
- * Create a placeholder image.
- *
- * @param string $destination
- * The absolute file path where the image should be stored.
- * @param int $min_resolution
- * @param int $max_resolution
- *
- * @return string
- * Path to image file.
- */
- public function image($destination, $min_resolution, $max_resolution) {
- $extension = pathinfo($destination, PATHINFO_EXTENSION);
- $min = explode('x', $min_resolution);
- $max = explode('x', $max_resolution);
- $width = rand((int) $min[0], (int) $max[0]);
- $height = rand((int) $min[1], (int) $max[1]);
- // Make an image split into 4 sections with random colors.
- $im = imagecreate($width, $height);
- for ($n = 0; $n < 4; $n++) {
- $color = imagecolorallocate($im, rand(0, 255), rand(0, 255), rand(0, 255));
- $x = $width / 2 * ($n % 2);
- $y = $height / 2 * (int) ($n >= 2);
- imagefilledrectangle($im, $x, $y, $x + $width / 2, $y + $height / 2, $color);
- }
- // Make a perfect circle in the image middle.
- $color = imagecolorallocate($im, rand(0, 255), rand(0, 255), rand(0, 255));
- $smaller_dimension = min($width, $height);
- imageellipse($im, $width / 2, $height / 2, $smaller_dimension, $smaller_dimension, $color);
- $save_function = 'image' . ($extension == 'jpg' ? 'jpeg' : $extension);
- $save_function($im, $destination);
- return $destination;
- }
- }
|