2024-11-19 20:05:19 -05:00
import settings from '../settings.js'
2024-10-23 23:07:37 -04:00
import lang from './mc_lang.js'
2024-11-19 20:05:19 -05:00
const _consoleColors = {
blackTerminal _24bit : {
fourBit : {
dark _red : '\u001B[0;38;2;170;0;0m' ,
red : '\u001B[0;38;2;255;85;85m' ,
dark _green : '\u001B[0;38;2;0;170;0m' ,
green : '\u001B[0;38;2;85;255;85m' ,
gold : '\u001B[0;38;2;255;170;0m' ,
yellow : '\u001B[0;38;2;255;255;85m' ,
dark _blue : '\u001B[0;38;2;0;0;170m' ,
blue : '\u001B[0;38;2;85;85;255m' ,
dark _purple : '\u001B[0;38;2;170;0;170m' ,
light _purple : '\u001B[0;38;2;255;85;255m' ,
dark _aqua : '\u001B[0;38;2;0;170;170m' ,
aqua : '\u001B[0;38;2;85;255;255m' ,
black : '\u001B[0;48;2;220;220;220;38;2;0;0;0m' ,
gray : '\u001B[0;38;2;170;170;170m' ,
dark _gray : '\u001B[0;38;2;85;85;85m' ,
white : '\u001B[0;38;2;255;255;255m' ,
reset : '\u001B[0;38;2;255;255;255m'
} ,
twentyFourBit : {
enabled : true ,
bit : 24 ,
lightMode : false
}
} ,
whiteTerminal _24bit : {
fourBit : {
dark _red : '\u001B[0;38;2;170;0;0m' ,
red : '\u001B[0;38;2;255;85;85m' ,
dark _green : '\u001B[0;38;2;0;170;0m' ,
green : '\u001B[0;48;2;20;20;20;38;2;85;255;85m' ,
gold : '\u001B[0;38;2;255;170;0m' ,
yellow : '\u001B[0;48;2;20;20;20;38;2;255;255;85m' ,
dark _blue : '\u001B[0;38;2;0;0;170m' ,
blue : '\u001B[0;38;2;85;85;255m' ,
dark _purple : '\u001B[0;38;2;170;0;170m' ,
light _purple : '\u001B[0;38;2;255;85;255m' ,
dark _aqua : '\u001B[0;38;2;0;170;170m' ,
aqua : '\u001B[0;48;2;20;20;20;38;2;85;255;255m' ,
black : '\u001B[0;38;2;0;0;0m' ,
gray : '\u001B[0;38;2;170;170;170m' ,
dark _gray : '\u001B[0;38;2;85;85;85m' ,
white : '\u001B[0;48;2;20;20;20;38;2;255;255;255m' ,
reset : '\u001B[0;48;2;20;20;20;38;2;255;255;255m'
} ,
twentyFourBit : {
enabled : true ,
bit : 24 ,
lightMode : true
}
} ,
blackTerminal _8bit : {
fourBit : {
dark _red : '\u001B[0;38;5;124m' ,
red : '\u001B[0;38;5;203m' ,
dark _green : '\u001B[0;38;5;34m' ,
green : '\u001B[0;38;5;83m' ,
gold : '\u001B[0;38;5;214m' ,
yellow : '\u001B[0;38;5;227m' ,
dark _blue : '\u001B[0;38;5;19m' ,
blue : '\u001B[0;38;5;63m' ,
dark _purple : '\u001B[0;38;5;127m' ,
light _purple : '\u001B[0;38;5;207m' ,
dark _aqua : '\u001B[0;38;5;37m' ,
aqua : '\u001B[0;38;5;87m' ,
black : '\u001B[0;48;5;253;38;5;16m' ,
gray : '\u001B[0;38;5;145m' ,
dark _gray : '\u001B[0;38;5;59m' ,
white : '\u001B[0;38;5;231m' ,
reset : '\u001B[0;38;5;231m'
} ,
twentyFourBit : {
enabled : true ,
bit : 8 ,
lightMode : false
}
} ,
whiteTerminal _8bit : {
fourBit : {
dark _red : '\u001B[0;38;5;124m' ,
red : '\u001B[0;38;5;203m' ,
dark _green : '\u001B[0;38;5;34m' ,
green : '\u001B[0;48;5;16;38;5;83m' ,
gold : '\u001B[0;38;5;214m' ,
yellow : '\u001B[0;48;5;16;38;5;227m' ,
dark _blue : '\u001B[0;38;5;19m' ,
blue : '\u001B[0;38;5;63m' ,
dark _purple : '\u001B[0;38;5;127m' ,
light _purple : '\u001B[0;38;5;207m' ,
dark _aqua : '\u001B[0;38;5;37m' ,
aqua : '\u001B[0;48;5;16;38;5;87m' ,
black : '\u001B[0;38;5;16m' ,
gray : '\u001B[0;38;5;145m' ,
dark _gray : '\u001B[0;38;5;59m' ,
white : '\u001B[0;48;5;16;38;5;231m' ,
reset : '\u001B[0;48;5;16;38;5;231m'
} ,
twentyFourBit : {
enabled : true ,
bit : 8 ,
lightMode : true
}
} ,
blackTerminal _4bit : {
fourBit : {
dark _red : '\u001B[0;31m' ,
red : '\u001B[0;1;31m' ,
dark _green : '\u001B[0;32m' ,
green : '\u001B[0;1;32m' ,
gold : '\u001B[0;33m' ,
yellow : '\u001B[0;1;33m' ,
dark _blue : '\u001B[0;34m' ,
blue : '\u001B[0;1;34m' ,
dark _purple : '\u001B[0;35m' ,
light _purple : '\u001B[0;1;35m' ,
dark _aqua : '\u001B[0;36m' ,
aqua : '\u001B[0;1;36m' ,
black : '\u001B[0;1;47;30m' ,
gray : '\u001B[0;37m' ,
dark _gray : '\u001B[0;1;30m' ,
white : '\u001B[0;1;37m' ,
reset : '\u001B[0;1;37m'
} ,
twentyFourBit : {
enabled : true ,
bit : 4 ,
lightMode : false
}
} ,
whiteTerminal _4bit : {
fourBit : {
dark _red : '\u001B[0;31m' ,
red : '\u001B[0;1;31m' ,
dark _green : '\u001B[0;32m' ,
green : '\u001B[0;40;1;32m' ,
gold : '\u001B[0;33m' ,
yellow : '\u001B[0;40;1;33m' ,
dark _blue : '\u001B[0;34m' ,
blue : '\u001B[0;1;34m' ,
dark _purple : '\u001B[0;35m' ,
light _purple : '\u001B[0;1;35m' ,
dark _aqua : '\u001B[0;36m' ,
aqua : '\u001B[0;40;1;36m' ,
black : '\u001B[0;30m' ,
gray : '\u001B[0;37m' ,
dark _gray : '\u001B[0;1;30m' ,
white : '\u001B[0;40;1;37m' ,
reset : '\u001B[0;40;1;37m'
} ,
twentyFourBit : {
enabled : true ,
bit : 4 ,
lightMode : true
}
} ,
none : {
fourBit : {
dark _red : '' ,
red : '' ,
dark _green : '' ,
green : '' ,
gold : '' ,
yellow : '' ,
dark _blue : '' ,
blue : '' ,
dark _purple : '' ,
light _purple : '' ,
dark _aqua : '' ,
aqua : '' ,
black : '' ,
gray : '' ,
dark _gray : '' ,
white : '' ,
reset : ''
} ,
twentyFourBit : {
enabled : false
}
}
}
2024-10-22 23:11:33 -04:00
let consoleColors
let consoleColors24
if ( _consoleColors [ settings . terminalMode ] ) {
consoleColors = _consoleColors [ settings . terminalMode ] . fourBit
consoleColors24 = _consoleColors [ settings . terminalMode ] . twentyFourBit
} else {
consoleColors = _consoleColors . none . fourBit
consoleColors24 = _consoleColors . none . twentyFourBit
}
const process8bitColorChannel = ( value ) => {
if ( value < 65 ) return 0
if ( value < 115 ) return 1
if ( value < 155 ) return 2
if ( value < 195 ) return 3
if ( value < 235 ) return 4
return 5
}
const hexColorParser = ( color ) => {
if ( ! consoleColors24 . enabled || consoleColors24 . bit === 4 ) { // Hex color parsing to the 4 bit mode has not been implemented yet
return ''
}
if ( consoleColors24 . bit === 24 ) {
let out = '\x1B[0;'
const redChannel = Number ( ` 0x ${ color . slice ( 1 , 3 ) } ` )
const greenChannel = Number ( ` 0x ${ color . slice ( 3 , 5 ) } ` )
const blueChannel = Number ( ` 0x ${ color . slice ( 5 , 7 ) } ` )
if ( ! consoleColors24 . lightMode && redChannel < 64 && greenChannel < 64 && blueChannel < 64 ) {
out += '48;2;220;220;220;'
} else if ( consoleColors24 . lightMode && ( ( redChannel > 192 && greenChannel > 192 && blueChannel > 192 ) || greenChannel > 160 ) ) {
out += '48;2;0;0;0;'
}
return out + ` 38;2; ${ redChannel } ; ${ greenChannel } ; ${ blueChannel } m `
} else if ( consoleColors24 . bit === 8 ) {
let out = '\x1B[0;'
const redChannel = Number ( ` 0x ${ color . slice ( 1 , 3 ) } ` )
const greenChannel = Number ( ` 0x ${ color . slice ( 3 , 5 ) } ` )
const blueChannel = Number ( ` 0x ${ color . slice ( 5 , 7 ) } ` )
if ( ! consoleColors24 . lightMode && redChannel < 65 && greenChannel < 65 && blueChannel < 65 ) {
out += '48;5;253;'
} else if ( consoleColors24 . lightMode && ( ( redChannel > 194 && greenChannel > 194 && blueChannel > 194 ) || greenChannel > 154 ) ) {
out += '48;5;16;'
}
const redOut = process8bitColorChannel ( redChannel )
const greenOut = process8bitColorChannel ( greenChannel )
const blueOut = process8bitColorChannel ( blueChannel )
const colorValue = 16 + 36 * redOut + 6 * greenOut + blueOut
return out + ` 38;5; ${ colorValue } m `
}
}
const processColor = ( col , rcol ) => {
let out
if ( col === 'reset' ) {
out = rcol
} else if ( col . startsWith ( '#' ) ) {
out = hexColorParser ( col )
} else {
out = consoleColors [ col ]
}
return out
}
const parse = function ( _data , l = 0 , resetColor = consoleColors . reset ) {
if ( l >= 4 ) {
return ''
}
let data
if ( typeof _data === 'string' ) {
data = { text : _data , color : 'reset' }
} else if ( typeof _data === 'number' ) {
data = { text : _data + '' , color : 'reset' }
} else if ( _data . constructor === Array ) {
data = { extra : _data , color : 'reset' }
} else {
data = _data
}
if ( data [ '' ] ) {
data . text = data [ '' ]
if ( ! data . color ) data . color = 'reset'
}
let out = ''
if ( data . color ) {
out += processColor ( data . color , resetColor )
} else {
out += resetColor
}
if ( data . text ) {
let _text = data . text
if ( typeof _text === 'number' ) {
_text = _text . toString ( )
}
out += _text . replaceAll ( '\x1b' , '' ) . replaceAll ( '\x0e' , '' )
}
if ( data . translate ) {
let trans = data . translate . replaceAll ( '%%' , '\ud900\ud801' ) . replaceAll ( '\x1b' , '' ) . replaceAll ( '\x0e' , '' )
if ( lang [ trans ] !== undefined ) {
trans = lang [ trans ] . replace ( /%%/g , '\ue123' )
}
if ( data . with ) {
data . with . forEach ( ( item , i ) => {
const j2 = parse ( item , l + 1 , data . color ? processColor ( data . color , resetColor ) : resetColor )
trans = trans . replace ( /%s/ , j2 . replaceAll ( '%s' , '\ud900\ud804' ) . replaceAll ( '$s' , '\ud900\ud805' ) )
trans = trans . replaceAll ( ` % ${ + i + 1 } $ s ` , j2 . replaceAll ( '%s' , '\ud900\ud804' ) . replaceAll ( '$s' , '\ud900\ud805' ) )
} )
}
out += trans . replaceAll ( '\ud900\ud801' , '%' ) . replaceAll ( '\ud900\ud804' , '%s' ) . replaceAll ( '\ud900\ud805' , '$s' )
}
if ( data . extra ) {
for ( const item of data . extra ) {
const parsed = parse ( item , l , data . color ? processColor ( data . color , resetColor ) : resetColor )
out += parsed
}
}
out += resetColor
return out
}
2024-10-23 22:59:54 -04:00
export default function parse2 ( _data , l , resetColor ) {
2024-10-22 23:11:33 -04:00
try {
return parse ( _data )
} catch ( e ) {
console . error ( e )
return ` \x 1B[0m \x 1B[38;2;255;85;85mAn error occured while parsing a message. See console for more information. \n JSON that caused the error: ${ JSON . stringify ( _data ) } `
}
}