1 color.module | _color_rewrite_stylesheet($theme, &$info, &$paths, $palette, $style) |
Rewrites the stylesheet to match the colors in the palette.
File
- core/
modules/ color/ color.module, line 671 - Allows users to change the color scheme of themes.
Code
function _color_rewrite_stylesheet($theme, &$info, &$paths, $palette, $style) {
// Prepare color conversion table.
$conversion = $palette;
foreach ($conversion as $k => $v) {
$conversion[$k] = backdrop_strtolower($v);
}
$default = color_get_palette($theme, TRUE);
// Split off the "Don't touch" section of the stylesheet.
$split = "Color Module: Don't touch";
if (strpos($style, $split) !== FALSE) {
list($style, $fixed) = explode($split, $style);
}
// Find all colors in the stylesheet and the chunks in between.
$style = preg_split('/(#[0-9a-f]{6}|#[0-9a-f]{3})/i', $style, -1, PREG_SPLIT_DELIM_CAPTURE);
$is_color = FALSE;
$output = '';
$base = 'base';
// Iterate over all the parts.
foreach ($style as $chunk) {
if ($is_color) {
$chunk = backdrop_strtolower($chunk);
// Convert short hex codes to their long equivalents.
if (backdrop_strlen($chunk) == 4) {
$chunk = '#' . $chunk[1] . $chunk[1] . $chunk[2] . $chunk[2] . $chunk[3] . $chunk[3];
}
// Check if this is one of the colors in the default palette.
if ($key = array_search($chunk, $default)) {
$chunk = $conversion[$key];
}
// Not a pre-set color. Extrapolate from the base.
else {
if (isset($info['blend_target'])) {
$chunk = _color_shift($palette[$base], $default[$base], $chunk, $info['blend_target']);
}
}
}
else {
// Determine the most suitable base color for the next color.
// 'a' declarations. Use link.
if (preg_match('@[^a-z0-9_-](a)[^a-z0-9_-][^/{]*{[^{]+$@i', $chunk)) {
$base = 'link';
}
// 'color:' styles. Use text.
elseif (preg_match('/(?<!-)color[^{:]*:[^{#]*$/i', $chunk)) {
$base = 'text';
}
// Reset back to base.
else {
$base = 'base';
}
}
$output .= $chunk;
$is_color = !$is_color;
}
// Append fixed colors segment.
if (isset($fixed)) {
$output .= $fixed;
}
// Replace paths to images.
foreach ($paths['map'] as $before => $after) {
$before = base_path() . $paths['source'] . $before;
$before = preg_replace('`(^|/)(?!../)([^/]+)/../`', '$1', $before);
$output = str_replace($before, $after, $output);
}
return $output;
}