You are here

function _less_build in Less CSS Preprocessor 6.2

Same name and namespace in other branches
  1. 6.3 less.module \_less_build()
  2. 6 less.module \_less_build()

Builds the less cache

2 calls to _less_build()
less_preprocess_maintenance_page in ./less.module
Implements MODULE_preprocess_maintenance_page().
less_preprocess_page in ./less.module
Implements MODULE_preprocess_page().

File

./less.module, line 42
Handles compiling of .less files.

Code

function _less_build(&$vars, $hook) {
  $css = $vars['css'];
  $less_devel = variable_get('less_devel', FALSE);
  $less_dir = variable_get('less_dir', '');

  // Flush compiled LESS files if developer mode is enabled
  if (!$less_dir || $less_devel) {
    $less_dir = _less_new_dir();
    if ($less_devel && 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 regenerated on every request. Remember to <a href="!url">turn off</a> this feature on production websites.', array(
        "!url" => url('admin/settings/less'),
      )), 'status');
    }
  }
  $less_path = file_directory_path() . '/less/' . $less_dir;
  foreach ($css as $media => $types) {
    foreach ($types as $type => $files) {
      $files_keys = array_keys($files);
      foreach ($files_keys as $key => $input_file) {
        if (drupal_substr($input_file, -5) == '.less') {
          $css_path = $less_path . '/' . dirname($input_file);
          if (!is_dir($css_path) && !@mkdir($css_path, 0775, TRUE)) {

            // There is a problem with the directory.
            $param = array(
              '%dir' => $css_path,
            );
            if (user_access(LESS_PERMISSION)) {
              drupal_set_message(t('LESS could not create a directory in %dir', $param), 'error');
            }
            watchdog('LESS', t('LESS could not create a directory in %dir', $param), array(), WATCHDOG_ERROR);
            return;
          }
          $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';
          }
          if (!file_exists($output_file)) {
            if (_less_inc()) {
              $less = new lessc();
              $contents = drupal_load_stylesheet($input_file, FALSE);
              $base = base_path() . dirname($input_file) . '/';
              _drupal_build_css_path(NULL, $base);

              // Prefix all paths within this CSS file, ignoring external and absolute paths.
              $data = preg_replace_callback('/url\\([\'"]?(?![a-z]+:|\\/+)([^\'")]+)[\'"]?\\)/i', '_drupal_build_css_path', $contents);
              try {
                $output_data = $less
                  ->parse($data);
                file_save_data($output_data, $output_file, FILE_EXISTS_REPLACE);
              } 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 (file_exists($output_file)) {
            array_splice($files_keys, $key, 1, $output_file);
          }
        }
      }
      if (!empty($files)) {
        $css[$media][$type] = array_combine($files_keys, $files);
      }
    }
  }
  if ($vars['show_messages']) {
    $vars['messages'] .= theme('status_messages');
  }
  $vars['css'] = $css;
  $vars['styles'] = drupal_get_css($vars['css']);
}