@@ -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 */
277306Prince . 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 ( / p r i n c e : \s + e r r o r : \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