Completed
Push — master ( 909a60...7e1872 )
by Nazar
04:01
created

Assets_processing::run()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 23
Code Lines 16

Duplication

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