Completed
Push — master ( 730d67...8f00f0 )
by Nazar
06:08
created

Assets_processing::get_files()   B

Complexity

Conditions 6
Paths 12

Size

Total Lines 19
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 13
nc 12
nop 2
dl 0
loc 19
rs 8.8571
c 0
b 0
f 0
1
<?php
2
/**
3
 * @package   Composer assets
4
 * @category  modules
5
 * @author    Nazar Mokrynskyi <[email protected]>
6
 * @copyright Copyright (c) 2015-2016, Nazar Mokrynskyi
7
 * @license   MIT License, see license.txt
8
 */
9
namespace cs\modules\Composer_assets;
10
use
11
	cs\Config,
12
	Exception,
13
	cs\Page\Includes_processing,
14
	Less_Parser,
15
	Leafo\ScssPhp\Compiler as Scss_compiler;
16
17
class Assets_processing {
18
	/**
19
	 * @param string $package_name
20
	 * @param string $package_dir
21
	 * @param string $composer_assets_dir
22
	 *
23
	 * @return string[][]
24
	 */
25
	static function run ($package_name, $package_dir, $composer_assets_dir) {
26
		$package_name = explode('/', $package_name, 2)[1];
27
		$Config       = Config::instance();
28
		$files        = self::get_files($Config, $package_name);
29
		if (!$files) {
30
			return [];
31
		}
32
		$target_dir = "$composer_assets_dir/$package_name";
33
		@mkdir($target_dir, 0770, true);
34
		file_put_contents(
35
			"$target_dir/.htaccess",
36
			/** @lang ApacheConfig */
37
			<<<HTACCESS
38
<FilesMatch "\.css$">
39
	Header set Content-Type text/css
40
</FilesMatch>
41
HTACCESS
42
		);
43
		return self::save_content(
44
			self::get_content($Config, $files, $package_name, $package_dir, $target_dir),
45
			$target_dir
46
		);
47
	}
48
	/**
49
	 * @param Config $Config
50
	 * @param string $package_name
51
	 *
52
	 * @return string[]
53
	 */
54
	protected static function get_files ($Config, $package_name) {
55
		$files = [];
56
		foreach ($Config->components['modules'] as $module_name => $module_data) {
57
			if ($module_data['active'] == Config\Module_Properties::UNINSTALLED) {
58
				continue;
59
			}
60
			if (file_exists(MODULES."/$module_name/meta.json")) {
61
				$meta    = file_get_json(MODULES."/$module_name/meta.json");
62
				$files[] = self::extract_files($meta, $package_name);
63
			}
64
		}
65
		foreach ($Config->components['plugins'] as $plugin_name) {
66
			if (file_exists(PLUGINS."/$plugin_name/meta.json")) {
67
				$meta    = file_get_json(PLUGINS."/$plugin_name/meta.json");
68
				$files[] = self::extract_files($meta, $package_name);
69
			}
70
		}
71
		return array_unique(array_merge(...$files));
72
	}
73
	/**
74
	 * @param array  $meta
75
	 * @param string $package_name
76
	 *
77
	 * @return string[]
78
	 */
79
	protected static function extract_files ($meta, $package_name) {
80
		$meta += ['require_bower' => [], 'require_npm' => []];
81
		$packages = $meta['require_bower'] + $meta['require_npm'];
82
		return isset($packages[$package_name]['files']) ? $packages[$package_name]['files'] : [];
83
	}
84
	/**
85
	 * @param Config   $Config
86
	 * @param string[] $files
87
	 * @param string   $package_name
88
	 * @param string   $package_dir
89
	 * @param string   $target_dir
90
	 *
91
	 * @return string[][]
92
	 */
93
	protected static function get_content ($Config, $files, $package_name, $package_dir, $target_dir) {
94
		$content = [];
95
		foreach ($files as $file) {
96
			$file = "$package_dir/$file";
97
			switch (file_extension($file)) {
98
				case 'js':
99
					$content['js'][] = file_get_contents($file);
100
					break;
101
				case 'css':
102
					$content['css'][] = Includes_processing::css(file_get_contents($file), $file);
103
					break;
104
				case 'html':
105
					$content['html'][] = Includes_processing::html(
106
						file_get_contents($file),
107
						$file,
108
						"$target_dir/$package_name",
109
						$Config->core['vulcanization']
110
					);
111
					break;
112
				case 'less':
113
					$content['css'][] = Includes_processing::css(self::compile_less($file), $file);
114
					break;
115
				case 'scss':
116
					$content['css'][] = Includes_processing::css(self::compile_scss($file), $file);
117
					break;
118
			}
119
		}
120
		return $content;
121
	}
122
	/**
123
	 * @param string $less_file
124
	 *
125
	 * @return string CSS
126
	 */
127
	protected static function compile_less ($less_file) {
128
		try {
129
			return (new Less_Parser)->parseFile($less_file)->getCss();
130
		} catch (Exception $e) {
131
			return '';
132
		}
133
	}
134
	/**
135
	 * @param string $scss_file
136
	 *
137
	 * @return string CSS
138
	 */
139
	protected static function compile_scss ($scss_file) {
140
		return (new Scss_compiler)->compile(file_get_contents($scss_file));
141
	}
142
	/**
143
	 * @param string[][] $content
144
	 * @param string     $target_dir
145
	 *
146
	 * @return string[][]
147
	 */
148
	protected static function save_content ($content, $target_dir) {
149
		$result = [];
150
		foreach ($content as $extension => $c) {
151
			$target_file = "$target_dir/index.$extension";
152
			file_put_contents($target_file, implode('', $c), FILE_APPEND);
153
			$result[$extension][] = $target_file;
154
		}
155
		return $result;
156
	}
157
}
158