/
JavascriptAsset.php
119 lines (105 loc) · 2.97 KB
/
JavascriptAsset.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php
namespace Concrete\Core\Asset;
use HtmlObject\Element;
use Config;
class JavascriptAsset extends Asset
{
/**
* @var bool
*/
protected $assetSupportsMinification = true;
/**
* @var bool
*/
protected $assetSupportsCombination = true;
/**
* @return string
*/
public function getAssetDefaultPosition()
{
return Asset::ASSET_POSITION_FOOTER;
}
/**
* @return string
*/
public static function getRelativeOutputDirectory()
{
return REL_DIR_FILES_CACHE.'/'.DIRNAME_JAVASCRIPT;
}
/**
* @return bool|string
*/
protected static function getOutputDirectory()
{
if (!file_exists(Config::get('concrete.cache.directory').'/'.DIRNAME_JAVASCRIPT)) {
$proceed = @mkdir(Config::get('concrete.cache.directory').'/'.DIRNAME_JAVASCRIPT);
} else {
$proceed = true;
}
if ($proceed) {
return Config::get('concrete.cache.directory').'/'.DIRNAME_JAVASCRIPT;
} else {
return false;
}
}
/**
* @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.'.js';
if (!file_exists($cacheFile)) {
$js = '';
foreach ($assets as $asset) {
$contents = $asset->getAssetContents();
if (isset($contents)) {
$js .= $contents.";\n\n";
}
}
@file_put_contents($cacheFile, $js);
}
$asset = new self();
$asset->setAssetURL($relativeDirectory.'/'.$filename.'.js');
$asset->setAssetPath($directory.'/'.$filename.'.js');
$asset->setCombinedAssetSourceFiles($sourceFiles);
return array($asset);
}
return $assets;
}
/**
* @return string
*/
public function getAssetType()
{
return 'javascript';
}
/**
* @return string
*/
public function __toString()
{
$e = new Element('script');
$e->type('text/javascript')->src($this->getAssetURL());
if (count($this->combinedAssetSourceFiles)) {
$source = '';
foreach ($this->combinedAssetSourceFiles as $file) {
$source .= $file.' ';
}
$source = trim($source);
$e->setAttribute('data-source', $source);
}
return (string) $e;
}
}