Skip to content

Commit 81730b3

Browse files
Merge pull request #3 from electricbookworks/log-progress
Implement logging, copied from bengler/node-prince #7
2 parents b65f7ad + 9e56e7e commit 81730b3

1 file changed

Lines changed: 68 additions & 11 deletions

File tree

prince-api.js

Lines changed: 68 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,9 @@ var princeOptions = {
126126
"raster-background": true,
127127
"raster-threads": true,
128128
"scanfonts": false,
129-
"control": false
129+
"control": false,
130+
"structured-log": false,
131+
"debug": false
130132
};
131133

132134
/* API constructor */
@@ -149,6 +151,9 @@ function Prince (options) {
149151
output: ""
150152
};
151153

154+
/* array for holding event handlers */
155+
this.eventHandlers = {stdout: [], stderr: []};
156+
152157
/* override defaults with more reasonable information about environment */
153158
var install = [
154159
{ basedir: "prince/lib/prince", binary: "bin/prince" },
@@ -273,6 +278,30 @@ Prince.prototype.option = function (name, value, forced) {
273278
return this;
274279
};
275280

281+
/* register event handlers */
282+
Prince.prototype.on = function (eventName, fn) {
283+
if (!this.eventHandlers.hasOwnProperty(eventName)) {
284+
throw new Error("Unknown event name. Event must be one of '"
285+
+ Object.keys(this.eventHandlers).join("', '") + "'");
286+
}
287+
var alreadyAdded = this.eventHandlers[eventName].indexOf(fn) > -1
288+
if (!alreadyAdded) {
289+
this.eventHandlers[eventName].push(fn);
290+
}
291+
return this;
292+
};
293+
294+
/* unregister event handlers */
295+
Prince.prototype.off = function (eventName, fn) {
296+
if (!this.eventHandlers.hasOwnProperty(eventName)) {
297+
throw new Error("Unknown event name. Event must be one of '"
298+
+ Object.keys(this.eventHandlers).join("', '") + "'");
299+
}
300+
var index = this.eventHandlers[eventName].indexOf(fn)
301+
this.eventHandlers[eventName].splice(index, 1)
302+
return this;
303+
};
304+
276305
/* execute the CLI binary */
277306
Prince.prototype._execute = function (method, args) {
278307
/* determine path to prince(1) binary */
@@ -302,17 +331,45 @@ Prince.prototype._execute = function (method, args) {
302331
options.maxBuffer = self.config.maxbuffer;
303332
options.cwd = self.config.cwd;
304333
options.encoding = "buffer";
305-
child_process.execFile(prog, args, options,
306-
function (error, stdout, stderr) {
307-
var m;
308-
if (error === null && (m = stderr.toString().match(/prince:\s+error:\s+([^\n]+)/)))
309-
reject({ error: m[1], stdout: stdout, stderr: stderr });
310-
else if (error !== null)
311-
reject({ error: error, stdout: stdout, stderr: stderr });
312-
else
313-
resolve({ stdout: stdout, stderr: stderr });
334+
var _stdout = "";
335+
var _stderr = "";
336+
var princeProcess = child_process.spawn(prog, args, options);
337+
338+
function callLineByLine(eventName, fn, data) {
339+
(""+data).split("\n").map(function(line) {
340+
var stillRegistered = self.eventHandlers[eventName].indexOf(fn) > -1;
341+
if (line && stillRegistered) {
342+
fn(line, self);
343+
}
344+
})
345+
};
346+
347+
princeProcess.stdout.on("data", function(data) {
348+
self.eventHandlers.stdout.map(function(fn) {
349+
callLineByLine("stdout", fn, data);
350+
})
351+
_stdout += data;
352+
});
353+
354+
princeProcess.stderr.on("data", function(data) {
355+
self.eventHandlers.stderr.map(function(fn) {
356+
callLineByLine("stderr", fn, data);
357+
});
358+
_stderr += data;
359+
});
360+
361+
princeProcess.on("error", function(err) {
362+
reject({ error: err, stdout: _stdout, stderr: _stderr });
363+
});
364+
365+
princeProcess.on("close", function(code) {
366+
if (code !== 0) {
367+
var error = new Error("Prince process exited with status code: "+code);
368+
error.code = code;
369+
return reject({ error: error, stdout: _stdout, stderr: _stderr });
314370
}
315-
);
371+
resolve({ stdout: _stdout, stderr: _stderr });
372+
});
316373
}
317374
catch (exception) {
318375
reject({ error: exception, stdout: "", stderr: "" });

0 commit comments

Comments
 (0)