diff core/lib/Drupal/Component/Utility/Random.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 129ea1e6d783
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Component/Utility/Random.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,301 @@
+<?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;
+  }
+
+}