You are here

function _less_pre_render in Less CSS Preprocessor 7.2

Same name and namespace in other branches
  1. 8 less.module \_less_pre_render()
  2. 7.4 less.module \_less_pre_render()
  3. 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;
}