-
Notifications
You must be signed in to change notification settings - Fork 6
/
CoreDump.php
131 lines (119 loc) · 3.81 KB
/
CoreDump.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?php
/*
* OPEN POWER LIBS <http://www.invenzzia.org>
*
* This file is subject to the new BSD license that is bundled
* with this package in the file LICENSE. It is also available through
* WWW at this URL: <http://www.invenzzia.org/license/new-bsd>
*
* Copyright (c) Invenzzia Group <http://www.invenzzia.org>
* and other contributors. See website for details.
*/
namespace Opl\Autoloader\Toolset;
use Opl\Autoloader\Exception\FileNotFoundException;
/**
* This tool allows to process the application core in order to optimize
* the loading process.
*
* @author Tomasz Jędrzejewski
* @copyright Invenzzia Group <http://www.invenzzia.org/> and contributors.
* @license http://www.invenzzia.org/license/new-bsd New BSD License
*/
class CoreDump extends AbstractTool
{
/**
* The application core.
* @var string[]
*/
protected $core;
/**
* Loads the application core generated by <tt>CoreTracker</tt>.
*
* @throws FileNotFoundException
* @param string $coreFile The path to the core file.
* @return CoreDump Fluent interface.
*/
public function loadCore($coreFile)
{
if(!file_exists($coreFile))
{
throw new FileNotFoundException('Cannot open the specified core file.');
}
$this->core = unserialize(file_get_contents($coreFile));
return $this;
} // end loadCore();
/**
* Produces a PHP file that contains the <tt>require</tt> statements that
* load the application core.
*
* @param string $output The path to the output file.
* @return CoreDump Fluent interface.
*/
public function exportRequireList($output)
{
$outFile = fopen($output, 'w');
fwrite($outFile, '<'.'?php'.PHP_EOL.'// This file has been generated automatically by Open Power Autoloader.'.
PHP_EOL.'// Do not edit manually!'.PHP_EOL);
foreach($this->core as $className)
{
fwrite($outFile, 'require(\''.$this->toFilename($className, true).'\');'.PHP_EOL);
}
fclose($outFile);
return $this;
} // end exportRequireList();
/**
* Produces a PHP file that contains the concatenated application core.
* The algorithm correctly handles namespaces, ensuring that there will be
* no conflicts, and might also be used to remove the heading comments.
*
* @param string $output The path to the output file.
* @param boolean $removeHeadings Do we remove heading comments?
* @return CoreDump Fluent interface.
*/
public function exportConcatenated($output, $removeHeadings = true)
{
$outFile = fopen($output, 'w');
fwrite($outFile, '<'.'?php'.PHP_EOL.'// This file has been generated automatically by Open Power Autoloader.'.
PHP_EOL.'// Do not edit manually!'.PHP_EOL);
foreach($this->core as $className)
{
fwrite($outFile, $this->parseFile($this->toFilename($className, true), $removeHeadings));
}
fclose($outFile);
return $this;
} // end exportConcatenated();
/**
* Processes a single PHP file in order to concatenate it.
*
* @param string $filename The PHP file name
* @param boolean $removeHeadings Do we remove heading comments?
* @return string The output document
*/
protected function parseFile($filename, $removeHeadings)
{
$content = file_get_contents($filename);
// Removing headings
if($removeHeadings)
{
// \/\*\*.+\*\/
$content = preg_replace('#^\<\?php[\s\n\r]*\/\*\*.+\*\/[\s\n\r]*#is', '', $content);
}
else
{
$content = preg_replace('#^\<\?php\s*#i', '', $content);
}
// Fixing the namespace definition to avoid collisions after concatenation.
if(preg_match('#namespace\s+([a-zA-Z0-9\_\\\\]+)\s*([\\;\{])#i', $content, $matches))
{
if($matches[2] == ';')
{
$content = str_replace($matches[0], 'namespace '.$matches[1].'{', $content).PHP_EOL.'}'.PHP_EOL;
}
}
else
{
$content = PHP_EOL.'namespace'.PHP_EOL.'{'.PHP_EOL.$content.PHP_EOL.'}'.PHP_EOL;
}
return $content;
} // end parseFile();
} // end CoreDump;