1: <?php
2:
3: namespace WebLoader\Nette;
4:
5: use Nette\Configurator;
6: use Nette\DI\Compiler;
7: use Nette\DI\CompilerExtension;
8: use Nette\DI\Config\Helpers;
9: use Nette\DI\ContainerBuilder;
10: use Nette\Utils\Finder;
11:
12: if (!class_exists('Nette\DI\CompilerExtension')) {
13: class_alias('Nette\Config\CompilerExtension', 'Nette\DI\CompilerExtension');
14: class_alias('Nette\Config\Compiler', 'Nette\DI\Compiler');
15: class_alias('Nette\Config\Helpers', 'Nette\DI\Config\Helpers');
16: class_alias('Nette\Config\Configurator', 'Nette\Configurator');
17: }
18:
19:
20: 21: 22:
23: class Extension extends CompilerExtension
24: {
25:
26: const DEFAULT_TEMP_PATH = 'webtemp';
27: const EXTENSION_NAME = 'webloader';
28:
29: public function getDefaultConfig()
30: {
31: return array(
32: 'jsDefaults' => array(
33: 'sourceDir' => '%wwwDir%/js',
34: 'tempDir' => '%wwwDir%/' . self::DEFAULT_TEMP_PATH,
35: 'tempPath' => self::DEFAULT_TEMP_PATH,
36: 'files' => array(),
37: 'remoteFiles' => array(),
38: 'filters' => array(),
39: 'fileFilters' => array(),
40: 'joinFiles' => TRUE,
41: 'namingConvention' => '@' . $this->prefix('jsNamingConvention'),
42: ),
43: 'cssDefaults' => array(
44: 'sourceDir' => '%wwwDir%/css',
45: 'tempDir' => '%wwwDir%/' . self::DEFAULT_TEMP_PATH,
46: 'tempPath' => self::DEFAULT_TEMP_PATH,
47: 'files' => array(),
48: 'remoteFiles' => array(),
49: 'filters' => array(),
50: 'fileFilters' => array(),
51: 'joinFiles' => TRUE,
52: 'namingConvention' => '@' . $this->prefix('cssNamingConvention'),
53: ),
54: 'js' => array(
55:
56: ),
57: 'css' => array(
58:
59: ),
60: );
61: }
62:
63: public function loadConfiguration()
64: {
65: $builder = $this->getContainerBuilder();
66: $config = $this->getConfig($this->getDefaultConfig());
67:
68: $builder->addDefinition($this->prefix('cssNamingConvention'))
69: ->setFactory('WebLoader\DefaultOutputNamingConvention::createCssConvention');
70:
71: $builder->addDefinition($this->prefix('jsNamingConvention'))
72: ->setFactory('WebLoader\DefaultOutputNamingConvention::createJsConvention');
73:
74: $builder->parameters['webloader'] = $config;
75:
76: $loaderFactoryTempPaths = array();
77:
78: foreach (array('css', 'js') as $type) {
79: foreach ($config[$type] as $name => $wlConfig) {
80: $wlConfig = Helpers::merge($wlConfig, $config[$type . 'Defaults']);
81: $this->addWebLoader($builder, $type . ucfirst($name), $wlConfig);
82: $loaderFactoryTempPaths[strtolower($name)] = $wlConfig['tempPath'];
83: }
84: }
85:
86: $builder->addDefinition($this->prefix('factory'))
87: ->setClass('WebLoader\LoaderFactory', array($loaderFactoryTempPaths));
88: }
89:
90: private function addWebLoader(ContainerBuilder $builder, $name, $config)
91: {
92: $filesServiceName = $this->prefix($name . 'Files');
93:
94: $files = $builder->addDefinition($filesServiceName)
95: ->setClass('WebLoader\FileCollection')
96: ->setArguments(array($config['sourceDir']));
97:
98: foreach ($config['files'] as $file) {
99:
100: if (is_array($file) && isset($file['files']) && (isset($file['in']) || isset($file['from']))) {
101: $finder = Finder::findFiles($file['files']);
102:
103: if (isset($file['exclude'])) {
104: $finder->exclude($file['exclude']);
105: }
106:
107: if (isset($file['in'])) {
108: $finder->in($file['in']);
109: } else {
110: $finder->from($file['from']);
111: }
112:
113: foreach ($finder as $foundFile) {
114: $files->addSetup('addFile', array((string) $foundFile));
115: }
116: } else {
117: $files->addSetup('addFile', array($file));
118: }
119: }
120:
121: $files->addSetup('addRemoteFiles', array($config['remoteFiles']));
122:
123: $compiler = $builder->addDefinition($this->prefix($name . 'Compiler'))
124: ->setClass('WebLoader\Compiler')
125: ->setArguments(array(
126: '@' . $filesServiceName,
127: $config['namingConvention'],
128: $config['tempDir'],
129: ));
130:
131: $compiler->addSetup('setJoinFiles', array($config['joinFiles']));
132:
133: foreach ($config['filters'] as $filter) {
134: $compiler->addSetup('addFilter', array($filter));
135: }
136:
137: foreach ($config['fileFilters'] as $filter) {
138: $compiler->addSetup('addFileFilter', array($filter));
139: }
140:
141:
142: }
143:
144: public function install(Configurator $configurator)
145: {
146: $self = $this;
147: $configurator->onCompile[] = function ($configurator, Compiler $compiler) use ($self) {
148: $compiler->addExtension($self::EXTENSION_NAME, $self);
149: };
150: }
151:
152: }
153: