function _less_pre_render in Less CSS Preprocessor 7.2
Same name and namespace in other branches
- 8 less.module \_less_pre_render()
- 7.4 less.module \_less_pre_render()
- 7.3 less.module \_less_pre_render()
Processes .less files
2 calls to _less_pre_render()
- less_wysiwyg_editor_settings_alter in ./
less.wysiwyg.inc - Implements hook_wysiwyg_editor_settings_alter(). Check the css_content WYSIWYG setting for LESS files and replace with generated CSS files where necessary.
- _less_watch in ./
less.module
1 string reference to '_less_pre_render'
- less_element_info_alter in ./
less.module - Implements hook_element_info_alter().
File
- ./
less.module, line 89 - Handles compiling of .less files.
Code
function _less_pre_render($styles) {
$less_devel = variable_get('less_devel', FALSE);
$less_dir = variable_get('less_dir', '');
if ($less_devel) {
drupal_add_js(drupal_get_path('module', 'less') . '/less.watch.js');
// Warn users once every hour that less is checking for file modifications.
if (user_access(LESS_PERMISSION) && flood_is_allowed('less_devel_warning', 1)) {
flood_register_event('less_devel_warning');
drupal_set_message(t('LESS files are being checked for modifications on every request. Remember to <a href="!url">turn off</a> this feature on production websites.', array(
"!url" => url('admin/config/development/less'),
)), 'status');
}
}
$less_path = 'public://less/' . $less_dir;
foreach ($styles['#items'] as $key => $info) {
$input_file = $info['data'];
if (drupal_substr($input_file, -5) == '.less') {
$file_uri = file_uri_target($input_file);
$css_path = $less_path . '/' . dirname($file_uri ? $file_uri : $input_file);
if (!is_dir($css_path) && !file_prepare_directory($css_path, FILE_CREATE_DIRECTORY)) {
// There is a problem with the directory.
$message = 'LESS could not create a directory in %dir';
$message_vars = array(
'%dir' => $css_path,
);
watchdog('LESS', $message, $message_vars, WATCHDOG_ERROR);
if (user_access(LESS_PERMISSION)) {
drupal_set_message(t($message, $message_vars), 'error', FALSE);
}
// Need to return $styles, regardless if they were altered.
return $styles;
}
$output_file = $css_path . '/' . basename($input_file, '.less');
// correct file names of files not following the .css.less naming convention
if (drupal_substr($output_file, -4) != '.css') {
$output_file .= '.css';
}
$less_settings = array(
'variables' => array(),
'functions' => array(),
);
if (!empty($info['less'])) {
$less_settings = array_merge_recursive($less_settings, $info['less']);
if (!isset($less_settings['functions']['token'])) {
$less_settings['functions']['token'] = '_less_token_replace';
}
}
else {
$less_settings = less_get_settings(_less_files($input_file));
}
if (!empty($less_settings)) {
// array_multisort() the data so that the hash returns the same hash regardless order of data.
array_multisort($less_settings);
// json_encode() is used because serialize() throws an error with lambda functions.
$output_file = substr_replace($output_file, drupal_hash_base64(json_encode($less_settings)) . '.css', -3);
}
$rebuild = FALSE;
// Set $rebuild if this file or its children have been modified.
if ($less_devel && is_file($output_file)) {
$output_file_mtime = filemtime($output_file);
if ($less_file_cache = cache_get('less:devel:' . drupal_hash_base64($input_file))) {
// Iterate over each file and check if there are any changes.
foreach ($less_file_cache->data as $filepath => $filemtime) {
// Only rebuild if there has been a change to a file.
if (filemtime($filepath) > $filemtime) {
$rebuild = TRUE;
break;
}
}
}
else {
// No cache data, force a rebuild for later comparison.
$rebuild = TRUE;
}
}
// $output_file doesn't exist or is flagged for rebuild.
if ((!is_file($output_file) || $rebuild) && _less_inc()) {
$less = new lessc();
if (method_exists($less, 'registerFunction') && is_array($less_settings['functions'])) {
foreach ($less_settings['functions'] as $funcion => $callback) {
$less
->registerFunction($funcion, $callback);
}
}
if (method_exists($less, 'setVariables')) {
$less
->setVariables($less_settings['variables']);
}
$cache = NULL;
$output_data = NULL;
try {
if ($less_devel) {
$cache = $less
->cachedCompile($input_file);
cache_set('less:devel:' . drupal_hash_base64($input_file), $cache['files']);
$output_data = $cache['compiled'];
}
else {
$output_data = $less
->compileFile($input_file);
}
} catch (Exception $e) {
$message = 'LESS error: @message, %input_file';
$message_vars = array(
'@message' => $e
->getMessage(),
'%input_file' => $input_file,
);
watchdog('LESS', $message, $message_vars, WATCHDOG_ERROR);
if (user_access(LESS_PERMISSION)) {
drupal_set_message(t($message, $message_vars), 'error');
}
}
if (isset($output_data)) {
// fix paths for images as .css is in different location
$output_data = _less_rewrite_paths($input_file, $output_data);
file_unmanaged_save_data($output_data, $output_file, FILE_EXISTS_REPLACE);
}
}
if (is_file($output_file)) {
$styles['#items'][$key]['data'] = $output_file;
// preprocess being false generates a <link /> rather than an @import.
if ($less_devel) {
$less_watch_cache = $styles['#items'][$key];
$less_watch_cache['less'] = $less_settings;
$less_watch_cache['data'] = $input_file;
$less_watch_cache['output_file'] = $output_file;
cache_set('less:watch:' . drupal_hash_base64(file_create_url($output_file)), $less_watch_cache);
$styles['#items'][$key]['preprocess'] = FALSE;
}
}
}
}
return $styles;
}