Advanced aggregation critical css module.

File

advagg_critical_css/advagg_critical_css.module

View source
<?php


/**
 * @file
 * Advanced aggregation critical css module.
 */

/**
 * @addtogroup hooks
 * @{
 */

/**
 * Implements hook_menu().
 */
function advagg_critical_css_menu() {
    $file_path = drupal_get_path('module', 'advagg_critical_css');
    $config_path = advagg_admin_config_root_path();
    $items[$config_path . '/advagg/critical-css'] = array(
        'title' => 'Critical CSS',
        'description' => 'Control critical css.',
        'page callback' => 'drupal_get_form',
        'page arguments' => array(
            'advagg_critical_css_admin_settings_form',
        ),
        'type' => MENU_LOCAL_TASK,
        'access arguments' => array(
            'administer site configuration',
        ),
        'file path' => $file_path,
        'file' => 'advagg_critical_css.admin.inc',
        'weight' => 10,
    );
    return $items;
}

/**
 * Implements hook_module_implements_alter().
 */
function advagg_critical_css_module_implements_alter(&$implementations, $hook) {
    // Move critical_css_advagg_mod_critical_css_file_pre_alter to the bottom.
    if ($hook === 'critical_css_advagg_mod_critical_css_file_pre_alter' && array_key_exists('advagg_critical_css', $implementations)) {
        $item = $implementations['advagg_critical_css'];
        unset($implementations['advagg_critical_css']);
        $implementations['advagg_critical_css'] = $item;
    }
}

/**
 * @} End of "addtogroup hooks".
 */

/**
 * @addtogroup advagg_hooks
 * @{
 */

/**
 * Implements hook_advagg_mod_critical_css_file_pre_alter().
 */
function advagg_critical_css_advagg_mod_critical_css_file_pre_alter(&$filename, &$params, &$inline_strings) {
    list($dirs, $front_page, $object) = $params;
    // Build query parameters.
    $lookup = array(
        $dirs[6],
    );
    if ($front_page) {
        $lookup = array(
            '<front>',
        );
    }
    $lookup[] = $dirs[9];
    $lookup[] = $dirs[10];
    if (!empty($object->type)) {
        $lookup[] = $object->type;
    }
    $type = array(
        2,
        8,
    );
    $users = array(
        rtrim($dirs[2], '/\\'),
        rtrim($dirs[3], '/\\'),
    );
    // Get Results.
    $result = advagg_critical_css_table_get($GLOBALS['theme'], $type, $lookup, $users);
    // Put into the inline strings array.
    if (!empty($result)) {
        // Set string values.
        $inline_strings[0] = $result['css'];
        $inline_strings[1] = $result['dns'];
        $inline_strings[2] = $result['pre'];
        // Disable file lookup.
        $dirs[0] = '';
        $dirs[1] = '';
    }
    // Repack the $params array.
    $params = array(
        $dirs,
        $front_page,
        $object,
    );
}

/**
 * Implements hook_advagg_mod_critical_css_file_post_alter().
 */
function advagg_critical_css_advagg_mod_critical_css_file_post_alter(&$filename, &$params, &$inline_strings) {
    if (!empty($inline_strings[0])) {
        // Remove given css selectors.
        $selectors = variable_get('advagg_critical_css_selector_blacklist', '');
        $selectors_array = array_filter(array_map('trim', explode("\n", $selectors)));
        foreach ($selectors_array as $pattern) {
            $pattern = preg_quote($pattern, '/');
            $pattern = "/([^}]*{$pattern}[^{]*[^}]*\\})/s";
            $inline_strings[0] = preg_replace($pattern, '', $inline_strings[0]);
        }
    }
}

/**
 * @} End of "addtogroup advagg_hooks".
 */

/**
 * Get the db select return object.
 *
 * @param string $theme
 *   Name of the current theme.
 * @param array $type
 *   Array of int types to lookup.
 * @param array $lookup
 *   The lookup value.
 * @param array $user
 *   Array of user string values.
 *
 * @return SelectQuery
 *   Return the SelectQuery object after it has been executed.
 */
