Completed
Push — master ( 67d50f...8a7d08 )
by Nazar
04:56
created

Assets_processing::get_content()   C

Complexity

Conditions 7
Paths 7

Size

Total Lines 29
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 25
nc 7
nop 5
dl 0
loc 29
rs 6.7272
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
		return array_unique(array_merge(...$files));
66
	}
67
	/**
68
	 * @param array  $meta
69
	 * @param string $package_name
70
	 *
71
	 * @return string[]
72
	 */
73
	protected static function extract_files ($meta, $package_name) {
74
		$meta += ['require_bower' => [], 'require_npm' => []];
75
		$packages = $meta['require_bower'] + $meta['require_npm'];
76
		return isset($packages[$package_name]['files']) ? $packages[$package_name]['files'] : [];
77
	}
78
	/**
79
	 * @param Config   $Config
80
	 * @param string[] $files
81
	 * @param string   $package_name
82
	 * @param string   $package_dir
83
	 * @param string   $target_dir
84
	 *
85
	 * @return string[][]
86
	 */
87
	protected static function get_content ($Config, $files, $package_name, $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'][] = Includes_processing::css(file_get_contents($file), $file);
97
					break;
98
				case 'html':
99
					$content['html'][] = Includes_processing::html(
100
						file_get_contents($file),
101
						$file,
102
						"$target_dir/$package_name",
103
						$Config->core['vulcanization']
104
					);
105
					break;
106
				case 'less':
107
					$content['css'][] = Includes_processing::css(self::compile_less($file), $file);
108
					break;
109
				case 'scss':
110
					$content['css'][] = Includes_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