-
Notifications
You must be signed in to change notification settings - Fork 0
/
cssminifier.php
85 lines (59 loc) · 1.38 KB
/
cssminifier.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php
/*
@package: Magma PHP Minifier for JS and CSS
@author: Sören Meier <[email protected]>
@version: 0.1 <2019-07-05>
@docs: minifier.magma-lang.com/php/docs/
*/
namespace MagmaMinifier;
class CssMinifier {
public function go( string $str ) {
$str = str_replace( "\r", '', $str );
$str = preg_replace( '/\/\*(?!\!).*?\*\//m', '', $str );
$parts = $this->divideStr( $str );
$str = '';
foreach ( $parts as $p ) {
if ( $p[0] ) {
$str .= $p[1];
continue;
}
$s = preg_replace( '/(?<=;|{|}|,|:)\s+(?=\S|$)|(?<=\S)(?<!or|and)\s+(?={|\()/m', '', $p[1] );
$s = preg_replace( '/;}/m', '}', $s );
$str .= $s;
}
return $str;
}
protected function divideStr( $str ) {
$parts = [];
$buff = '';
$char = '';
$inBlock = false;
$esc = false;
$len = strlen( $str );
for ( $i = 0; $i < $len; $i++ ) {
$c = $str[$i];
if ( $esc ) {
$buff .= '\\'. $c;
$esc = false;
continue;
}
if ( $inBlock && $c === '\\' ) {
$esc = true;
continue;
}
if ( ( $inBlock && $c === $char ) || ( !$inBlock && ( $c === '"' || $c === "'" ) ) ) {
// block finished or started
$char = $inBlock ? $char : '';
$parts[] = [ $inBlock, $char. $buff. $char ];
$inBlock = !$inBlock;
$char = $c;
$buff = '';
continue;
}
$buff .= $c;
}
if ( strlen( $buff ) > 0 )
$parts[] = [ $inBlock, $buff ];
return $parts;
}
}