- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/page/asset.php
- Класс: BitrixMainPageAsset
- Вызов: Asset::optimizeAsset
private function optimizeAsset($files = [], $unique = false, $prefix = 'default', $setName = '', $type = 'css', $data = '')
{
if ((!is_array($files) || empty($files)))
{
return ['RESULT' => '', 'FILES' => []];
}
$this->setTemplateID();
$res = $comments = $contents = '';
$prefix = trim($prefix);
$prefix = mb_strlen($prefix) < 1 ? 'default' : $prefix;
$add2End = (strncmp($prefix, 'kernel', 6) == 0);
$type = ($type == 'js' ? 'js' : 'css');
/** @var bool $noCheckOnly when we cant write files */
$noCheckOnly = !defined('BX_HEADFILES_CACHE_CHECK_ONLY');
$prefix = ($unique ? $prefix : $prefix.'_'.$this->getAssetChecksum($files));
$optimPath = BX_PERSONAL_ROOT.'/cache/'.$type.'/'.SITE_ID.'/'.$this->siteTemplateID.'/'.$prefix.'/';
$infoFile = $this->documentRoot.BX_PERSONAL_ROOT.'/managed_cache/'.$this->dbType.'/'.$type.'/'.SITE_ID.'/'.$this->siteTemplateID.'/'.$prefix.'/info_v'.self::version.'.php';
$optimFile = $optimPath.$prefix.'_v'.self::version.($type == 'css' ? '.css' : '.js');
$optimFName = $this->documentRoot.$optimFile;
$tmpInfo = $this->isAssetChanged($files, $infoFile, $optimFName, $unique);
$filesInfo = $tmpInfo['FILES_INFO'];
$action = $tmpInfo['ACTION'];
$files = $tmpInfo['FILE'];
$optimFileExist = $tmpInfo['FILE_EXIST'] ?? false;
$writeResult = ($action == 'NEW' ? false : true);
$currentFileList = &$this->fileList[strtoupper($type)][$setName];
if ($action != 'NO')
{
foreach ($tmpInfo['FILE'] as $newFile)
{
$currentFileList['UP_NEW_FILES'][] = $newFile['FULL_PATH'];
}
if ($action == 'UP')
{
if ($noCheckOnly)
{
$contents .= file_get_contents($optimFName);
}
else
{
$writeResult = false;
}
}
$needWrite = false;
if ($noCheckOnly)
{
$newContent = '';
$mapNeeded = false;
foreach ($files as $file)
{
$assetContent = file_get_contents($file['FILE_PATH']);
if ($type == 'css')
{
$comments .= "/* ".$file['FULL_PATH']." */n";
$assetContent = $this->fixCSSIncludes($assetContent, $file['PATH']);
$assetContent = "n/* Start:".$file['FULL_PATH']."*/n".$assetContent."n/* End */n";
$newContent .= "n".$assetContent;
}
else
{
$info = [
"full" => $file['FULL_PATH'],
"source" => $file['PATH'],
"min" => "",
"map" => "",
];
if (preg_match("/\.min\.js$/i", $file['FILE_PATH']))
{
$sourceMap = self::cutSourceMap($assetContent);
if ($sourceMap <> '')
{
$dirPath = IOPath::getDirectory($file['PATH']);
$info["map"] = $dirPath."/".$sourceMap;
$info["min"] = self::getAssetPath($file['FULL_PATH']);
$mapNeeded = true;
}
}
$comments .= "; /* ".$file['FULL_PATH']."*/n";
$newContent .= "n".self::HEADER_START_TAG.serialize($info).self::HEADER_END_TAG."n".$assetContent."n/* End */n;";
}
$filesInfo[$file['PATH']] = $this->getAssetTime($file['FULL_PATH']);
$needWrite = true;
}
if ($needWrite)
{
$sourceMap = self::cutSourceMap($contents);
$mapNeeded = $mapNeeded || $sourceMap <> '';
// Write packed files and meta information
$contents = ($add2End ? $comments.$contents.$newContent : $newContent.$contents.$comments);
if ($mapNeeded)
{
$contents .= self::SOURCE_MAP_TAG.$prefix.".map.js";
}
if ($writeResult = $this->write($optimFName, $contents))
{
$cacheInfo = ' $hash)
{
$cacheInfo .= '"'.EscapePHPString($key).'" => "'.$hash.'",';
}
$cacheInfo .= "]; ?>";
$this->write($infoFile, $cacheInfo, false);
if ($mapNeeded)
{
$this->write($this->documentRoot.$optimPath.$prefix.".map.js", self::generateSourceMap($prefix.".js", $contents), false);
}
}
}
elseif ($optimFileExist)
{
$writeResult = true;
}
unset($contents);
}
}
$label = (($type == 'css') && ($prefix == 'template' || mb_substr($prefix, 0, 9) == 'template_') ? ' data-template-style="true" ' : '');
$bundleFile = '';
$extendData = ($data != '' ? ' '.trim($data) : '');
$extendData .= ($label != '' ? ' '.trim($label) : '');
if ($writeResult || $unique && $action == 'UP')
{
$bundleFile = CUtil::GetAdditionalFileURL($optimFile);
$currentFileList['FILES'][] = $bundleFile;
if ($type == 'css')
{
$res .= $this->insertCss($bundleFile, $extendData);
}
else
{
$res .= $this->insertJs($bundleFile, $extendData);
}
}
if (!$writeResult)
{
foreach ($files as $file)
{
$currentFileList['FILES'][] = $file['FULL_PATH'];
if ($type == 'css')
{
$res .= $this->insertCss($file['FULL_PATH'], $extendData);
}
else
{
$res .= $this->insertJs($file['FULL_PATH'], $extendData);
}
}
}
$resultFiles = [];
if (is_array($filesInfo))
{
foreach ($filesInfo as $key => $hash)
{
$resultFiles[] = $key.'?'.$hash;
}
}
unset($files);
if ($bundleFile != '')
{
$currentFileList['FULL_FILES'][$bundleFile] = $resultFiles;
}
return ['RESULT' => $res, 'FILES' => $resultFiles, 'SOURCE_FILES' => array_keys($filesInfo)];
}