PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 2.11.1
GiveWP – Donation Plugin and Fundraising Platform v2.11.1
4.16.8 4.16.7.2 4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 All 253 releases
give / vendor / fakerphp / faker / src / Faker / Provider / Text.php
Text.php
142 lines 4.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Faker\Provider;
4
5 abstract class Text extends Base
6 {
7 protected static $baseText = '';
8 protected static $separator = ' ';
9 protected static $separatorLen = 1;
10 protected $explodedText;
11 protected $consecutiveWords = array();
12 protected static $textStartsWithUppercase = true;
13
14 /**
15 * Generate a text string by the Markov chain algorithm.
16 *
17 * Depending on the $maxNbChars, returns a random valid looking text. The algorithm
18 * generates a weighted table with the specified number of words as the index and the
19 * possible following words as the value.
20 *
21 * @example 'Alice, swallowing down her flamingo, and began by taking the little golden key'
22 * @param integer $maxNbChars Maximum number of characters the text should contain (minimum: 10)
23 * @param integer $indexSize Determines how many words are considered for the generation of the next word.
24 * The minimum is 1, and it produces a higher level of randomness, although the
25 * generated text usually doesn't make sense. Higher index sizes (up to 5)
26 * produce more correct text, at the price of less randomness.
27 * @return string
28 */
29 public function realText($maxNbChars = 200, $indexSize = 2)
30 {
31 if ($maxNbChars < 10) {
32 throw new \InvalidArgumentException('maxNbChars must be at least 10');
33 }
34
35 if ($indexSize < 1) {
36 throw new \InvalidArgumentException('indexSize must be at least 1');
37 }
38
39 if ($indexSize > 5) {
40 throw new \InvalidArgumentException('indexSize must be at most 5');
41 }
42
43 $words = $this->getConsecutiveWords($indexSize);
44 $result = array();
45 $resultLength = 0;
46 // take a random starting point
47 $next = static::randomKey($words);
48 while ($resultLength < $maxNbChars && isset($words[$next])) {
49 // fetch a random word to append
50 $word = static::randomElement($words[$next]);
51
52 // calculate next index
53 $currentWords = static::explode($next);
54 $currentWords[] = $word;
55 array_shift($currentWords);
56 $next = static::implode($currentWords);
57
58 // ensure text starts with an uppercase letter
59 if ($resultLength == 0 && !static::validStart($word)) {
60 continue;
61 }
62
63 // append the element
64 $result[] = $word;
65 $resultLength += static::strlen($word) + static::$separatorLen;
66 }
67
68 // remove the element that caused the text to overflow
69 array_pop($result);
70
71 // build result
72 $result = static::implode($result);
73
74 return static::appendEnd($result);
75 }
76
77 protected function getConsecutiveWords($indexSize)
78 {
79 if (!isset($this->consecutiveWords[$indexSize])) {
80 $parts = $this->getExplodedText();
81 $words = array();
82 $index = array();
83 for ($i = 0; $i < $indexSize; $i++) {
84 $index[] = array_shift($parts);
85 }
86
87 for ($i = 0, $count = count($parts); $i < $count; $i++) {
88 $stringIndex = static::implode($index);
89 if (!isset($words[$stringIndex])) {
90 $words[$stringIndex] = array();
91 }
92 $word = $parts[$i];
93 $words[$stringIndex][] = $word;
94 array_shift($index);
95 $index[] = $word;
96 }
97 // cache look up words for performance
98 $this->consecutiveWords[$indexSize] = $words;
99 }
100
101 return $this->consecutiveWords[$indexSize];
102 }
103
104 protected function getExplodedText()
105 {
106 if ($this->explodedText === null) {
107 $this->explodedText = static::explode(preg_replace('/\s+/u', ' ', static::$baseText));
108 }
109
110 return $this->explodedText;
111 }
112
113 protected static function explode($text)
114 {
115 return explode(static::$separator, $text);
116 }
117
118 protected static function implode($words)
119 {
120 return implode(static::$separator, $words);
121 }
122
123 protected static function strlen($text)
124 {
125 return function_exists('mb_strlen') ? mb_strlen($text, 'UTF-8') : strlen($text);
126 }
127
128 protected static function validStart($word)
129 {
130 $isValid = true;
131 if (static::$textStartsWithUppercase) {
132 $isValid = preg_match('/^\p{Lu}/u', $word);
133 }
134 return $isValid;
135 }
136
137 protected static function appendEnd($text)
138 {
139 return preg_replace("/([ ,-:;\x{2013}\x{2014}]+$)/us", '', $text).'.';
140 }
141 }
142