-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathhtml-minify-process.php
More file actions
executable file
·144 lines (113 loc) · 3.79 KB
/
html-minify-process.php
File metadata and controls
executable file
·144 lines (113 loc) · 3.79 KB
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php
class WP_HTML_Compression {
// // Settings
// $options = html_minify_get_theme_options();
// protected $compress_css = $options['ignore_css'] === 'on' ? false : true;
// protected $compress_js = false;
// protected $remove_comments = $options['ignore_comments'] === 'on' ? false : true;
// protected $info_comment = $options['exclude_info'] === 'on' ? false : true;
// Variables
protected $html;
public function __construct($html) {
if ( !empty($html) ) {
$this->parseHTML($html) ;
}
}
public function __toString() {
return $this->html;
}
protected function bottomComment($raw, $compressed) {
$raw = strlen($raw);
$compressed = strlen($compressed);
$savings = ($raw-$compressed) / $raw * 100;
$savings = round($savings, 2);
return '<!--HTML compressed, size saved ' . $savings . '%. From ' . $raw . ' bytes, now ' . $compressed . ' bytes-->';
}
protected function minifyHTML($html) {
// Settings
$options = html_minify_get_theme_options();
$compress_css = $options['ignore_css'] === 'on' ? false : true;
$compress_js = false;
$remove_comments = $options['ignore_comments'] === 'on' ? false : true;
$pattern = '/<(?<script>script).*?<\/script\s*>|<(?<style>style).*?<\/style\s*>|<!(?<comment>--).*?-->|<(?<tag>[\/\w.:-]*)(?:".*?"|\'.*?\'|[^\'">]+)*>|(?<text>((<[^!\/\w.:-])?[^<]*)+)|/si';
preg_match_all($pattern, $html, $matches, PREG_SET_ORDER);
$overriding = false;
$raw_tag = false;
// Variable reused for output
$html = '';
foreach ($matches as $token) {
$tag = (isset($token['tag'])) ? strtolower($token['tag']) : null;
$content = $token[0];
if (is_null($tag)) {
if ( !empty($token['script']) ) {
$strip = $compress_js;
}
else if ( !empty($token['style']) ) {
$strip = $compress_css;
}
else if ($content == '<!--wp-html-compression no compression-->') {
$overriding = !$overriding;
// Don't print the comment
continue;
}
else if ($remove_comments) {
if (!$overriding && $raw_tag != 'textarea') {
// Remove any HTML comments, except MSIE conditional comments
$content = preg_replace('/<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->).)*-->/s', '', $content);
}
}
}
else {
if ($tag == 'pre' || $tag == 'textarea') {
$raw_tag = $tag;
}
else if ($tag == '/pre' || $tag == '/textarea') {
$raw_tag = false;
}
else {
if ($raw_tag || $overriding) {
$strip = false;
}
else {
$strip = true;
// Remove any empty attributes, except:
// action, alt, content, src
$content = preg_replace('/(\s+)(\w++(?<!\baction|\balt|\bcontent|\bsrc)="")/', '$1', $content);
// Remove any space before the end of self-closing XHTML tags
// JavaScript excluded
$content = str_replace(' />', '/>', $content);
}
}
}
if ($strip) {
$content = $this->removeWhiteSpace($content);
}
$html .= $content;
}
return $html;
}
public function parseHTML($html) {
$this->html = $this->minifyHTML($html);
$options = html_minify_get_theme_options();
$info_comment = $options['exclude_info'] === 'on' ? false : true;
if ($info_comment) {
$this->html .= "\n" . $this->bottomComment($html, $this->html);
}
}
protected function removeWhiteSpace($str) {
$str = str_replace("\t", ' ', $str);
$str = str_replace("\n", '', $str);
$str = str_replace("\r", '', $str);
while (stristr($str, ' ')) {
$str = str_replace(' ', ' ', $str);
}
return $str;
}
}
function wp_html_compression_finish($html) {
return new WP_HTML_Compression($html);
}
function wp_html_compression_start() {
ob_start('wp_html_compression_finish');
}
add_action('get_header', 'wp_html_compression_start');