function advagg_critical_css_table_get($theme, array $type, array $lookup, array $user) {
    $output = array();
    try {
        $results = db_select('advagg_critical_css', 'acc')->fields('acc')
            ->condition('theme', $theme)
            ->condition('type', $type, 'IN')
            ->condition('user', $user, 'IN')
            ->condition('lookup', $lookup, 'IN')
            ->orderBy('type', 'DESC')
            ->execute();
        // Get first result.
        $output = $results->fetchAssoc();
        // Check for a better match in other results if they exist.
        foreach ($results as $values) {
            $values = (array) $values;
            if ($values['type'] < $output['type']) {
                $output = $values;
                break;
            }
            if ($values['type'] = $output['type']) {
                if (($values['user'] === 'anonymous' || $values['user'] === 'authenticated') && $output['user'] === 'all') {
                    $output = $values;
                    break;
                }
                if (is_int($values['user'])) {
                    $output = $values;
                    break;
                }
            }
        }
    } catch (PDOException $e) {
        // Log the error if in development mode.
        if (variable_get('advagg_cache_level', ADVAGG_CACHE_LEVEL) < 0) {
            watchdog('advagg_critical_css', 'Development Mode - Caught PDO Exception: <code>@info</code>', array(
                '@info' => $e,
            ));
        }
    }
    return $output;
}

/**
 * Insert/Update data in the advagg_critical_css table.
 *
 * @param array $records
 *   List of rows needed that need to be changed in the db.
 *
 * @return array
 *   Return array of booleans if anything was written to the database.
 */
function advagg_critical_css_table_insert_update(array $records) {
    $return = array();
    foreach ($records as $values) {
        list($keys, $record) = $values;
        if (!isset($record['settings'])) {
            $record['settings'] = '';
        }
        try {
            $return[] = db_merge('advagg_critical_css')->key(array(
                'theme' => $keys['theme'],
                'user' => $keys['user'],
                'type' => $keys['type'],
                'lookup' => $keys['lookup'],
            ))
                ->fields($record)
                ->execute();
        } catch (PDOException $e) {
            // Log the error if in development mode.
            if (variable_get('advagg_cache_level', ADVAGG_CACHE_LEVEL) < 0) {
                watchdog('advagg_critical_css', 'Development Mode - Caught PDO Exception: <code>@info</code>', array(
                    '@info' => $e,
                ));
            }
        }
    }
    return $return;
}

/**
 * Delete data in the advagg_critical_css table.
 *
 * @param array $records
 *   List of rows needed that need to be removed from the db.
 *
 * @return array
 *   Return array of booleans if anything was removed from the database.
 */
function advagg_critical_css_table_delete(array $records) {
    $return = array();
    foreach ($records as $record) {
        try {
            $return[] = db_delete('advagg_critical_css')->condition('theme', $record['theme'])
                ->condition('user', $record['user'])
                ->condition('type', $record['type'])
                ->condition('lookup', $record['lookup'])
                ->execute();
        } catch (PDOException $e) {
            // Log the error if in development mode.
            if (variable_get('advagg_cache_level', ADVAGG_CACHE_LEVEL) < 0) {
                watchdog('advagg_critical_css', 'Development Mode - Caught PDO Exception: <code>@info</code>', array(
                    '@info' => $e,
                ));
            }
        }
    }
    return $return;
}

Functions

Title Deprecated Summary
advagg_critical_css_advagg_mod_critical_css_file_post_alter Implements hook_advagg_mod_critical_css_file_post_alter().
advagg_critical_css_advagg_mod_critical_css_file_pre_alter Implements hook_advagg_mod_critical_css_file_pre_alter().
advagg_critical_css_menu Implements hook_menu().
advagg_critical_css_module_implements_alter Implements hook_module_implements_alter().
advagg_critical_css_table_delete Delete data in the advagg_critical_css table.
advagg_critical_css_table_get Get the db select return object.
advagg_critical_css_table_insert_update Insert/Update data in the advagg_critical_css table.