1 : <?php
2 :
3 : /**
4 : * \Midi\Reporting\Printer
5 : *
6 : * @package Midi
7 : * @subpackage Reporting
8 : * @copyright © 2009 Tommy Montgomery <http://phpmidiparser.com/>
9 : * @since 1.0
10 : */
11 :
12 : namespace Midi\Reporting;
13 :
14 : use \Midi\Delta;
15 : use \Midi\TrackHeader;
16 : use \Midi\FileHeader;
17 : use \Midi\Event;
18 : use \Midi\Parsing\Parser;
19 :
20 : /**
21 : * Default printer for parse results
22 : *
23 : * This class handles the output created by a
24 : * {@link Formatter}.
25 : *
26 : * @package Midi
27 : * @subpackage Reporting
28 : * @since 1.0
29 : */
30 : class Printer {
31 :
32 : /**
33 : * @var Formatter
34 : */
35 : protected $formatter;
36 :
37 : /**
38 : * @var Parser
39 : */
40 : protected $parser;
41 :
42 : /**
43 : * @var bool
44 : */
45 : protected $isParsingTrack;
46 :
47 : /**
48 : * @var float
49 : */
50 : protected $parseTime;
51 :
52 : /**
53 : * @var float
54 : */
55 : protected $totalTime;
56 :
57 : /**
58 : * @var array
59 : */
60 : protected $params;
61 :
62 : /**
63 : * Constructor
64 : *
65 : * @since 1.0
66 : *
67 : * @param Formatter $formatter
68 : * @param Parser $parser
69 : */
70 : public function __construct(Formatter $formatter, Parser $parser) {
71 13 : $this->formatter = $formatter;
72 13 : $this->parser = $parser;
73 13 : $this->isParsingTrack = false;
74 13 : $this->parseTime = 0;
75 13 : $this->totalTime = 0;
76 13 : $this->params = array();
77 13 : }
78 :
79 : /**
80 : * Gets whether a track is currently being a parsed
81 : *
82 : * @since 1.0
83 : *
84 : * @return bool
85 : */
86 : public function isParsingTrack() {
87 2 : return $this->isParsingTrack;
88 : }
89 :
90 : /**
91 : * Prints the formatted results of a complete parse
92 : *
93 : * @since 1.0
94 : * @uses printNext()
95 : * @uses doPostProcessing()
96 : */
97 : public function printAll() {
98 1 : while ($this->printNext()) {}
99 :
100 1 : $this->doPostProcessing($this->params);
101 1 : }
102 :
103 : /**
104 : * Sets a custom parameter
105 : *
106 : * @since 1.0
107 : *
108 : *
109 : * @param string $key
110 : * @param string $value
111 : */
112 : public function setParameter($key, $value) {
113 2 : $this->params[$key] = $value;
114 2 : }
115 :
116 : /**
117 : * Handles any post processing that the formatter requires
118 : *
119 : * @since 1.0
120 : * @uses Formatter::getPostProcessor()
121 : * @uses PostProcesor::setParamter()
122 : * @uses PostProcesor::execute()
123 : *
124 : * @param array $params Parameters to set on the post processor
125 : */
126 : public function doPostProcessing(array $params = array()) {
127 1 : $processor = $this->formatter->getPostProcessor();
128 :
129 1 : foreach ($params as $key => $value) {
130 1 : $processor->setParameter($key, $value);
131 1 : }
132 :
133 1 : $processor->execute();
134 1 : }
135 :
136 : /**
137 : * Parses, formats and prints the next chunk
138 : *
139 : * @since 1.0
140 : * @uses Parser::parse()
141 : * @uses printEvent()
142 : * @uses printDelta()
143 : * @uses printTrackHeader()
144 : * @uses printFileHeader()
145 : * @uses printEof()
146 : * @uses printData()
147 : *
148 : * @return bool true if there is more to parse, false if EOF has been reached
149 : */
150 : public function printNext() {
151 8 : $totalTime = microtime(true);
152 8 : $parseTime = $totalTime;
153 8 : $chunk = $this->parser->parse();
154 8 : $this->parseTime += microtime(true) - $parseTime;
155 8 : $notEof = true;
156 :
157 8 : if ($chunk !== null) {
158 6 : if ($chunk instanceof Delta) {
159 1 : $this->printDelta($chunk);
160 6 : } else if ($chunk instanceof Event) {
161 1 : $this->printEvent($chunk);
162 5 : } else if ($chunk instanceof TrackHeader) {
163 2 : $this->printTrackHeader($chunk);
164 4 : } else if ($chunk instanceof FileHeader) {
165 2 : $this->printFileHeader($chunk);
166 2 : }
167 6 : } else {
168 3 : $this->printEof();
169 3 : $notEof = false;
170 : }
171 :
172 8 : $this->totalTime += microtime(true) - $totalTime;
173 :
174 8 : return $notEof;
175 : }
176 :
177 : /**
178 : * Prints the data
179 : *
180 : * @since 1.0
181 : *
182 : * @param string $data
183 : */
184 : protected function printData($data) {
185 7 : echo $data;
186 7 : }
187 :
188 : /**
189 : * Prints an event
190 : *
191 : * @since 1.0
192 : * @uses Formatter::beforeEvent()
193 : * @uses Formatter::formatEvent()
194 : * @uses Formatter::afterEvent()
195 : * @uses printData()
196 : *
197 : * @param Event $event
198 : */
199 : protected function printEvent(Event $event) {
200 1 : $this->printData($this->formatter->beforeEvent($event));
201 1 : $this->printData($this->formatter->beforeChunk($event));
202 1 : $this->printData($this->formatter->formatEvent($event));
203 1 : $this->printData($this->formatter->afterChunk($event));
204 1 : $this->printData($this->formatter->afterEvent($event));
205 1 : }
206 :
207 : /**
208 : * Prints a delta time
209 : *
210 : * @since 1.0
211 : * @uses Formatter::beforeDelta()
212 : * @uses Formatter::formatDelta()
213 : * @uses Formatter::afterDelta()
214 : * @uses printData()
215 : *
216 : * @param Delta $delta
217 : */
218 : protected function printDelta(Delta $delta) {
219 1 : $this->printData($this->formatter->beforeDelta($delta));
220 1 : $this->printData($this->formatter->beforeChunk($delta));
221 1 : $this->printData($this->formatter->formatDelta($delta));
222 1 : $this->printData($this->formatter->afterChunk($delta));
223 1 : $this->printData($this->formatter->afterDelta($delta));
224 1 : }
225 :
226 : /**
227 : * Prints a track header
228 : *
229 : * @since 1.0
230 : * @uses isParsingTrack()
231 : * @uses Formatter::afterTrack()
232 : * @uses Formatter::beforeTrack()
233 : * @uses Formatter::beforeTrackHeader()
234 : * @uses Formatter::afterTrackHeader()
235 : * @uses TrackHeader::getSize()
236 : * @uses printData()
237 : *
238 : * @param TrackHeader $trackHeader
239 : */
240 : protected function printTrackHeader(TrackHeader $trackHeader) {
241 2 : if ($this->isParsingTrack()) {
242 1 : $this->printData($this->formatter->afterTrack());
243 1 : }
244 :
245 2 : $this->isParsingTrack = false;
246 :
247 2 : $this->printData($this->formatter->beforeTrack());
248 2 : $this->printData($this->formatter->beforeTrackHeader($trackHeader));
249 2 : $this->printData($this->formatter->beforeChunk($trackHeader));
250 2 : $this->printData($this->formatter->formatTrackHeader($trackHeader));
251 2 : $this->printData($this->formatter->afterChunk($trackHeader));
252 2 : $this->printData($this->formatter->afterTrackHeader($trackHeader));
253 :
254 2 : if ($trackHeader->getSize() > 0) {
255 1 : $this->isParsingTrack = true;
256 1 : }
257 2 : }
258 :
259 : /**
260 : * Prints a file header
261 : *
262 : * @since 1.0
263 : * @uses Formatter::beforeFile()
264 : * @uses Formatter::beforeFileHeader()
265 : * @uses Formatter::formatFileHeader()
266 : * @uses Formatter::afterFileHeader()
267 : * @uses printData()
268 : *
269 : * @param FileHeader $fileHeader
270 : */
271 : protected function printFileHeader(FileHeader $fileHeader) {
272 1 : $this->printData($this->formatter->beforeFile());
273 1 : $this->printData($this->formatter->beforeFileHeader($fileHeader));
274 1 : $this->printData($this->formatter->beforeChunk($fileHeader));
275 1 : $this->printData($this->formatter->formatFileHeader($fileHeader));
276 1 : $this->printData($this->formatter->afterChunk($fileHeader));
277 1 : $this->printData($this->formatter->afterFileHeader($fileHeader));
278 1 : }
279 :
280 : /**
281 : * Prints EOF
282 : *
283 : * @since 1.0
284 : * @uses isParsingTrack()
285 : * @uses Formatter::afterTrack()
286 : * @uses Formatter::afterFile()
287 : * @uses printData()
288 : */
289 : protected function printEof() {
290 2 : if ($this->isParsingTrack()) {
291 1 : $this->printData($this->formatter->afterTrack());
292 1 : }
293 :
294 2 : $this->printData($this->formatter->afterFile($this->parseTime, $this->totalTime));
295 2 : $this->isParsingTrack = false;
296 2 : }
297 :
298 : }
299 :
|