Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Asset/CssAsset.php
Строк: 152
<?php

namespace ConcreteCoreAsset;

use 
ConcreteCoreHtmlObjectHeadLink;
use 
Config;

class 
CssAsset extends Asset
{
    
/**
     * @var bool
     */
    
protected $assetSupportsMinification true;

    
/**
     * @var bool
     */
    
protected $assetSupportsCombination true;

    
/**
     * @return string
     */
    
public function getAssetDefaultPosition()
    {
        return 
Asset::ASSET_POSITION_HEADER;
    }

    
/**
     * @return string
     */
    
public function getAssetType()
    {
        return 
'css';
    }

    
/**
     * @return string
     */
    
protected static function getRelativeOutputDirectory()
    {
        return 
REL_DIR_FILES_CACHE.'/'.DIRNAME_CSS;
    }

    
/**
     * @return bool|string
     */
    
protected static function getOutputDirectory()
    {
        if (!
file_exists(Config::get('concrete.cache.directory').'/'.DIRNAME_CSS)) {
            
$proceed = @mkdir(Config::get('concrete.cache.directory').'/'.DIRNAME_CSS);
        } else {
            
$proceed true;
        }
        if (
$proceed) {
            return 
Config::get('concrete.cache.directory').'/'.DIRNAME_CSS;
        } else {
            return 
false;
        }
    }

    
/**
     * @param string $content
     * @param string $current_path
     * @param string $target_path
     *
     * @return string
     */
    
public static function changePaths($content$current_path$target_path)
    {
        
$current_path rtrim($current_path'/');
        
$target_path rtrim($target_path'/');
        
$current_path_slugs explode('/'$current_path);
        
$target_path_slugs explode('/'$target_path);
        
$smallest_count min(count($current_path_slugs), count($target_path_slugs));
        for (
$i 0$i $smallest_count && $current_path_slugs[$i] === $target_path_slugs[$i]; $i++);
        
$change_prefix = @implode('/', @array_merge(@array_fill(0count($target_path_slugs) - $i'..'), @array_slice($current_path_slugs$i)));
        if (
strlen($change_prefix) > 0) {
            
$change_prefix .= '/';
        }

        
$content preg_replace_callback(
            
'/
            @import\s+
            (?:url\(\s*)?     # maybe url(
            ['"]?              # maybe quote
            (.*?)               # 1 = URI
            ['"
]?              # maybe end quote
            
(?:\s*\))?        # maybe )
            
([a-zA-Z,\s]*)?    # 2 = media list
            
;                   # end token
            
/x',
            function ($m) use ($change_prefix) {
                if (preg_match('
@^https?://@i', $m[1])) {
                    
$result $m[0];
                } else {
                    
$url $change_prefix.$m[1];
                    
$url str_replace('/./''/'$url);
                    do {
                        
$url preg_replace('@/(?!\.\.?)[^/]+/\.\.@''/'$url1$changed);
                    } while (
$changed);
                    
$result "@import url('$url'){$m[2]};";
                }

                return 
$result;
            },
            
$content
        
);
        
$content preg_replace_callback(
            
'/url\(\s*([^\)\s]+)\s*\)/',
            function (
$m) use ($change_prefix) {
                
// $m[1] is either quoted or not
                
$quote = ($m[1][0] === "'" || $m[1][0] === '"')
                    ? 
$m[1][0]
                    : 
'';
                
$url = ($quote === '')
                    ? 
$m[1]
                    : 
substr($m[1], 1strlen($m[1]) - 2);

                if (
'/' !== $url[0] && strpos($url'//') === false && strpos($url'data:') !== 0) {
                    
$url $change_prefix.$url;
                    
$url str_replace('/./''/'$url);
                    do {
                        
$url preg_replace('@/(?!\.\.?)[^/]+/\.\.@''/'$url1$changed);
                    } while (
$changed);
                }

                return 
"url({$quote}{$url}{$quote})";
            },
            
$content
        
);

        return 
$content;
    }

    
/**
     * @param Asset[] $assets
     *
     * @return Asset[]
     */
    
public static function process($assets)
    {
        if (
$directory self::getOutputDirectory()) {
            
$relativeDirectory self::getRelativeOutputDirectory();
            
$filename '';
            
$sourceFiles = array();
            for (
$i 0$i count($assets); $i++) {
                
$asset $assets[$i];
                
$filename .= $asset->getAssetHashKey();
                
$sourceFiles[] = $asset->getAssetURL();
            }
            
$filename sha1($filename);
            
$cacheFile $directory.'/'.$filename.'.css';
            if (!
file_exists($cacheFile)) {
                
$css '';
                foreach (
$assets as $asset) {
                    
$contents $asset->getAssetContents();
                    if (isset(
$contents)) {
                        
$contents CssAsset::changePaths($contents$asset->getAssetURLPath(), $relativeDirectory);
                        if (
$asset->assetSupportsMinification()) {
                            
$contents CssMin::minify($contents);
                        }
                        
$css .= $contents."nn";
                    }
                }
                @
file_put_contents($cacheFile$css);
            }

            
$asset = new CssAsset();
            
$asset->setAssetURL($relativeDirectory.'/'.$filename.'.css');
            
$asset->setAssetPath($directory.'/'.$filename.'.css');
            
$asset->setCombinedAssetSourceFiles($sourceFiles);

            return array(
$asset);
        }

        return 
$assets;
    }

    
/**
     * @return string
     */
    
public function __toString()
    {
        
$e = new HeadLink($this->getAssetURL(), 'stylesheet''text/css''all');
        if (
count($this->combinedAssetSourceFiles)) {
            
$source '';
            foreach (
$this->combinedAssetSourceFiles as $file) {
                
$source .= $file.' ';
            }
            
$source trim($source);
            
$e->setAttribute('data-source'$source);
        }

        return (string) 
$e;
    }
}
Онлайн: 0
Реклама