1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Kaliop\eZLoremIpsumBundle\Faker\Provider; |
4
|
|
|
|
5
|
|
|
class RichText extends Base |
6
|
|
|
{ |
7
|
|
|
const P_TAG = "para"; |
8
|
|
|
const A_TAG = "link"; |
9
|
|
|
const E_TAG = "ezembed"; |
10
|
|
|
const TABLE_TAG = "informaltable"; |
11
|
|
|
const TR_TAG = "tr"; |
12
|
|
|
const TD_TAG = "td"; |
13
|
|
|
const UL_TAG = "itemizedlist"; |
14
|
|
|
const OL_TAG = "orderedlist"; |
15
|
|
|
const LI_TAG = "listitem"; |
16
|
|
|
const H_TAG = "title"; |
17
|
|
|
const EMPHASIS_TAG = "emphasis"; |
18
|
|
|
const CUSTOM_TAG = "custom"; |
19
|
|
|
|
20
|
|
|
/** |
21
|
|
|
* @param integer $maxDepth |
22
|
|
|
* @param integer $maxWidth |
23
|
|
|
* |
24
|
|
|
* @return string |
25
|
|
|
*/ |
26
|
|
|
public function randomRichText($maxDepth = 4, $maxWidth = 4) |
27
|
|
|
{ |
28
|
|
|
$document = new \DOMDocument(); |
29
|
|
|
|
30
|
|
|
$body = $document->createElementNS("http://docbook.org/ns/docbook", "section"); |
31
|
|
|
$body->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xlink', 'http://www.w3.org/1999/xlink'); |
32
|
|
|
$body->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ezxhtml', 'http://ez.no/xmlns/ezpublish/docbook/xhtml'); |
33
|
|
|
$body->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ezcustom', 'http://ez.no/xmlns/ezpublish/docbook/custom'); |
34
|
|
|
$body->setAttribute('version', '5.0-variant ezpublish-1.0'); |
35
|
|
|
|
36
|
|
|
$this->addRandomSubTree($body, $maxDepth, $maxWidth); |
37
|
|
|
|
38
|
|
|
$document->appendChild($body); |
39
|
|
|
|
40
|
|
|
$out = $document->saveXML(); |
41
|
|
|
|
42
|
|
|
return $out; |
43
|
|
|
} |
44
|
|
|
|
45
|
|
|
private function addRandomSubTree(\DOMElement $root, $maxDepth, $maxWidth) |
46
|
|
|
{ |
47
|
|
|
$maxDepth--; |
48
|
|
|
if ($maxDepth <= 0) { |
49
|
|
|
$this->addRandomLeaf($root); |
50
|
|
|
return $root; |
51
|
|
|
} |
52
|
|
|
|
53
|
|
|
$siblings = mt_rand(1, $maxWidth); |
54
|
|
|
for ($i = 0; $i < $siblings; $i++) { |
55
|
|
|
if ($maxDepth == 1) { |
56
|
|
|
$this->addRandomLeaf($root); |
57
|
|
|
} else { |
58
|
|
|
$this->addRandomSubTree($root, mt_rand(1, $maxDepth), $maxWidth); |
59
|
|
|
} |
60
|
|
|
}; |
61
|
|
|
return $root; |
62
|
|
|
} |
63
|
|
|
|
64
|
|
View Code Duplication |
private function addRandomLeaf(\DOMElement $node) |
|
|
|
|
65
|
|
|
{ |
66
|
|
|
$rand = mt_rand(1, 10); |
67
|
|
|
switch($rand) { |
68
|
|
|
case 1: |
69
|
|
|
$this->addRandomE($node); |
70
|
|
|
break; |
71
|
|
|
case 2: |
72
|
|
|
$this->addRandomA($node); |
73
|
|
|
break; |
74
|
|
|
case 3: |
75
|
|
|
$this->addRandomOL($node); |
76
|
|
|
break; |
77
|
|
|
case 4: |
78
|
|
|
$this->addRandomUL($node); |
79
|
|
|
break; |
80
|
|
|
case 5: |
81
|
|
|
$this->addRandomH($node); |
82
|
|
|
break; |
83
|
|
|
case 6: |
84
|
|
|
$this->addRandomB($node); |
85
|
|
|
break; |
86
|
|
|
case 7: |
87
|
|
|
$this->addRandomI($node); |
88
|
|
|
break; |
89
|
|
|
case 8: |
90
|
|
|
$this->addRandomTable($node); |
91
|
|
|
break; |
92
|
|
|
case 9: |
93
|
|
|
$this->addRandomU($node); |
94
|
|
|
break; |
95
|
|
|
default: |
96
|
|
|
$this->addRandomP($node); |
97
|
|
|
break; |
98
|
|
|
} |
99
|
|
|
} |
100
|
|
|
|
101
|
|
|
private function addRandomE(\DOMElement $element) |
102
|
|
|
{ |
103
|
|
|
$node = $element->ownerDocument->createElement(static::E_TAG); |
104
|
|
|
$node->setAttribute("view", "embed"); |
105
|
|
|
/// @todo improve: generation of a radmon object id |
106
|
|
|
$node->setAttribute("xlink:href", 'ezcontent://' . mt_rand(1, 100000)); |
107
|
|
|
$element->appendChild($node); |
108
|
|
|
} |
109
|
|
|
|
110
|
|
|
/** |
111
|
|
|
* @todo add random align |
112
|
|
|
* @param \DOMElement $element |
113
|
|
|
* @param int $maxLength |
114
|
|
|
*/ |
115
|
|
View Code Duplication |
private function addRandomP(\DOMElement $element, $maxLength = 50) |
|
|
|
|
116
|
|
|
{ |
117
|
|
|
$p = $element->ownerDocument->createElement(static::P_TAG); |
118
|
|
|
$text = $element->ownerDocument->createTextNode($this->getSentence(mt_rand(1, $maxLength))); |
119
|
|
|
// left-aligned paragraphs have double frequency |
120
|
|
|
switch (mt_rand(1, 4)) { |
121
|
|
|
case 1: |
122
|
|
|
$p->setAttribute("ezxhtml:textalign", "right"); |
123
|
|
|
break; |
124
|
|
|
case 2: |
125
|
|
|
$p->setAttribute("ezxhtml:textalign", "center"); |
126
|
|
|
break; |
127
|
|
|
} |
128
|
|
|
$p->appendChild($text); |
129
|
|
|
$element->appendChild($p); |
130
|
|
|
} |
131
|
|
|
|
132
|
|
View Code Duplication |
private function addRandomA(\DOMElement $element, $maxLength = 10) |
|
|
|
|
133
|
|
|
{ |
134
|
|
|
$text = $element->ownerDocument->createTextNode($this->getSentence(mt_rand(1, $maxLength))); |
135
|
|
|
$node = $element->ownerDocument->createElement(static::A_TAG); |
136
|
|
|
$node->setAttribute("xlink:href", 'ezurl://28'); |
137
|
|
|
$node->setAttribute('xlink:show', 'none'); |
138
|
|
|
$node->appendChild($text); |
139
|
|
|
$this->wrapInParagraph($node, $element); |
140
|
|
|
} |
141
|
|
|
|
142
|
|
View Code Duplication |
private function addRandomH(\DOMElement $element, $maxLength = 10) |
|
|
|
|
143
|
|
|
{ |
144
|
|
|
$h = static::H_TAG; |
145
|
|
|
$text = $element->ownerDocument->createTextNode($this->getSentence(mt_rand(1, $maxLength))); |
146
|
|
|
$node = $element->ownerDocument->createElement($h); |
147
|
|
|
$node->setAttribute('ezxhtml:level', mt_rand(1, 6)); |
148
|
|
|
$node->appendChild($text); |
149
|
|
|
$element->appendChild($node); |
150
|
|
|
} |
151
|
|
|
|
152
|
|
View Code Duplication |
private function addRandomB(\DOMElement $element, $maxLength = 10) |
|
|
|
|
153
|
|
|
{ |
154
|
|
|
$text = $element->ownerDocument->createTextNode($this->getSentence(mt_rand(1, $maxLength))); |
155
|
|
|
$node = $element->ownerDocument->createElement(static::EMPHASIS_TAG); |
156
|
|
|
$node->setAttribute('role', 'strong'); |
157
|
|
|
$node->appendChild($text); |
158
|
|
|
$this->wrapInParagraph($node, $element); |
159
|
|
|
} |
160
|
|
|
|
161
|
|
View Code Duplication |
private function addRandomU(\DOMElement $element, $maxLength = 10) |
|
|
|
|
162
|
|
|
{ |
163
|
|
|
$text = $element->ownerDocument->createTextNode($this->getSentence(mt_rand(1, $maxLength))); |
164
|
|
|
$node = $element->ownerDocument->createElement(static::EMPHASIS_TAG); |
165
|
|
|
$node->setAttribute('role', 'underlined'); |
166
|
|
|
$node->appendChild($text); |
167
|
|
|
$this->wrapInParagraph($node, $element); |
168
|
|
|
} |
169
|
|
|
|
170
|
|
View Code Duplication |
private function addRandomI(\DOMElement $element, $maxLength = 10) |
|
|
|
|
171
|
|
|
{ |
172
|
|
|
$text = $element->ownerDocument->createTextNode($this->getSentence(mt_rand(1, $maxLength))); |
173
|
|
|
$node = $element->ownerDocument->createElement(static::EMPHASIS_TAG); |
174
|
|
|
$node->setAttribute('role', 'emphasis'); |
175
|
|
|
$node->appendChild($text); |
176
|
|
|
$this->wrapInParagraph($node, $element); |
177
|
|
|
} |
178
|
|
|
|
179
|
|
View Code Duplication |
private function addRandomTable(\DOMElement $element, $maxRows = 10, $maxCols = 6, $maxLength = 10) |
|
|
|
|
180
|
|
|
{ |
181
|
|
|
$rows = mt_rand(1, $maxRows); |
182
|
|
|
$cols = mt_rand(1, $maxCols); |
183
|
|
|
|
184
|
|
|
$table = $element->ownerDocument->createElement(static::TABLE_TAG); |
185
|
|
|
|
186
|
|
|
for ($i = 0; $i < $rows; $i++) { |
187
|
|
|
$tr = $element->ownerDocument->createElement(static::TR_TAG); |
188
|
|
|
$table->appendChild($tr); |
189
|
|
|
for ($j = 0; $j < $cols; $j++) { |
190
|
|
|
$th = $element->ownerDocument->createElement(static::TD_TAG); |
191
|
|
|
$th->textContent = $this->getSentence(mt_rand(1, $maxLength)); |
192
|
|
|
$tr->appendChild($th); |
193
|
|
|
} |
194
|
|
|
} |
195
|
|
|
$this->wrapInParagraph($table, $element); |
196
|
|
|
} |
197
|
|
|
|
198
|
|
View Code Duplication |
private function addRandomUL(\DOMElement $element, $maxItems = 11, $maxLength = 4) |
|
|
|
|
199
|
|
|
{ |
200
|
|
|
$num = mt_rand(1, $maxItems); |
201
|
|
|
$ul = $element->ownerDocument->createElement(static::UL_TAG); |
202
|
|
|
for ($i = 0; $i < $num; $i++) { |
203
|
|
|
$li = $element->ownerDocument->createElement(static::LI_TAG); |
204
|
|
|
$lip = $element->ownerDocument->createElement(static::P_TAG); |
205
|
|
|
$lip->textContent = $this->getSentence(mt_rand(1, $maxLength)); |
206
|
|
|
$li->appendChild($lip); |
207
|
|
|
$ul->appendChild($li); |
208
|
|
|
} |
209
|
|
|
$element->appendChild($ul); |
210
|
|
|
} |
211
|
|
|
|
212
|
|
View Code Duplication |
private function addRandomOL(\DOMElement $element, $maxItems = 11, $maxLength = 4) |
|
|
|
|
213
|
|
|
{ |
214
|
|
|
$num = mt_rand(1, $maxItems); |
215
|
|
|
$ul = $element->ownerDocument->createElement(static::OL_TAG); |
216
|
|
|
for ($i = 0; $i < $num; $i++) { |
217
|
|
|
$li = $element->ownerDocument->createElement(static::LI_TAG); |
218
|
|
|
$lip = $element->ownerDocument->createElement(static::P_TAG); |
219
|
|
|
$lip->textContent = $this->getSentence(mt_rand(1, $maxLength)); |
220
|
|
|
$li->appendChild($lip); |
221
|
|
|
$ul->appendChild($li); |
222
|
|
|
} |
223
|
|
|
$element->appendChild($ul); |
224
|
|
|
} |
225
|
|
|
|
226
|
|
View Code Duplication |
protected function wrapInParagraph(\DOMElement $element, \DOMElement $parent, $maxLength = 10) |
|
|
|
|
227
|
|
|
{ |
228
|
|
|
$p = $element->ownerDocument->createElement(static::P_TAG); |
229
|
|
|
$chance = mt_rand(1, 4); |
230
|
|
|
if ($chance == 1 || $chance == 4) { |
231
|
|
|
$text = $element->ownerDocument->createTextNode($this->getSentence(mt_rand(1, $maxLength)) . ' '); |
232
|
|
|
$p->appendChild($text); |
233
|
|
|
} |
234
|
|
|
$p->appendChild($element); |
235
|
|
|
if ($chance == 2 || $chance == 4) { |
236
|
|
|
$text = $element->ownerDocument->createTextNode(' ' . $this->getSentence(mt_rand(1, $maxLength))); |
237
|
|
|
$p->appendChild($text); |
238
|
|
|
} |
239
|
|
|
$parent->appendChild($p); |
240
|
|
|
} |
241
|
|
|
|
242
|
|
|
protected function getSentence($nbWords = 6, $variableNbWords = true) |
243
|
|
|
{ |
244
|
|
|
return $this->generator->sentence($nbWords, $variableNbWords); |
245
|
|
|
} |
246
|
|
|
|
247
|
|
|
protected function getUrl() |
248
|
|
|
{ |
249
|
|
|
return $this->generator->url; |
250
|
|
|
} |
251
|
|
|
} |
252
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.