这是 JohnyFree 的更高级变体,对 dirty 的修改很少。
这个变体将整个 CSS 打包成一行,
也删除所有 css cmets,并检查 $partDetails[1] 是否真的在最后设置,然后内爆 *(last else)
给 JohnyFree 更多的声望,这是他应得的。
ps:我已经在我进行修改的地方添加了# shell style comments。
function getPrefixedCss($css,$prefix)
{
# Wipe all block comments
$css = preg_replace('!/\*.*?\*/!s', '', $css);
$parts = explode('}', $css);
$mediaQueryStarted = false;
foreach($parts as &$part)
{
$part = trim($part); # Wht not trim immediately .. ?
if(empty($part)) continue;
else # This else is also required
{
$partDetails = explode('{', $part);
if(substr_count($part, "{")==2)
{
$mediaQuery = $partDetails[0]."{";
$partDetails[0] = $partDetails[1];
$mediaQueryStarted = true;
}
$subParts = explode(',', $partDetails[0]);
foreach($subParts as &$subPart)
{
if(trim($subPart)==="@font-face") continue;
else $subPart = $prefix . ' ' . trim($subPart);
}
if(substr_count($part,"{")==2)
{
$part = $mediaQuery."\n".implode(', ', $subParts)."{".$partDetails[2];
}
elseif(empty($part[0]) && $mediaQueryStarted)
{
$mediaQueryStarted = false;
$part = implode(', ', $subParts)."{".$partDetails[2]."}\n"; //finish media query
}
else
{
if(isset($partDetails[1]))
{ # Sometimes, without this check,
# there is an error-notice, we don't need that..
$part = implode(', ', $subParts)."{".$partDetails[1];
}
}
unset($partDetails, $mediaQuery, $subParts); # Kill those three ..
} unset($part); # Kill this one as well
}
# Finish with the whole new prefixed string/file in one line
return(preg_replace('/\s+/',' ',implode("} ", $parts)));
}