Completed
Pull Request — master (#2)
by
unknown
26:48 queued 18:40
created

RichText::addRandomH()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9

Duplication

Lines 9
Ratio 100 %

Importance

Changes 0
Metric Value
dl 9
loc 9
rs 9.9666
c 0
b 0
f 0
cc 1
nc 1
nop 2
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)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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