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

167
            $descEditor = new \XoopsFormDhtmlTextArea(ucfirst($options['name']), $options['name'], $options['value'], '100%', /** @scrutinizer ignore-type */ '100%');
Loading history...
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

167
            $descEditor = new \XoopsFormDhtmlTextArea(ucfirst($options['name']), $options['name'], $options['value'], /** @scrutinizer ignore-type */ '100%', '100%');
Loading history...
168
        }
169
170
        //        $form->addElement($descEditor);
171
172
        return $descEditor;
173
    }
174
175
    //--------------- Custom module methods -----------------------------
176
177
    /**
178
     * @param $about
179
     * @return string
180
     */
181
    public static function MakeDonationForm($about)
182
    {
183
        $donationform = [
184
            0 => '<form name="donation" id="donation" action="http://www.txmodxoops.org/modules/xdonations/" method="post" onsubmit="return xoopsFormValidate_donation();">',
185
            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>',
186
            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>', 'D' => '',
187
            3 => '',
188
            4 => '<!-- Start Form Validation JavaScript //-->
189
<script type="text/javascript">
190
<!--//
191
function xoopsFormValidate_donation() { var myform = window.document.donation; 
192
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;
193
}
194
//--></script>
195
<!-- End Form Validation JavaScript //-->',
196
        ];
197
        $paypalform = [
198
            0 => '<form action="https://www.paypal.com/cgi-bin/webscr" method="post">',
199
            1 => '<input name="cmd" value="_s-xclick" type="hidden">',
200
            2 => '<input name="hosted_button_id" value="%s" type="hidden">',
201
            3 => '<img alt="" src="https://www.paypal.com/fr_FR/i/scr/pixel.gif" height="1" border="0" width="1">',
202
            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">',
203
            5 => '</form>',
204
        ];
205
        for ($key = 0; $key <= 4; ++$key) {
206
            switch ($key) {
207
                case 2:
208
                    $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'));
209
                    break;
210
            }
211
        }
212
        $aboutRes = '';
213
        $istart = mb_strpos($about, $paypalform[0], 1);
214
        $iend = mb_strpos($about, $paypalform[5], $istart + 1) + mb_strlen($paypalform[5]) - 1;
215
        $aboutRes .= mb_substr($about, 0, $istart - 1);
216
        $aboutRes .= implode("\n", $donationform);
217
        $aboutRes .= mb_substr($about, $iend + 1, mb_strlen($about) - $iend - 1);
218
219
        return $aboutRes;
220
    }
221
222
    /**
223
     * @param $str
224
     *
225
     * @return string
226
     */
227
    public static function UcFirstAndToLower($str)
228
    {
229
        return ucfirst(mb_strtolower(trim($str)));
230
    }
231
}
232