Completed
Push — master ( fd8f4b...82d518 )
by Nazar
05:01
created

Assets_processing   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 135
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
dl 0
loc 135
rs 10
c 0
b 0
f 0
wmc 20
lcom 1
cbo 2

7 Methods

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