@@ -30,6 +30,29 @@ function loader (registryOrVersion) {
30
30
'§k' : '\u001b[6m' ,
31
31
'§r' : '\u001b[0m'
32
32
}
33
+ const cssDefaultStyles = {
34
+ black : 'color:#000000' ,
35
+ dark_blue : 'color:#0000AA' ,
36
+ dark_green : 'color:#00AA00' ,
37
+ dark_aqua : 'color:#00AAAA' ,
38
+ dark_red : 'color:#AA0000' ,
39
+ dark_purple : 'color:#AA00AA' ,
40
+ gold : 'color:#FFAA00' ,
41
+ gray : 'color:#AAAAAA' ,
42
+ dark_gray : 'color:#555555' ,
43
+ blue : 'color:#5555FF' ,
44
+ green : 'color:#55FF55' ,
45
+ aqua : 'color:#55FFFF' ,
46
+ red : 'color:#FF5555' ,
47
+ light_purple : 'color:#FF55FF' ,
48
+ yellow : 'color:#FFFF55' ,
49
+ white : 'color:#FFFFFF' ,
50
+ bold : 'font-weight:900' ,
51
+ strikethrough : 'text-decoration:line-through' ,
52
+ underlined : 'text-decoration:underline' ,
53
+ italic : 'font-style:italic'
54
+ }
55
+ const formatMembers = [ 'color' , 'bold' , 'strikethrough' , 'underlined' , 'italic' ]
33
56
const { MessageBuilder } = require ( './MessageBuilder' ) ( registry )
34
57
35
58
/**
@@ -369,6 +392,39 @@ function loader (registryOrVersion) {
369
392
return codes [ '§r' ] + message + codes [ '§r' ]
370
393
}
371
394
395
+ // NOTE : Have to be be mindful here as bad HTML gen may lead to arbitrary code execution from server
396
+ toHTML ( lang = registry . language , styles = cssDefaultStyles , allowedFormats = formatMembers ) {
397
+ let str = ''
398
+ if ( allowedFormats . some ( member => this [ member ] ) ) {
399
+ const cssProps = allowedFormats . reduce ( ( acc , cur ) => this [ cur ]
400
+ ? acc . push ( cur === 'color'
401
+ ? ( this . color . startsWith ( '#' ) ? escapeRGB ( this . color . slice ( 1 ) ) : styles [ this . color ] )
402
+ : styles [ cur ] ) &&
403
+ acc
404
+ : acc , [ ] )
405
+ str += `<span style="${ cssProps . join ( ';' ) } ">`
406
+ } else {
407
+ str += '<span>'
408
+ }
409
+
410
+ if ( this . text ) {
411
+ str += escapeHtml ( this . text )
412
+ } else if ( this . translate ) {
413
+ const params = [ ]
414
+ for ( const param of this . with ) {
415
+ params . push ( param . toHTML ( lang , styles , allowedFormats ) )
416
+ }
417
+ const format = lang [ this . translate ] ?? this . translate
418
+ str += vsprintf ( escapeHtml ( format ) , params )
419
+ }
420
+
421
+ if ( this . extra ) {
422
+ str += this . extra . map ( entry => entry . toHTML ( lang , styles , allowedFormats ) ) . join ( '' )
423
+ }
424
+ str += '</span>'
425
+ return str
426
+ }
427
+
372
428
static fromNotch ( msg ) {
373
429
let toRet
374
430
try {
@@ -392,3 +448,6 @@ function loader (registryOrVersion) {
392
448
ChatMessage . MessageBuilder = MessageBuilder
393
449
return ChatMessage
394
450
}
451
+
452
+ const escapeHtml = ( unsafe ) => unsafe . replaceAll ( '&' , '&' ) . replaceAll ( '<' , '<' ) . replaceAll ( '>' , '>' ) . replaceAll ( '"' , '"' ) . replaceAll ( "'" , ''' )
453
+ const escapeRGB = ( unsafe ) => `color:rgb(${ unsafe . match ( / .{ 2 } / g) . map ( e => parseInt ( e , 16 ) ) . join ( ',' ) } )`
0 commit comments