Completed
Push — master ( 2b4e5c...da5b2c )
by frank
02:20
created

autoptimizeScripts   D

Complexity

Total Complexity 85

Size/Duplication

Total Lines 418
Duplicated Lines 3.83 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
dl 16
loc 418
rs 4.8717
c 0
b 0
f 0
wmc 85
lcom 1
cbo 3

8 Methods

Rating   Name   Duplication   Size   Complexity  
F read() 16 169 35
C minify() 0 72 21
A cache() 0 9 2
B getcontent() 0 42 4
D ismergeable() 0 32 9
C ismovable() 0 26 8
A movetolast() 0 11 3
A should_aggregate() 0 10 3

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like autoptimizeScripts often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use autoptimizeScripts, and based on these observations, apply Extract Interface, too.

1
<?php
2
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
3
4
class autoptimizeScripts extends autoptimizeBase {
5
    private $scripts = array();
6
    private $dontmove = array('document.write','html5.js','show_ads.js','google_ad','blogcatalog.com/w','tweetmeme.com/i','mybloglog.com/','histats.com/js','ads.smowtion.com/ad.js','statcounter.com/counter/counter.js','widgets.amung.us','ws.amazon.com/widgets','media.fastclick.net','/ads/','comment-form-quicktags/quicktags.php','edToolbar','intensedebate.com','scripts.chitika.net/','_gaq.push','jotform.com/','admin-bar.min.js','GoogleAnalyticsObject','plupload.full.min.js','syntaxhighlighter','adsbygoogle','gist.github.com','_stq','nonce','post_id','data-noptimize');
7
    private $domove = array('gaJsHost','load_cmc','jd.gallery.transitions.js','swfobject.embedSWF(','tiny_mce.js','tinyMCEPreInit.go');
8
    private $domovelast = array('addthis.com','/afsonline/show_afs_search.js','disqus.js','networkedblogs.com/getnetworkwidget','infolinks.com/js/','jd.gallery.js.php','jd.gallery.transitions.js','swfobject.embedSWF(','linkwithin.com/widget.js','tiny_mce.js','tinyMCEPreInit.go');
9
    private $trycatch = false;
10
    private $alreadyminified = false;
11
    private $forcehead = true;
12
    private $include_inline = false;
13
    private $jscode = '';
14
    private $url = '';
15
    private $move = array('first' => array(), 'last' => array());
16
    private $restofcontent = '';
17
    private $md5hash = '';
18
    private $whitelist = '';
19
    private $jsremovables = array();
20
    private $inject_min_late = '';
21
    
22
    //Reads the page and collects script tags
23
    public function read($options) {
24
        $noptimizeJS = apply_filters( 'autoptimize_filter_js_noptimize', false, $this->content );
25
        if ($noptimizeJS) return false;
26
27
        // only optimize known good JS?
28
        $whitelistJS = apply_filters( 'autoptimize_filter_js_whitelist', "" );
29
        if (!empty($whitelistJS)) {
30
            $this->whitelist = array_filter(array_map('trim',explode(",",$whitelistJS)));
0 ignored issues
show
Documentation Bug introduced by
It seems like array_filter(array_map('...de(',', $whitelistJS))) of type array is incompatible with the declared type string of property $whitelist.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
31
        }
32
33
        // is there JS we should simply remove
34
        $removableJS = apply_filters( 'autoptimize_filter_js_removables', '');
35 View Code Duplication
        if (!empty($removableJS)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
36
            $this->jsremovables = array_filter(array_map('trim',explode(",",$removableJS)));
37
        }
38
39
        // only header?
40 View Code Duplication
        if( apply_filters('autoptimize_filter_js_justhead',$options['justhead']) == true ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
41
            $content = explode('</head>',$this->content,2);
42
            $this->content = $content[0].'</head>';
43
            $this->restofcontent = $content[1];
44
        }
45
        
46
        // include inline?
47
        if( apply_filters('autoptimize_js_include_inline',$options['include_inline']) == true ) {
48
            $this->include_inline = true;
49
        }
50
51
        // filter to "late inject minified JS", default to true for now (it is faster)
52
        $this->inject_min_late = apply_filters('autoptimize_filter_js_inject_min_late',true);
53
54
        // filters to override hardcoded do(nt)move(last) array contents (array in, array out!)
0 ignored issues
show
Unused Code Comprehensibility introduced by
37% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
55
        $this->dontmove = apply_filters( 'autoptimize_filter_js_dontmove', $this->dontmove );        
56
        $this->domovelast = apply_filters( 'autoptimize_filter_js_movelast', $this->domovelast );
57
        $this->domove = apply_filters( 'autoptimize_filter_js_domove', $this->domove );
58
59
        // get extra exclusions settings or filter
60
        $excludeJS = $options['js_exclude'];
61
        $excludeJS = apply_filters( 'autoptimize_filter_js_exclude', $excludeJS );
62
        if ($excludeJS!=="") {
63
            if (is_array($excludeJS)) {
64
                if(($removeKeys = array_keys($excludeJS,"remove")) !== false) {
65
                    foreach ($removeKeys as $removeKey) {
66
                        unset($excludeJS[$removeKey]);
67
                        $this->jsremovables[]=$removeKey;
68
                    }
69
                }
70
                $exclJSArr = array_keys($excludeJS);
71
            } else {
72
                $exclJSArr = array_filter(array_map('trim',explode(",",$excludeJS)));
73
            }
74
            $this->dontmove = array_merge($exclJSArr,$this->dontmove);
75
        }
76
77
        //Should we add try-catch?
78
        if($options['trycatch'] == true)
79
            $this->trycatch = true;
80
81
        // force js in head?    
82
        if($options['forcehead'] == true) {
83
            $this->forcehead = true;
84
        } else {
85
            $this->forcehead = false;
86
        }
87
        $this->forcehead = apply_filters( 'autoptimize_filter_js_forcehead', $this->forcehead );
88
89
        // get cdn url
90
        $this->cdn_url = $options['cdn_url'];
0 ignored issues
show
Bug introduced by
The property cdn_url does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
91
            
92
        // noptimize me
93
        $this->content = $this->hide_noptimize($this->content);
94
95
        // Save IE hacks
96
        $this->content = $this->hide_iehacks($this->content);
97
98
        // comments
99
        $this->content = $this->hide_comments($this->content);
100
101
        // Get script files
102
        if (preg_match_all('#<script.*</script>#Usmi',$this->content,$matches)) {
103
            foreach($matches[0] as $tag) {
104
                // only consider script aggregation for types whitelisted in should_aggregate-function
105
                if( !$this->should_aggregate($tag) ) {
106
                    $tag='';
107
                    continue;
108
                }
109
110
                if (preg_match('#<script[^>]*src=("|\')([^>]*)("|\')#Usmi',$tag,$source)) {
111
                    // non-inline script
112 View Code Duplication
                    if ($this->isremovable($tag,$this->jsremovables)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
113
                        $this->content = str_replace($tag,'',$this->content);
114
                        continue;
115
                    }
116
                    
117
                    $url = current(explode('?',$source[2],2));
118
                    $path = $this->getpath($url);
119
                    if($path !== false && preg_match('#\.js$#',$path) && $this->ismergeable($tag)) {
120
                        // ok to optimize, add to array
121
                        $this->scripts[] = $path;
122
                    } else {
123
                        // non-mergeable script (excluded or dynamic or external)
124
                        if (is_array($excludeJS)) {
125
                            // should we add flags?
126
                            $origTag = $tag;
127
                            foreach ($excludeJS as $exclTag => $exclFlags) {
128
                                if ( strpos($origTag,$exclTag)!==false && in_array($exclFlags,array("async","defer")) ) {
129
                                   $tag = str_replace('<script ','<script '.$exclFlags.' ',$tag);
130
                                }
131
                            }
132
                        }
133
                        if($this->ismovable($tag)) {
134
                            // can be moved, flags and all
135
                            if($this->movetolast($tag))    {
136
                                $this->move['last'][] = $tag;
137
                            } else {
138
                                $this->move['first'][] = $tag;
139
                            }
140
                        } else {
141
                            // cannot be moved, so if flag was added re-inject altered tag immediately
142
                            if ($origTag && $origTag !== $tag) {
143
                                $this->content = str_replace($origTag,$tag,$this->content);
0 ignored issues
show
Bug introduced by
The variable $origTag does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
144
                                $origTag = '';
145
                            }
146
                            // and forget about the $tag (not to be touched any more)
147
                            $tag = '';
148
                        }
149
                    }
150
                } else {
151
                    // Inline script
152 View Code Duplication
                    if ($this->isremovable($tag,$this->jsremovables)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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
                        $this->content = str_replace($tag,'',$this->content);
154
                        continue;
155
                    }
156
                    
157
                    // unhide comments, as javascript may be wrapped in comment-tags for old times' sake
158
                    $tag = $this->restore_comments($tag);
159
                    if($this->ismergeable($tag) && ( $this->include_inline )) {
160
                        preg_match('#<script.*>(.*)</script>#Usmi',$tag,$code);
161
                        $code = preg_replace('#.*<!\[CDATA\[(?:\s*\*/)?(.*)(?://|/\*)\s*?\]\]>.*#sm','$1',$code[1]);
162
                        $code = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/','',$code);
163
                        $this->scripts[] = 'INLINE;'.$code;
164
                    } else {
165
                        // Can we move this?
166
                        $autoptimize_js_moveable = apply_filters( 'autoptimize_js_moveable', '', $tag );
167
                        if( $this->ismovable($tag) || $autoptimize_js_moveable !== '' ) {
168
                            if( $this->movetolast($tag) || $autoptimize_js_moveable === 'last' ) {
169
                                $this->move['last'][] = $tag;
170
                            } else {
171
                                $this->move['first'][] = $tag;
172
                            }
173
                        } else {
174
                            //We shouldn't touch this
175
                            $tag = '';
176
                        }
177
                    }
178
                    // re-hide comments to be able to do the removal based on tag from $this->content
179
                    $tag = $this->hide_comments($tag);
180
                }
181
                
182
                //Remove the original script tag
183
                $this->content = str_replace($tag,'',$this->content);
184
            }
185
            
186
            return true;
187
        }
188
    
189
        // No script files, great ;-)
190
        return false;
191
    }
192
    
193
    //Joins and optimizes JS
194
    public function minify() {
195
        foreach($this->scripts as $script) {
196
            if(preg_match('#^INLINE;#',$script)) {
197
                //Inline script
198
                $script = preg_replace('#^INLINE;#','',$script);
199
                $script = rtrim( $script, ";\n\t\r" ) . ';';
200
                //Add try-catch?
0 ignored issues
show
Unused Code Comprehensibility introduced by
50% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
201
                if($this->trycatch) {
202
                    $script = 'try{'.$script.'}catch(e){}';
203
                }
204
                $tmpscript = apply_filters( 'autoptimize_js_individual_script', $script, "" );
205
                if ( has_filter('autoptimize_js_individual_script') && !empty($tmpscript) ) {
206
                    $script=$tmpscript;
207
                    $this->alreadyminified=true;
208
                }
209
                $this->jscode .= "\n" . $script;
210
            } else {
211
                //External script
212
                if($script !== false && file_exists($script) && is_readable($script)) {
213
                    $scriptsrc = file_get_contents($script);
214
                    $scriptsrc = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$scriptsrc);
215
                    $scriptsrc = rtrim($scriptsrc,";\n\t\r").';';
216
                    //Add try-catch?
0 ignored issues
show
Unused Code Comprehensibility introduced by
50% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
217
                    if($this->trycatch) {
218
                        $scriptsrc = 'try{'.$scriptsrc.'}catch(e){}';
219
                    }
220
                    $tmpscriptsrc = apply_filters( 'autoptimize_js_individual_script', $scriptsrc, $script );
221
                    if ( has_filter('autoptimize_js_individual_script') && !empty($tmpscriptsrc) ) {
222
                        $scriptsrc=$tmpscriptsrc;
223
                        $this->alreadyminified=true;
224
                    } else if ((( strpos($script,"min.js") !== false ) || ( strpos($script,"wp-includes/js/jquery/jquery.js") !== false )) && ( $this->inject_min_late === true )) {
225
                        $scriptsrc="%%INJECTLATER%%".base64_encode($script)."|".md5($scriptsrc)."%%INJECTLATER%%";
226
                    }
227
                    $this->jscode .= "\n".$scriptsrc;
228
                }/*else{
0 ignored issues
show
Unused Code Comprehensibility introduced by
46% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
229
                    //Couldn't read JS. Maybe getpath isn't working?
230
                }*/
231
            }
232
        }
233
234
        //Check for already-minified code
235
        $this->md5hash = md5($this->jscode);
236
        $ccheck = new autoptimizeCache($this->md5hash,'js');
237
        if($ccheck->check()) {
238
            $this->jscode = $ccheck->retrieve();
0 ignored issues
show
Documentation Bug introduced by
It seems like $ccheck->retrieve() can also be of type false. However, the property $jscode is declared as type string. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
239
            return true;
240
        }
241
        unset($ccheck);
242
        
243
        //$this->jscode has all the uncompressed code now.
244
        if ($this->alreadyminified!==true) {
245
          if (class_exists('JSMin') && apply_filters( 'autoptimize_js_do_minify' , true)) {
246
            if (@is_callable(array("JSMin","minify"))) {
247
                $tmp_jscode = trim(JSMin::minify($this->jscode));
248
                if (!empty($tmp_jscode)) {
249
                    $this->jscode = $tmp_jscode;
250
                    unset($tmp_jscode);
251
                }
252
                $this->jscode = $this->inject_minified($this->jscode);
253
                $this->jscode = apply_filters( 'autoptimize_js_after_minify', $this->jscode );
254
                return true;
255
            } else {
256
                $this->jscode = $this->inject_minified($this->jscode);
257
                return false;
258
            }
259
          } else {
260
              $this->jscode = $this->inject_minified($this->jscode);
261
            return false;
262
          }
263
        }
264
        return true;
265
    }
266
    
267
    //Caches the JS in uncompressed, deflated and gzipped form.
268
    public function cache()    {
269
        $cache = new autoptimizeCache($this->md5hash,'js');
270
        if(!$cache->check()) {
271
            //Cache our code
272
            $cache->cache($this->jscode,'text/javascript');
273
        }
274
        $this->url = AUTOPTIMIZE_CACHE_URL.$cache->getname();
275
        $this->url = $this->url_replace_cdn($this->url);
276
    }
277
    
278
    // Returns the content
279
    public function getcontent() {
280
        // Restore the full content
281
        if(!empty($this->restofcontent)) {
282
            $this->content .= $this->restofcontent;
283
            $this->restofcontent = '';
284
        }
285
        
286
        // Add the scripts taking forcehead/ deferred (default) into account
287
        if($this->forcehead == true) {
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison === instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
288
            $replaceTag=array("</head>","before");
289
            $defer="";
290
        } else {
291
            $replaceTag=array("</body>","before");
292
            $defer="defer ";
293
        }
294
        
295
        $defer = apply_filters( 'autoptimize_filter_js_defer', $defer );
296
        $bodyreplacementpayload = '<script type="text/javascript" '.$defer.'src="'.$this->url.'"></script>';
297
        $bodyreplacementpayload = apply_filters('autoptimize_filter_js_bodyreplacementpayload',$bodyreplacementpayload);
298
299
        $bodyreplacement = implode('',$this->move['first']);
300
        $bodyreplacement .= $bodyreplacementpayload;
301
        $bodyreplacement .= implode('',$this->move['last']);
302
303
        $replaceTag = apply_filters( 'autoptimize_filter_js_replacetag', $replaceTag );
304
305
        if (strlen($this->jscode)>0) {
306
            $this->inject_in_html($bodyreplacement,$replaceTag);
307
        }
308
        
309
        // restore comments
310
        $this->content = $this->restore_comments($this->content);
311
312
        // Restore IE hacks
313
        $this->content = $this->restore_iehacks($this->content);
314
        
315
        // Restore noptimize
316
        $this->content = $this->restore_noptimize($this->content);
317
318
        // Return the modified HTML
319
        return $this->content;
320
    }
321
    
322
    // Checks against the white- and blacklists
323
    private function ismergeable($tag) {
324
        if (!empty($this->whitelist)) {
325
            foreach ($this->whitelist as $match) {
0 ignored issues
show
Bug introduced by
The expression $this->whitelist of type string is not traversable.
Loading history...
326
                if(strpos($tag,$match)!==false) {
327
                    return true;
328
                }
329
            }
330
            // no match with whitelist
331
            return false;
332
        } else {
333
            foreach($this->domove as $match) {
334
                if(strpos($tag,$match)!==false)    {
335
                    // Matched something
336
                    return false;
337
                }
338
            }
339
            
340
            if ($this->movetolast($tag)) {
341
                return false;
342
            }
343
            
344
            foreach($this->dontmove as $match) {
345
                if(strpos($tag,$match)!==false)    {
346
                    //Matched something
347
                    return false;
348
                }
349
            }
350
            
351
            // If we're here it's safe to merge
352
            return true;
353
        }
354
    }
355
    
356
    // Checks againstt the blacklist
357
    private function ismovable($tag) {
358
        if ($this->include_inline !== true || apply_filters('autoptimize_filter_js_unmovable',true)) {
359
            return false;
360
        }
361
        
362
        foreach($this->domove as $match) {
363
            if(strpos($tag,$match)!==false)    {
364
                // Matched something
365
                return true;
366
            }
367
        }
368
        
369
        if ($this->movetolast($tag)) {
370
            return true;
371
        }
372
        
373
        foreach($this->dontmove as $match) {
374
            if(strpos($tag,$match)!==false) {
375
                // Matched something
376
                return false;
377
            }
378
        }
379
        
380
        // If we're here it's safe to move
381
        return true;
382
    }
383
    
384
    private function movetolast($tag) {
385
        foreach($this->domovelast as $match) {
386
            if(strpos($tag,$match)!==false)    {
387
                // Matched, return true
0 ignored issues
show
Unused Code Comprehensibility introduced by
43% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
388
                return true;
389
            }
390
        }
391
        
392
        // Should be in 'first'
393
        return false;
394
    }
395
    
396
    /**
397
     * Determines wheter a <script> $tag should be aggregated or not.
398
     *
399
     * We consider these as "aggregation-safe" currently:
400
     * - script tags without a `type` attribute
401
     * - script tags with an explicit `type` of `text/javascript`, 'text/ecmascript', 
402
     *   'application/javascript' or 'application/ecmascript'
403
     *
404
     * Everything else should return false.
405
     *
406
     * @param string $tag
407
     * @return bool
408
     * 
409
     * original function by https://github.com/zytzagoo/ on his AO fork, thanks Tomas!
410
     */
411
    public function should_aggregate($tag) {
412
        preg_match('#<(script[^>]*)>#i',$tag,$scripttag);
413
        if ( strpos($scripttag[1], 'type')===false ) {
414
            return true;
415
        } else if ( preg_match('/type\s*=\s*["\']?(?:text|application)\/(?:javascript|ecmascript)["\']?/i', $scripttag[1]) ) {
416
            return true;
417
        } else {
418
            return false;
419
        }
420
    }
421
}
422