@@ -270,15 +270,33 @@ function setupConsoleLogPipe() {
270270 let defaultConsoleError = console . error ;
271271
272272 // Overwrite log functions to parse and pipe to debug html console
273- console . log = ( message ) => { parseMessageAndLog ( message , 'log' , defaultConsoleLog ) ; } ;
274- console . info = ( message ) => { parseMessageAndLog ( message , 'info' , defaultConsoleInfo ) ; } ;
275- console . debug = ( message ) => { parseMessageAndLog ( message , 'debug' , defaultConsoleDebug ) ; } ;
276- console . warn = ( message ) => { parseMessageAndLog ( message , 'warn' , defaultConsoleWarn ) ; } ;
277- console . error = ( message ) => { parseMessageAndLog ( message , 'error' , defaultConsoleError ) ; errorReceived ( ) ; } ;
273+ console . log = ( message ) => { handleLog ( message , 'log' , defaultConsoleLog ) ; } ;
274+ console . info = ( message ) => { handleLog ( message , 'info' , defaultConsoleInfo ) ; } ;
275+ console . debug = ( message ) => { handleLog ( message , 'debug' , defaultConsoleDebug ) ; } ;
276+ console . warn = ( message ) => { handleLog ( message , 'warn' , defaultConsoleWarn ) ; } ;
277+ console . error = ( message ) => { handleLog ( message , 'error' , defaultConsoleError ) ; errorReceived ( ) ; } ;
278278
279279
280- parseMessageAndLog = ( message , logLevel , consoleLogFunction ) => {
280+ handleLog = ( message , logLevel , consoleLogFunction ) => {
281281 updateLogCounter ( logLevel ) ;
282+ if ( typeof message === 'string' ) {
283+ // Only parse messages that are actual strings
284+ parseMessageAndLog ( message , logLevel , consoleLogFunction ) ;
285+ }
286+ else {
287+ consoleLogFunction ( message ) ;
288+ // Try to also log the object to the html console (does not always work in a meaningful manner)
289+ var htmlMessage ;
290+ try {
291+ htmlMessage = JSON . stringify ( message ) ;
292+ } catch ( error ) {
293+ htmlMessage = `Can't convert message to JSON: ${ error } ` ;
294+ }
295+ htmlLog ( htmlMessage , logLevel ) ;
296+ }
297+ } ;
298+
299+ parseMessageAndLog = ( message , logLevel , consoleLogFunction ) => {
282300 let styledTextParts = parseUnityRichText ( message ) ;
283301
284302 let consoleText = '' ;
@@ -301,16 +319,17 @@ class StyledTextPart {
301319 }
302320
303321 toHTML ( ) {
304- if ( this . styles . length > 0 ) {
322+ if ( this . styles . length > 0 ) {
305323 return `<span style="${ this . styles . join ( ';' ) } ">${ this . text } </span>` ;
306324 }
307325 return this . text ;
308326 }
309327
310328 toConsoleStyleString ( ) {
311- if ( this . styles . length > 0 ) {
329+ if ( this . styles . length > 0 ) {
312330 return this . styles . join ( ';' ) ;
313331 }
332+ // Return some styling that does not change anything to support unstyled text
314333 return 'color:inherit' ;
315334 }
316335
@@ -321,11 +340,12 @@ class StyledTextPart {
321340
322341function parseUnityRichText ( message ) {
323342 // Mapping for unity tags to css style tags
343+ // Unity rich text tags, see https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/StyledText.html
324344 const tagMap = {
325- 'color' : { startTag : '<color=' , closeTag : '</color>' , styleTag : 'color:' , postfix : '' , hasParameter : true } ,
326- 'size' : { startTag : '<size=' , closeTag : '</size>' , styleTag : 'font-size:' , postfix : 'px' , hasParameter : true } ,
327- 'bold' : { startTag : '<b' , closeTag : '</b>' , styleTag : 'font-weight:' , styleValue : 'bold' , hasParameter : false } ,
328- 'italic' : { startTag : '<i' , closeTag : '</i>' , styleTag : 'font-style:' , styleValue : 'italic' , hasParameter : false }
345+ 'color' : { startTag : '<color=' , closeTag : '</color>' , styleTag : 'color:' , postfix : '' , hasParameter : true } ,
346+ 'size' : { startTag : '<size=' , closeTag : '</size>' , styleTag : 'font-size:' , postfix : 'px' , hasParameter : true } ,
347+ 'bold' : { startTag : '<b' , closeTag : '</b>' , styleTag : 'font-weight:' , styleValue : 'bold' , hasParameter : false } ,
348+ 'italic' : { startTag : '<i' , closeTag : '</i>' , styleTag : 'font-style:' , styleValue : 'italic' , hasParameter : false }
329349 } ;
330350
331351 let index = 0 ;
@@ -338,7 +358,7 @@ function parseUnityRichText(message) {
338358 // next end index for each tag
339359 let nextEndIndex = [ ] ;
340360 Object . keys ( tagMap ) . forEach ( key => {
341- nextStartIndex [ key ] = message . indexOf ( tagMap [ key ] . startTag , index ) ;
361+ nextStartIndex [ key ] = message . indexOf ( tagMap [ key ] . startTag , index ) ;
342362 nextEndIndex [ key ] = message . indexOf ( tagMap [ key ] . closeTag , index ) ;
343363 } ) ;
344364
@@ -350,14 +370,14 @@ function parseUnityRichText(message) {
350370
351371 // find the next tag start or end
352372 Object . keys ( tagMap ) . forEach ( key => {
353- if ( nextStartIndex [ key ] >= 0 && nextStartIndex [ key ] < nextIndex ) {
373+ if ( nextStartIndex [ key ] >= 0 && nextStartIndex [ key ] < nextIndex ) {
354374 nextIndex = nextStartIndex [ key ] ;
355375 nextKey = key ;
356376 fromArray = nextStartIndex ;
357377 nextTagFound = true ;
358378 }
359379
360- if ( nextEndIndex [ key ] >= 0 && nextEndIndex [ key ] < nextIndex ) {
380+ if ( nextEndIndex [ key ] >= 0 && nextEndIndex [ key ] < nextIndex ) {
361381 nextIndex = nextEndIndex [ key ] ;
362382 nextKey = key ;
363383 fromArray = nextEndIndex ;
@@ -366,39 +386,44 @@ function parseUnityRichText(message) {
366386 } ) ;
367387
368388 // write the text in before the next tag to our style text part array
369- if ( nextIndex > index ) {
389+ if ( nextIndex > index ) {
370390 let messageToNextTag = message . substring ( index , nextIndex ) ;
371391 let styles = [ ...styleStack ] ;
372392 styledTextParts . push ( new StyledTextPart ( messageToNextTag , styles ) ) ;
373393 }
374394
375395 // end if no more tags exist
376- if ( nextTagFound === false ) {
396+ if ( nextTagFound === false ) {
377397 index = message . length ;
378398 break ;
379399 }
380400
401+ let closeTagIndex = message . indexOf ( '>' , nextIndex + 1 ) ;
402+
381403 // Process start tag
382- if ( fromArray === nextStartIndex ) {
383- nextStartIndex [ nextKey ] = message . indexOf ( tagMap [ nextKey ] . startTag , nextIndex + 1 ) ;
384- let closeTagIndex = message . indexOf ( '>' , nextIndex + 1 ) ;
404+ if ( fromArray === nextStartIndex ) {
385405 let styleValue ;
386- if ( tagMap [ nextKey ] . hasParameter ) {
406+ if ( tagMap [ nextKey ] . hasParameter ) {
387407 styleValue = message . substring ( nextIndex + tagMap [ nextKey ] . startTag . length , closeTagIndex ) ;
388- styleValue += tagMap [ nextKey ] . postfix ;
408+ styleValue += tagMap [ nextKey ] . postfix ;
389409 } else {
390410 styleValue = tagMap [ nextKey ] . styleValue ;
391411 }
392412 styleStack . push ( `${ tagMap [ nextKey ] . styleTag } ${ styleValue } ` ) ;
393- index = closeTagIndex + 1 ;
413+
414+ // Update list entry to next unprocessed start tag of type nextKey
415+ nextStartIndex [ nextKey ] = message . indexOf ( tagMap [ nextKey ] . startTag , nextIndex + 1 ) ;
394416 }
395417 // process end tag
396- else if ( fromArray === nextEndIndex ) {
397- nextEndIndex [ nextKey ] = message . indexOf ( tagMap [ nextKey ] . closeTag , nextIndex + 1 ) ;
398- let closeTagIndex = message . indexOf ( '>' , nextIndex + 1 ) ;
418+ else if ( fromArray === nextEndIndex ) {
399419 styleStack . pop ( ) ;
400- index = closeTagIndex + 1 ;
420+
421+ // Update list entry to next unprocessed end tag of type nextKey
422+ nextEndIndex [ nextKey ] = message . indexOf ( tagMap [ nextKey ] . closeTag , nextIndex + 1 ) ;
401423 }
424+
425+ // Update index to position after the tag closes
426+ index = closeTagIndex + 1 ;
402427 }
403428 return styledTextParts ;
404429}
0 commit comments