Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

164 lines (131 sloc) 4.559 kb
<?php
/**
* Customizable property sorting
*
* @see docs/plugins/property-sorter.md
*/
namespace CssCrush {
Plugin::register('property-sorter', array(
'enable' => function ($process) {
$process->hooks->add('rule_prealias', 'CssCrush\property_sorter');
}
));
function property_sorter(Rule $rule) {
usort($rule->declarations->store, 'CssCrush\property_sorter_callback');
}
/*
Callback for sorting.
*/
function property_sorter_callback($a, $b) {
$map =& property_sorter_get_table();
$a_prop =& $a->canonicalProperty;
$b_prop =& $b->canonicalProperty;
$a_listed = isset($map[$a_prop]);
$b_listed = isset($map[$b_prop]);
// If the properties are identical we need to flag for an index comparison.
$compare_indexes = false;
// If the 'canonical' properties are identical we need to flag for a vendor comparison.
$compare_vendor = false;
// If both properties are listed.
if ($a_listed && $b_listed) {
if ($a_prop === $b_prop) {
if ($a->vendor || $b->vendor) {
$compare_vendor = true;
}
else {
$compare_indexes = true;
}
}
else {
// Table comparison.
return $map[$a_prop] > $map[$b_prop] ? 1 : -1;
}
}
// If one property is listed it always takes higher priority.
elseif ($a_listed && ! $b_listed) {
return -1;
}
elseif ($b_listed && ! $a_listed) {
return 1;
}
// If neither property is listed.
else {
if ($a_prop === $b_prop) {
if ($a->vendor || $b->vendor) {
$compare_vendor = true;
}
else {
$compare_indexes = true;
}
}
else {
// Regular sort.
return $a_prop > $b_prop ? 1 : -1;
}
}
// Comparing by index.
if ($compare_indexes ) {
return $a->index > $b->index ? 1 : -1;
}
// Comparing by vendor mark.
if ($compare_vendor) {
if (! $a->vendor && $b->vendor) {
return 1;
}
elseif ($a->vendor && ! $b->vendor) {
return -1;
}
else {
// If both have a vendor mark compare vendor name length.
return strlen($b->vendor) > strlen($a->vendor) ? 1 : -1;
}
}
}
/*
Cache for the table of values to compare against.
*/
function &property_sorter_get_table () {
// Check for cached table.
if (isset($GLOBALS['CSSCRUSH_PROPERTY_SORT_ORDER_CACHE'])) {
return $GLOBALS['CSSCRUSH_PROPERTY_SORT_ORDER_CACHE'];
}
$table = array();
// Nothing cached, check for a user-defined table.
if (isset($GLOBALS['CSSCRUSH_PROPERTY_SORT_ORDER'])) {
$table = (array) $GLOBALS['CSSCRUSH_PROPERTY_SORT_ORDER'];
}
// No user-defined table, use pre-defined.
else {
// Load from property-sorting.ini.
$sorting_file_contents = file_get_contents(Crush::$dir . '/misc/property-sorting.ini');
if ($sorting_file_contents !== false) {
$sorting_file_contents = preg_replace('~;[^\r\n]*~', '', $sorting_file_contents);
$table = preg_split('~\s+~', trim($sorting_file_contents));
}
else {
notice("Property sorting file not found.");
}
// Store to the global variable.
$GLOBALS['CSSCRUSH_PROPERTY_SORT_ORDER'] = $table;
}
// Cache the table (and flip it).
$GLOBALS['CSSCRUSH_PROPERTY_SORT_ORDER_CACHE'] = array_flip($table);
return $GLOBALS['CSSCRUSH_PROPERTY_SORT_ORDER_CACHE'];
}
}
namespace {
/*
Get the current sorting table.
*/
function csscrush_get_property_sort_order() {
CssCrush\property_sorter_get_table();
return $GLOBALS['CSSCRUSH_PROPERTY_SORT_ORDER'];
}
/*
Set a custom sorting table.
*/
function csscrush_set_property_sort_order(array $new_order) {
unset($GLOBALS['CSSCRUSH_PROPERTY_SORT_ORDER_CACHE']);
$GLOBALS['CSSCRUSH_PROPERTY_SORT_ORDER'] = $new_order;
}
}
Jump to Line
Something went wrong with that request. Please try again.