Completed
Push — master ( 4c24ff...8a852c )
by Nazar
04:10
created

Assets_processing::get_content()   D

Complexity

Conditions 9
Paths 16

Size

Total Lines 40
Code Lines 31

Duplication

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