Completed
Push — master ( ab3150...6d49f6 )
by Nazar
04:25
created

Assets_processing::run()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

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