Passed
Pull Request — master (#144)
by Michael
03:10
created

Utility::truncateHtml()   F

Complexity

Conditions 19
Paths 194

Size

Total Lines 89
Code Lines 47

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 19
eloc 47
nc 194
nop 5
dl 0
loc 89
rs 3.7333
c 1
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace XoopsModules\Tdmcreate;
4
5
/*
6
 Utility Class Definition
7
8
 You may not change or alter any portion of this comment or credits of
9
 supporting developers from this source code or any supporting source code
10
 which is considered copyrighted (c) material of the original comment or credit
11
 authors.
12
13
 This program is distributed in the hope that it will be useful, but
14
 WITHOUT ANY WARRANTY; without even the implied warranty of
15
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16
 */
17
/**
18
 * Module:  xSitemap
19
 *
20
 * @package      \module\xsitemap\class
21
 * @license      http://www.fsf.org/copyleft/gpl.html GNU public license
22
 * @copyright    https://xoops.org 2001-2017 &copy; XOOPS Project
23
 * @author       ZySpec <[email protected]>
24
 * @author       Mamba <[email protected]>
25
 * @since        File available since version 1.54
26
 */
27
use XoopsModules\Tdmcreate;
28
29
/**
30
 * Class Utility
31
 */
32
class Utility
33
{
34
    use Common\VersionChecks; //checkVerXoops, checkVerPhp Traits
0 ignored issues
show
introduced by
The trait XoopsModules\Tdmcreate\Common\VersionChecks requires some properties which are not provided by XoopsModules\Tdmcreate\Utility: $tag_name, $prerelease
Loading history...
35
    use Common\ServerStats; // getServerStats Trait
36
    use Common\FilesManagement; // Files Management Trait
37
38
    /**
39
     * truncateHtml can truncate a string up to a number of characters while preserving whole words and HTML tags
40
     * www.gsdesign.ro/blog/cut-html-string-without-breaking-the-tags
41
     * www.cakephp.org
42
     *
43
     * @param string  $text         String to truncate.
44
     * @param int $length       Length of returned string, including ellipsis.
45
     * @param string  $ending       Ending to be appended to the trimmed string.
46
     * @param bool $exact        If false, $text will not be cut mid-word
47
     * @param bool $considerHtml If true, HTML tags would be handled correctly
48
     *
49
     * @return string Trimmed string.
50
     */
51
    public static function truncateHtml($text, $length = 100, $ending = '...', $exact = false, $considerHtml = true)
52
    {
53
        if ($considerHtml) {
54
            // if the plain text is shorter than the maximum length, return the whole text
55
            if (mb_strlen(preg_replace('/<.*?' . '>/', '', $text)) <= $length) {
56
                return $text;
57
            }
58
            // splits all html-tags to scanable lines
59
            preg_match_all('/(<.+?' . '>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER);
60
            $total_length = mb_strlen($ending);
61
            $open_tags = [];
62
            $truncate = '';
63
            foreach ($lines as $line_matchings) {
64
                // if there is any html-tag in this line, handle it and add it (uncounted) to the output
65
                if (!empty($line_matchings[1])) {
66
                    // if it's an "empty element" with or without xhtml-conform closing slash
67
                    if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) {
68
                        // do nothing
69
                        // if tag is a closing tag
70
                    } elseif (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) {
71
                        // delete tag from $open_tags list
72
                        $pos = array_search($tag_matchings[1], $open_tags, true);
73
                        if (false !== $pos) {
74
                            unset($open_tags[$pos]);
75
                        }
76
                        // if tag is an opening tag
77
                    } elseif (preg_match('/^<\s*([^\s>!]+).*?' . '>$/s', $line_matchings[1], $tag_matchings)) {
78
                        // add tag to the beginning of $open_tags list
79
                        array_unshift($open_tags, mb_strtolower($tag_matchings[1]));
80
                    }
81
                    // add html-tag to $truncate'd text
82
                    $truncate .= $line_matchings[1];
83
                }
84
                // calculate the length of the plain text part of the line; handle entities as one character
85
                $content_length = mb_strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', ' ', $line_matchings[2]));
86
                if ($total_length + $content_length > $length) {
87
                    // the number of characters which are left
88
                    $left = $length - $total_length;
89
                    $entities_length = 0;
90
                    // search for html entities
91
                    if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) {
92
                        // calculate the real length of all entities in the legal range
93
                        foreach ($entities[0] as $entity) {
94
                            if ($left >= $entity[1] + 1 - $entities_length) {
95
                                $left--;
96
                                $entities_length += mb_strlen($entity[0]);
97
                            } else {
98
                                // no more characters left
99
                                break;
100
                            }
101
                        }
102
                    }
103
                    $truncate .= mb_substr($line_matchings[2], 0, $left + $entities_length);
104
                    // maximum lenght is reached, so get off the loop
105
                    break;
106
                }
107
                $truncate .= $line_matchings[2];
108
                $total_length += $content_length;
109
110
                // if the maximum length is reached, get off the loop
111
                if ($total_length >= $length) {
112
                    break;
113
                }
114
            }
115
        } else {
116
            if (mb_strlen($text) <= $length) {
117
                return $text;
118
            }
119
            $truncate = mb_substr($text, 0, $length - mb_strlen($ending));
120
        }
121
        // if the words shouldn't be cut in the middle...
122
        if (!$exact) {
123
            // ...search the last occurance of a space...
124
            $spacepos = mb_strrpos($truncate, ' ');
125
            if (isset($spacepos)) {
126
                // ...and cut the text in this position
127
                $truncate = mb_substr($truncate, 0, $spacepos);
128
            }
129
        }
130
        // add the defined ending to the text
131
        $truncate .= $ending;
132
        if ($considerHtml) {
133
            // close all unclosed html-tags
134
            foreach ($open_tags as $tag) {
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $open_tags does not seem to be defined for all execution paths leading up to this point.
Loading history...
135
                $truncate .= '</' . $tag . '>';
136
            }
137
        }
138
139
        return $truncate;
140
    }
141
142
    /**
143
     * @param \Xmf\Module\Helper $helper
144
     * @param array|null $options
145
     * @return \XoopsFormDhtmlTextArea|\XoopsFormEditor
146
     */
147
    public static function getEditor($helper = null, $options = null)
148
    {
149
        /** @var Tdmcreate\Helper $helper */
150
        if (null === $options) {
151
            $options = [];
152
            $options['name'] = 'Editor';
153
            $options['value'] = 'Editor';
154
            $options['rows'] = 10;
155
            $options['cols'] = '100%';
156
            $options['width'] = '100%';
157
            $options['height'] = '400px';
158
        }
159
160
        $isAdmin = $helper->isUserAdmin();
161
162
        if (class_exists('XoopsFormEditor')) {
163
            if ($isAdmin) {
164
                $descEditor = new \XoopsFormEditor(ucfirst($options['name']), $helper->getConfig('editorAdmin'), $options, $nohtml = false, $onfailure = 'textarea');
165
            } else {
166
                $descEditor = new \XoopsFormEditor(ucfirst($options['name']), $helper->getConfig('editorUser'), $options, $nohtml = false, $onfailure = 'textarea');
167
            }
168
        } else {
169
            $descEditor = new \XoopsFormDhtmlTextArea(ucfirst($options['name']), $options['name'], $options['value'], '100%', '100%');
0 ignored issues
show
Bug introduced by
'100%' of type string is incompatible with the type integer expected by parameter $rows of XoopsFormDhtmlTextArea::__construct(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

169
            $descEditor = new \XoopsFormDhtmlTextArea(ucfirst($options['name']), $options['name'], $options['value'], /** @scrutinizer ignore-type */ '100%', '100%');
Loading history...
Bug introduced by
'100%' of type string is incompatible with the type integer expected by parameter $cols of XoopsFormDhtmlTextArea::__construct(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

169
            $descEditor = new \XoopsFormDhtmlTextArea(ucfirst($options['name']), $options['name'], $options['value'], '100%', /** @scrutinizer ignore-type */ '100%');
Loading history...
170
        }
171
172
        //        $form->addElement($descEditor);
173
174
        return $descEditor;
175
    }
176
177
    //--------------- Custom module methods -----------------------------
178
179
    /**
180
     * @param $about
181
     * @return string
182
     */
183
    public static function MakeDonationForm($about)
184
    {
185
        $donationform = [
186
            0 => '<form name="donation" id="donation" action="http://www.txmodxoops.org/modules/xdonations/" method="post" onsubmit="return xoopsFormValidate_donation();">',
187
            1 => '<table class="outer" cellspacing="1" width="100%"><tbody><tr><th colspan="2">' . _AM_TDMCREATE_ABOUT_MAKE_DONATION . '</th></tr><tr align="left" valign="top"><td class="head"><div class="xoops-form-element-caption-required"><span class="caption-text">' . _AM_TDMCREATE_DONATION_AMOUNT . '</span><span class="caption-marker">*</span></div></td><td class="even"><select size="1" name="item[A][amount]" id="item[A][amount]" title="Donation Amount"><option value="5">5.00 EUR</option><option value="10">10.00 EUR</option><option value="20">20.00 EUR</option><option value="40">40.00 EUR</option><option value="60">60.00 EUR</option><option value="80">80.00 EUR</option><option value="90">90.00 EUR</option><option value="100">100.00 EUR</option><option value="200">200.00 EUR</option></select></td></tr><tr align="left" valign="top"><td class="head"></td><td class="even"><input class="formButton" name="submit" id="submit" value="' . _SUBMIT . '" title="' . _SUBMIT . '" type="submit"></td></tr></tbody></table>',
188
            2 => '<input name="op" id="op" value="createinvoice" type="hidden"><input name="plugin" id="plugin" value="donations" type="hidden"><input name="donation" id="donation" value="1" type="hidden"><input name="drawfor" id="drawfor" value="Chronolabs Co-Operative" type="hidden"><input name="drawto" id="drawto" value="%s" type="hidden"><input name="drawto_email" id="drawto_email" value="%s" type="hidden"><input name="key" id="key" value="%s" type="hidden"><input name="currency" id="currency" value="EUR" type="hidden"><input name="weight_unit" id="weight_unit" value="kgs" type="hidden"><input name="item[A][cat]" id="item[A][cat]" value="XDN%s" type="hidden"><input name="item[A][name]" id="item[A][name]" value="Donation for %s" type="hidden"><input name="item[A][quantity]" id="item[A][quantity]" value="1" type="hidden"><input name="item[A][shipping]" id="item[A][shipping]" value="0" type="hidden"><input name="item[A][handling]" id="item[A][handling]" value="0" type="hidden"><input name="item[A][weight]" id="item[A][weight]" value="0" type="hidden"><input name="item[A][tax]" id="item[A][tax]" value="0" type="hidden"><input name="return" id="return" value="http://www.txmodxoops.org/modules/xdonations/success.php" type="hidden"><input name="cancel" id="cancel" value="http://www.txmodxoops.org/modules/xdonations/success.php" type="hidden"></form>',
189
'D' => '',
190
            3 => '',
191
            4 => '<!-- Start Form Validation JavaScript //-->
192
<script type="text/javascript">
193
<!--//
194
function xoopsFormValidate_donation() { var myform = window.document.donation; 
195
var hasSelected = false; var selectBox = myform.item[A][amount];for (i = 0; i < selectBox.options.length; i++ ) { if (selectBox.options[i].selected === true && selectBox.options[i].value != \'\') { hasSelected = true; break; } }if (!hasSelected) { window.alert("Please enter Donation Amount"); selectBox.focus(); return false; }return true;
196
}
197
//--></script>
198
<!-- End Form Validation JavaScript //-->',
199
        ];
200
        $paypalform = [
201
            0 => '<form action="https://www.paypal.com/cgi-bin/webscr" method="post">',
202
            1 => '<input name="cmd" value="_s-xclick" type="hidden">',
203
            2 => '<input name="hosted_button_id" value="%s" type="hidden">',
204
            3 => '<img alt="" src="https://www.paypal.com/fr_FR/i/scr/pixel.gif" height="1" border="0" width="1">',
205
            4 => '<input src="https://www.paypal.com/en_US/i/btn/btn_donate_LG.gif" name="submit" alt="PayPal - The safer, easier way to pay online!" border="0" type="image">',
206
            5 => '</form>',
207
        ];
208
        for ($key = 0; $key <= 4; ++$key) {
209
            switch ($key) {
210
                case 2:
211
                    $donationform[$key] = sprintf($donationform[$key], $GLOBALS['xoopsConfig']['sitename'] . ' - ' . ('' != $GLOBALS['xoopsUser']->getVar('name') ? $GLOBALS['xoopsUser']->getVar('name') . ' [' . $GLOBALS['xoopsUser']->getVar('uname') . ']' : $GLOBALS['xoopsUser']->getVar('uname')), $GLOBALS['xoopsUser']->getVar('email'), XOOPS_LICENSE_KEY, mb_strtoupper($GLOBALS['xoopsModule']->getVar('dirname')), mb_strtoupper($GLOBALS['xoopsModule']->getVar('dirname')) . ' ' . $GLOBALS['xoopsModule']->getVar('name'));
212
                    break;
213
            }
214
        }
215
        $aboutRes = '';
216
        $istart = mb_strpos($about, $paypalform[0], 1);
217
        $iend = mb_strpos($about, $paypalform[5], $istart + 1) + mb_strlen($paypalform[5]) - 1;
218
        $aboutRes .= mb_substr($about, 0, $istart - 1);
219
        $aboutRes .= implode("\n", $donationform);
220
        $aboutRes .= mb_substr($about, $iend + 1, mb_strlen($about) - $iend - 1);
221
222
        return $aboutRes;
223
    }
224
225
    /**
226
     * @param $str
227
     *
228
     * @return string
229
     */
230
    public static function UcFirstAndToLower($str)
231
    {
232
        return ucfirst(mb_strtolower(trim($str)));
233
    }
234
}
235