CompilerApiFilter.php

Namespace

Assetic\Filter\GoogleClosure

File

drupal/core/vendor/kriswallsmith/assetic/src/Assetic/Filter/GoogleClosure/CompilerApiFilter.php
View source
<?php

/*
 * This file is part of the Assetic package, an OpenSky project.
 *
 * (c) 2010-2012 OpenSky Project Inc
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace Assetic\Filter\GoogleClosure;

use Assetic\Asset\AssetInterface;

/**
 * Filter for the Google Closure Compiler API.
 *
 * @link https://developers.google.com/closure/compiler/
 * @author Kris Wallsmith <kris.wallsmith@gmail.com>
 */
class CompilerApiFilter extends BaseCompilerFilter {
  public function filterDump(AssetInterface $asset) {
    $query = array(
      'js_code' => $asset
        ->getContent(),
      'output_format' => 'json',
      'output_info' => 'compiled_code',
    );
    if (null !== $this->compilationLevel) {
      $query['compilation_level'] = $this->compilationLevel;
    }
    if (null !== $this->jsExterns) {
      $query['js_externs'] = $this->jsExterns;
    }
    if (null !== $this->externsUrl) {
      $query['externs_url'] = $this->externsUrl;
    }
    if (null !== $this->excludeDefaultExterns) {
      $query['exclude_default_externs'] = $this->excludeDefaultExterns ? 'true' : 'false';
    }
    if (null !== $this->formatting) {
      $query['formatting'] = $this->formatting;
    }
    if (null !== $this->useClosureLibrary) {
      $query['use_closure_library'] = $this->useClosureLibrary ? 'true' : 'false';
    }
    if (null !== $this->warningLevel) {
      $query['warning_level'] = $this->warningLevel;
    }
    if (null !== $this->language) {
      $query['language'] = $this->language;
    }
    if (preg_match('/1|yes|on|true/i', ini_get('allow_url_fopen'))) {
      $context = stream_context_create(array(
        'http' => array(
          'method' => 'POST',
          'header' => 'Content-Type: application/x-www-form-urlencoded',
          'content' => http_build_query($query),
        ),
      ));
      $response = file_get_contents('http://closure-compiler.appspot.com/compile', false, $context);
      $data = json_decode($response);
    }
    elseif (defined('CURLOPT_POST') && !in_array('curl_init', explode(',', ini_get('disable_functions')))) {
      $ch = curl_init('http://closure-compiler.appspot.com/compile');
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-type: application/x-www-form-urlencoded',
      ));
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
      curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
      $response = curl_exec($ch);
      curl_close($ch);
      $data = json_decode($response);
    }
    else {
      throw new \RuntimeException("There is no known way to contact closure compiler available");
    }
    if (isset($data->serverErrors) && 0 < count($data->serverErrors)) {

      // @codeCoverageIgnoreStart
      throw new \RuntimeException(sprintf('The Google Closure Compiler API threw some server errors: ' . print_r($data->serverErrors, true)));

      // @codeCoverageIgnoreEnd
    }
    if (isset($data->errors) && 0 < count($data->errors)) {

      // @codeCoverageIgnoreStart
      throw new \RuntimeException(sprintf('The Google Closure Compiler API threw some errors: ' . print_r($data->errors, true)));

      // @codeCoverageIgnoreEnd
    }
    $asset
      ->setContent($data->compiledCode);
  }

}

Classes

Namesort descending Description
CompilerApiFilter Filter for the Google Closure Compiler API.