mirror of
https://github.com/mrclay/minify.git
synced 2025-08-06 14:16:28 +02:00
Minfy_HTML: all Unix newlines, replaces spaces with newlines in some tags to limit line lengths
Minify_CSS: fix Issue 49, uses newlines in common descendant selectors to limit line lengths All tests passing with shorter lines and no added bytes!
This commit is contained in:
@@ -113,9 +113,6 @@ class Minify_CSS {
|
|||||||
$css = preg_replace_callback('@\\s*/\\*([\\s\\S]*?)\\*/\\s*@'
|
$css = preg_replace_callback('@\\s*/\\*([\\s\\S]*?)\\*/\\s*@'
|
||||||
,array('Minify_CSS', '_commentCB'), $css);
|
,array('Minify_CSS', '_commentCB'), $css);
|
||||||
|
|
||||||
// compress whitespace.
|
|
||||||
$css = preg_replace('/\\s+/', ' ', $css);
|
|
||||||
|
|
||||||
// leave needed comments
|
// leave needed comments
|
||||||
$css = str_replace('/*keep*/', '/**/', $css);
|
$css = str_replace('/*keep*/', '/**/', $css);
|
||||||
|
|
||||||
@@ -169,6 +166,14 @@ class Minify_CSS {
|
|||||||
$css = preg_replace_callback('/font-family:([^;}]+)([;}])/'
|
$css = preg_replace_callback('/font-family:([^;}]+)([;}])/'
|
||||||
,array('Minify_CSS', '_fontFamilyCB'), $css);
|
,array('Minify_CSS', '_fontFamilyCB'), $css);
|
||||||
|
|
||||||
|
$css = preg_replace('/@import\\s+url/', '@import url', $css);
|
||||||
|
|
||||||
|
// replace any ws involving newlines with a single newline
|
||||||
|
$css = preg_replace('/[ \\t]*\\n+\\s*/', "\n", $css);
|
||||||
|
|
||||||
|
// separate common descendent selectors with newlines (to limit line lengths)
|
||||||
|
$css = preg_replace('/([\\w#\\.]+)\\s+([\\w#\\.]+){/', "$1\n$2{", $css);
|
||||||
|
|
||||||
$rewrite = false;
|
$rewrite = false;
|
||||||
if (isset($options['prependRelativePath'])) {
|
if (isset($options['prependRelativePath'])) {
|
||||||
self::$_tempPrepend = $options['prependRelativePath'];
|
self::$_tempPrepend = $options['prependRelativePath'];
|
||||||
@@ -178,7 +183,7 @@ class Minify_CSS {
|
|||||||
$rewrite = true;
|
$rewrite = true;
|
||||||
}
|
}
|
||||||
if ($rewrite) {
|
if ($rewrite) {
|
||||||
$css = preg_replace_callback('/@import ([\'"])(.*?)[\'"]/'
|
$css = preg_replace_callback('/@import\\s+([\'"])(.*?)[\'"]/'
|
||||||
,array('Minify_CSS', '_urlCB'), $css);
|
,array('Minify_CSS', '_urlCB'), $css);
|
||||||
$css = preg_replace_callback('/url\\(([^\\)]+)\\)/'
|
$css = preg_replace_callback('/url\\(([^\\)]+)\\)/'
|
||||||
,array('Minify_CSS', '_urlCB'), $css);
|
,array('Minify_CSS', '_urlCB'), $css);
|
||||||
@@ -187,6 +192,19 @@ class Minify_CSS {
|
|||||||
return trim($css);
|
return trim($css);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace what looks like a set of selectors
|
||||||
|
*
|
||||||
|
* @param array $m regex matches
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function _selectorsCB($m)
|
||||||
|
{
|
||||||
|
// remove ws around the combinators
|
||||||
|
return preg_replace('/\\s*([,>+~])\\s*/', '$1', $m[0]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var bool Are we "in" a hack?
|
* @var bool Are we "in" a hack?
|
||||||
*
|
*
|
||||||
@@ -251,19 +269,6 @@ class Minify_CSS {
|
|||||||
return ''; // remove all other comments
|
return ''; // remove all other comments
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace what looks like a set of selectors
|
|
||||||
*
|
|
||||||
* @param array $m regex matches
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected static function _selectorsCB($m)
|
|
||||||
{
|
|
||||||
// remove ws around the combinators
|
|
||||||
return preg_replace('/\\s*([,>+~])\\s*/', '$1', $m[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static function _urlCB($m)
|
protected static function _urlCB($m)
|
||||||
{
|
{
|
||||||
$isImport = (0 === strpos($m[0], '@import'));
|
$isImport = (0 === strpos($m[0], '@import'));
|
||||||
|
@@ -34,7 +34,7 @@ class Minify_HTML {
|
|||||||
self::$_jsMinifier = $options['jsMinifier'];
|
self::$_jsMinifier = $options['jsMinifier'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$html = trim($html);
|
$html = str_replace("\r\n", "\n", trim($html));
|
||||||
|
|
||||||
self::$_isXhtml = (false !== strpos($html, '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML'));
|
self::$_isXhtml = (false !== strpos($html, '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML'));
|
||||||
|
|
||||||
@@ -77,6 +77,9 @@ class Minify_HTML {
|
|||||||
.'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)'
|
.'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)'
|
||||||
.'|ul)\\b[^>]*>)/i', '$1', $html);
|
.'|ul)\\b[^>]*>)/i', '$1', $html);
|
||||||
|
|
||||||
|
// line break within some tags to limit line lengths
|
||||||
|
$html = preg_replace('/(<(?:div|span|a|p|input)) ([^>]+>)/i', "$1\n$2", $html);
|
||||||
|
|
||||||
// remove ws outside of all elements
|
// remove ws outside of all elements
|
||||||
$html = preg_replace_callback(
|
$html = preg_replace_callback(
|
||||||
'/>([^<]+)</'
|
'/>([^<]+)</'
|
||||||
|
4
web/test/_test_files/css/hacks.min.css
vendored
4
web/test/_test_files/css/hacks.min.css
vendored
@@ -1 +1,3 @@
|
|||||||
/*\*/a{}.foo{color:red}/**//*\*//*/@import "ie5mac.css";/**//*/*/.foo{display:block}/**//*/*//*/.foo{display:crazy}/**/div{width:140px;width/**/:/**/100px;width:/**/100px}html>/**/body{}div{width:400px;voice-family:"\"}\"";voice-family:inherit;width:300px}div{filter:chroma(color=#aabbcc);filter:mask(color=#000000) shadow(color=#9BAD71, direction=135) chroma(color=#000000)}@media screen{/*\*/* html div#page{height:1%}/**/}foo{_height:20px;*height:15px}
|
/*\*/a{}.foo{color:red}/**//*\*//*/@import "ie5mac.css";/**//*/*/.foo{display:block}/**//*/*//*/.foo{display:crazy}/**/div{width:140px;width/**/:/**/100px;width:/**/100px}html>/**/body{}div{width:400px;voice-family:"\"}\"";voice-family:inherit;width:300px}div{filter:chroma(color=#aabbcc);filter:mask(color=#000000) shadow(color=#9BAD71, direction=135) chroma(color=#000000)}@media
|
||||||
|
screen{/*\*/* html
|
||||||
|
div#page{height:1%}/**/}foo{_height:20px;*height:15px}
|
38
web/test/_test_files/css/selectors.min.css
vendored
38
web/test/_test_files/css/selectors.min.css
vendored
@@ -1 +1,37 @@
|
|||||||
* E[foo] E[foo="bar"] E[foo~="bar"] E[foo^="bar"] E[foo$="bar"] E[foo*="bar"] E[hreflang|="en"] E:root E:nth-child(n) E:nth-last-child(n) E:nth-of-type(n) E:nth-last-of-type(n) E:first-child E:last-child E:first-of-type E:last-of-type E:only-child E:only-of-type E:empty E:link E:visited E:active E:hover E:focus E:target E:lang(fr) E:enabled E:disabled E:checked E::first-line E::first-letter E::selection E::before E::after E.warning#myid E:not(s)>F+F~F{color:red}
|
*
|
||||||
|
E[foo]
|
||||||
|
E[foo="bar"]
|
||||||
|
E[foo~="bar"]
|
||||||
|
E[foo^="bar"]
|
||||||
|
E[foo$="bar"]
|
||||||
|
E[foo*="bar"]
|
||||||
|
E[hreflang|="en"]
|
||||||
|
E:root
|
||||||
|
E:nth-child(n)
|
||||||
|
E:nth-last-child(n)
|
||||||
|
E:nth-of-type(n)
|
||||||
|
E:nth-last-of-type(n)
|
||||||
|
E:first-child
|
||||||
|
E:last-child
|
||||||
|
E:first-of-type
|
||||||
|
E:last-of-type
|
||||||
|
E:only-child
|
||||||
|
E:only-of-type
|
||||||
|
E:empty
|
||||||
|
E:link
|
||||||
|
E:visited
|
||||||
|
E:active
|
||||||
|
E:hover
|
||||||
|
E:focus
|
||||||
|
E:target
|
||||||
|
E:lang(fr)
|
||||||
|
E:enabled
|
||||||
|
E:disabled
|
||||||
|
E:checked
|
||||||
|
E::first-line
|
||||||
|
E::first-letter
|
||||||
|
E::selection
|
||||||
|
E::before
|
||||||
|
E::after
|
||||||
|
E.warning#myid
|
||||||
|
E:not(s)>F+F~F{color:red}
|
@@ -16,7 +16,8 @@
|
|||||||
border: 1px solid #00ff77;
|
border: 1px solid #00ff77;
|
||||||
}
|
}
|
||||||
|
|
||||||
div#content h1 + p {
|
div#content
|
||||||
|
h1 + p {
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
3
web/test/_test_files/css/styles.min.css
vendored
3
web/test/_test_files/css/styles.min.css
vendored
@@ -1 +1,2 @@
|
|||||||
@import url(more.css);body,td,th{font-family:Verdana,"Bitstream Vera Sans",sans-serif;font-size:12px}.nav{margin-left:20%}#main-nav{background-color:red;border:1px solid #0f7}div#content h1+p{padding-top:0;margin-top:0}@media all and (min-width: 640px){#media-queries-1{background-color:#0f0}}@media screen and (max-width: 2000px){#media-queries-2{background-color:#0f0}}
|
@import url(more.css);body,td,th{font-family:Verdana,"Bitstream Vera Sans",sans-serif;font-size:12px}.nav{margin-left:20%}#main-nav{background-color:red;border:1px solid #0f7}div#content
|
||||||
|
h1+p{padding-top:0;margin-top:0}@media all and (min-width: 640px){#media-queries-1{background-color:#0f0}}@media screen and (max-width: 2000px){#media-queries-2{background-color:#0f0}}
|
6
web/test/_test_files/css/subsilver.min.css
vendored
6
web/test/_test_files/css/subsilver.min.css
vendored
@@ -1 +1,5 @@
|
|||||||
.float-l{float:left}.form-suggest{height:200px;background:#DEE2D0;vertical-align:top}.form-input input{font-size:10px}.hide{display:none}.form-input textarea{font-size:11px;width:350px}.form-label{font-size:10px;font-weight:bold;line-height:25px;padding-right:10px;text-align:right;width:100px;color:#39738F}.font-9{font-size:9px}.form-topic{font-weight:bold}.form-error{color:red}.inline{display:inline}.space-10{clear:both;font-size:10px;height:10px;line-height:10px}.suggest-success{color:green;padding-left:10px;font-size:11px;font-weight:bold}.top{vertical-align:top}table td{padding:3px}a:link,a:active,a:visited,a.postlink{color:#069;text-decoration:none}a:hover{color:#DD6900}a.admin:hover,a.mod:hover{color:#DD6900}a.but,a.but:hover,a.but:visited{color:#000;text-decoration:none}a.topictitle:visited{color:#5493B4}a.topictitle:hover{color:#DD6900}body{color:#000;font:11px Verdana,Arial,Helvetica,sans-serif;margin:0 10px 10px 10px;padding:0;overflow:auto}font,th,td,p{font:12px Verdana,Arial,Helvetica,sans-serif}form{display:inline}hr{border:0px solid #FFF;border-top-width:1px;height:0px}img{border:0 solid}input{font:11px Verdana,Arial,Helvetica,sans-serif}input.button,input.liteoption,.fakebut{background:#FAFAFA;border:1px solid #000;font-size:11px}input.catbutton{background:#FAFAFA;border:1px solid #000;font-size:10px}input.mainoption{background:#FAFAFA;border:1px solid #000;font-size:11px;font-weight:bold}input.post,textarea.post{background:#FFF;border:1px solid #000;font:11px Verdana,Arial,Helvetica,sans-serif;padding-bottom:2px;padding-left:2px}select{background:#FFF;font:11px Verdana,Arial,Helvetica,sans-serif}table{text-align:left}td{vertical-align:middle}td.cat{background-color:#C2C6BA;font-weight:bold;height:20px;letter-spacing:1px;text-indent:4px}td.genmed,.genmed{font-size:11px}td.rowpic{background:#C2C6BA}td.spacerow{background:#E5E6E2}th{background-color:#FADD31;background-image:url(images/cellpic3.gif);background-repeat:repeat-x;color:#68685E;font-size:11px;font-weight:bold;line-height:16px;height:16px;padding-left:8px;padding-right:8px;text-align:center;white-space:nowrap}.admin,.mod{font-size:11px;font-weight:bold}.admin,a.admin,a.admin:visited{color:#FFA34F}.bodyline{background:#FFF;border:1px solid #98AAB1}.center{text-align:center}.code{background:#FAFAFA;border:1px solid #D1D7DC;color:#060;font:12px Courier,"Courier New",sans-serif;padding:5px}.errorline{background:#E5E6E2;border:1px solid #8F8B8B;color:#D92A2A}.explaintitle{color:#5C81B1;font-size:11px;font-weight:bold}.forumline{background:#FFF}.gensmall{font-size:10px}.h1-font{color:#069;display:inline;font:bold 13px Verdana,Arial,Helvetica,sans-serif;margin:0;text-decoration:none}.h2-font{display:inline;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px}.height1{height:1px}.height22{height:22px}.height25{height:25px}.height28{height:28px}.height30{height:30px}.height40{height:40px}.helpline{border:0 solid;font-size:10px}.imgfolder{margin:1px 4px 1px 4px}.imgspace{margin-left:1px;margin-right:2px}.imgtopic,.imgicon{margin-left:3px}.left{text-align:left}.maintitle,h1,h2{color:#5C81B1;font:bold 20px/120% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.maxwidth{width:100%}.mod,a.mod,a.mod:visited{color:#060}.name{font-size:11px;font-weight:bold}.nav{font-size:11px;font-weight:bold}.nowrap{white-space:nowrap}.postbody{font-size:12px;line-height:125%}.postbody a{text-decoration:underline}.postdetails{color:#00396A;font-size:10px}.quote{background:#F3F3EF;border:1px solid #C2C6BA;color:#069;font-size:11px;line-height:125%}.right{text-align:right}.row1{background:#F0F0EB}.row2,.helpline{background:#E5E6E2}.row3{background:#DBDBD4}.subtitle,h2{font:bold 18px/180% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.topictitle{color:#000;font-size:11px;font-weight:bold}.underline{text-decoration:underline}.top{vertical-align:top}.image-hspace{margin-right:3px}.clear{clear:both}
|
.float-l{float:left}.form-suggest{height:200px;background:#DEE2D0;vertical-align:top}.form-input
|
||||||
|
input{font-size:10px}.hide{display:none}.form-input
|
||||||
|
textarea{font-size:11px;width:350px}.form-label{font-size:10px;font-weight:bold;line-height:25px;padding-right:10px;text-align:right;width:100px;color:#39738F}.font-9{font-size:9px}.form-topic{font-weight:bold}.form-error{color:red}.inline{display:inline}.space-10{clear:both;font-size:10px;height:10px;line-height:10px}.suggest-success{color:green;padding-left:10px;font-size:11px;font-weight:bold}.top{vertical-align:top}table
|
||||||
|
td{padding:3px}a:link,a:active,a:visited,a.postlink{color:#069;text-decoration:none}a:hover{color:#DD6900}a.admin:hover,a.mod:hover{color:#DD6900}a.but,a.but:hover,a.but:visited{color:#000;text-decoration:none}a.topictitle:visited{color:#5493B4}a.topictitle:hover{color:#DD6900}body{color:#000;font:11px Verdana,Arial,Helvetica,sans-serif;margin:0 10px 10px 10px;padding:0;overflow:auto}font,th,td,p{font:12px Verdana,Arial,Helvetica,sans-serif}form{display:inline}hr{border:0px solid #FFF;border-top-width:1px;height:0px}img{border:0 solid}input{font:11px Verdana,Arial,Helvetica,sans-serif}input.button,input.liteoption,.fakebut{background:#FAFAFA;border:1px solid #000;font-size:11px}input.catbutton{background:#FAFAFA;border:1px solid #000;font-size:10px}input.mainoption{background:#FAFAFA;border:1px solid #000;font-size:11px;font-weight:bold}input.post,textarea.post{background:#FFF;border:1px solid #000;font:11px Verdana,Arial,Helvetica,sans-serif;padding-bottom:2px;padding-left:2px}select{background:#FFF;font:11px Verdana,Arial,Helvetica,sans-serif}table{text-align:left}td{vertical-align:middle}td.cat{background-color:#C2C6BA;font-weight:bold;height:20px;letter-spacing:1px;text-indent:4px}td.genmed,.genmed{font-size:11px}td.rowpic{background:#C2C6BA}td.spacerow{background:#E5E6E2}th{background-color:#FADD31;background-image:url(images/cellpic3.gif);background-repeat:repeat-x;color:#68685E;font-size:11px;font-weight:bold;line-height:16px;height:16px;padding-left:8px;padding-right:8px;text-align:center;white-space:nowrap}.admin,.mod{font-size:11px;font-weight:bold}.admin,a.admin,a.admin:visited{color:#FFA34F}.bodyline{background:#FFF;border:1px solid #98AAB1}.center{text-align:center}.code{background:#FAFAFA;border:1px solid #D1D7DC;color:#060;font:12px Courier,"Courier New",sans-serif;padding:5px}.errorline{background:#E5E6E2;border:1px solid #8F8B8B;color:#D92A2A}.explaintitle{color:#5C81B1;font-size:11px;font-weight:bold}.forumline{background:#FFF}.gensmall{font-size:10px}.h1-font{color:#069;display:inline;font:bold 13px Verdana,Arial,Helvetica,sans-serif;margin:0;text-decoration:none}.h2-font{display:inline;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px}.height1{height:1px}.height22{height:22px}.height25{height:25px}.height28{height:28px}.height30{height:30px}.height40{height:40px}.helpline{border:0 solid;font-size:10px}.imgfolder{margin:1px 4px 1px 4px}.imgspace{margin-left:1px;margin-right:2px}.imgtopic,.imgicon{margin-left:3px}.left{text-align:left}.maintitle,h1,h2{color:#5C81B1;font:bold 20px/120% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.maxwidth{width:100%}.mod,a.mod,a.mod:visited{color:#060}.name{font-size:11px;font-weight:bold}.nav{font-size:11px;font-weight:bold}.nowrap{white-space:nowrap}.postbody{font-size:12px;line-height:125%}.postbody
|
||||||
|
a{text-decoration:underline}.postdetails{color:#00396A;font-size:10px}.quote{background:#F3F3EF;border:1px solid #C2C6BA;color:#069;font-size:11px;line-height:125%}.right{text-align:right}.row1{background:#F0F0EB}.row2,.helpline{background:#E5E6E2}.row3{background:#DBDBD4}.subtitle,h2{font:bold 18px/180% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.topictitle{color:#000;font-size:11px;font-weight:bold}.underline{text-decoration:underline}.top{vertical-align:top}.image-hspace{margin-right:3px}.clear{clear:both}
|
@@ -1 +1,2 @@
|
|||||||
foo[attr="multiple spaces"]{content:"Hello World!"}foo[attr="Hello"]{content:" \"World\""}
|
foo[attr="multiple spaces"]{content:"Hello World!"}foo[attr="Hel\
|
||||||
|
lo"]{content:" \"World\""}
|
69
web/test/_test_files/css/vladmirated.min.css
vendored
69
web/test/_test_files/css/vladmirated.min.css
vendored
File diff suppressed because one or more lines are too long
@@ -10,8 +10,15 @@ href="http://www.csszengarden.com/favicon.ico" /><link
|
|||||||
rel="alternate"
|
rel="alternate"
|
||||||
type="application/rss+xml"
|
type="application/rss+xml"
|
||||||
title="RSS"
|
title="RSS"
|
||||||
href="http://www.csszengarden.com/zengarden.xml" /></head><body id="css-zen-garden"><div id="container"><div id="pageHeader"><h1><span>css Zen Garden</span></h1><h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym> Design</span></h2></div><pre>
|
href="http://www.csszengarden.com/zengarden.xml" /></head><body id="css-zen-garden"><div
|
||||||
|
id="container"><div
|
||||||
|
id="pageHeader"><h1><span>css Zen Garden</span></h1><h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym> Design</span></h2></div><pre>
|
||||||
White space is important here!
|
White space is important here!
|
||||||
</pre><div id="quickSummary"><p class="p1"><span>A demonstration of what can be accomplished visually through <acronym title="Cascading Style Sheets">CSS</acronym>-based design. Select any style sheet from the list to load it into this page.</span></p><p class="p2"><span>Download the sample <a href="/zengarden-sample.html" title="This page's source HTML code, not to be modified.">html file</a> and <a href="/zengarden-sample.css" title="This page's sample CSS, the file you may modify.">css file</a></span></p></div><textarea name="comment" id="comment" rows="6" class="maxwidth" cols="80">66666
|
</pre><div
|
||||||
|
id="quickSummary"><p
|
||||||
|
class="p1"><span>A demonstration of what can be accomplished visually through <acronym title="Cascading Style Sheets">CSS</acronym>-based design. Select any style sheet from the list to load it into this page.</span></p><p
|
||||||
|
class="p2"><span>Download the sample <a
|
||||||
|
href="/zengarden-sample.html" title="This page's source HTML code, not to be modified.">html file</a> and <a
|
||||||
|
href="/zengarden-sample.css" title="This page's sample CSS, the file you may modify.">css file</a></span></p></div><textarea name="comment" id="comment" rows="6" class="maxwidth" cols="80">66666
|
||||||
|
|
||||||
1234567890</textarea></div></body></html>
|
1234567890</textarea></div></body></html>
|
Reference in New Issue
Block a user