/// /// This file is part of CRIMSON. /// /// CRIMSON is free software; you can redistribute it and/or modify it /// under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 3 of the License, or (at /// your option) any later version. /// /// CRIMSON is distributed in the hope that it will be useful, but /// WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with CRIMSON. If not, see . /** * CRIMSON ERROR FUNCTIONS * * Insead of using trigger_error, crimson has its own CRIMSON_ error * functions. It is prefered to use this they hook more nicely into crimson. * trigger_error is still okay to use since crimson creates its own error * handler, and will catch it anyways. * * WARNING: DO NOT create your own error handler since this MAY interfere with * crimson's control flow. */ // crimson's fatal error handler will set $errno to CRIMSON_E_FATAL_ERROR. define('CRIMSON_E_FATAL_ERROR', 0); function __CRIMSON_error_pretty_print_name(int $errno) { switch ($errno) { case CRIMSON_E_FATAL_ERROR: // 0 // return 'Fatal Error'; case E_ERROR: // 1 // case E_CORE_ERROR: // 16 // case E_USER_ERROR: // 256 // case E_RECOVERABLE_ERROR: // 4096 // return 'Error'; case E_WARNING: // 2 // case E_CORE_WARNING: // 32 // case E_USER_WARNING: // 512 // return 'Warning'; case E_PARSE: // 4 // return 'Parse Error'; case E_NOTICE: // 8 // case E_USER_NOTICE: // 1024 // return 'Notice'; case E_COMPILE_ERROR: // 128 // return 'Compile Error'; case E_DEPRECATED: // 8192 // case E_USER_DEPRECATED: // 16384 // return 'Deprecated'; default: return 'Unknown Error'; } } function __CRIMSON_error_pretty_print_bg_color(int $errno) { switch ($errno) { case CRIMSON_E_FATAL_ERROR: // 0 // case E_ERROR: // 1 // case E_PARSE: // 4 // case E_CORE_ERROR: // 16 // case E_COMPILE_ERROR: // 128 // case E_USER_ERROR: // 256 // case E_RECOVERABLE_ERROR: // 4096 // return '#dc143c'; case E_WARNING: // 2 // case E_CORE_WARNING: // 32 // case E_USER_WARNING: // 512 // case E_DEPRECATED: // 8192 // case E_USER_DEPRECATED: // 16384 // return '#db6d13'; case E_NOTICE: // 8 // case E_USER_NOTICE: // 1024 // default: return '#13a6db'; } } function __CRIMSON_error_pretty_print_text_color(int $errno) { switch ($errno) { case CRIMSON_E_FATAL_ERROR: // 0 // case E_ERROR: // 1 // case E_PARSE: // 4 // case E_CORE_ERROR: // 16 // case E_COMPILE_ERROR: // 128 // case E_USER_ERROR: // 256 // case E_RECOVERABLE_ERROR: // 4096 // return '#fff'; case E_WARNING: // 2 // case E_CORE_WARNING: // 32 // case E_USER_WARNING: // 512 // case E_DEPRECATED: // 8192 // case E_USER_DEPRECATED: // 16384 // return '#fff'; case E_NOTICE: // 8 // case E_USER_NOTICE: // 1024 // default: return '#181818'; } } /** * __CRIMSON_error_pretty_print * * Prints a pretty HTML error message using the same set of parameters * from PHP's error handler. * * Unless CRIMSON detects that you are using a tty, crimson will opt to * pretty print all errors. */ function __CRIMSON_error_pretty_print( int $errno, string $errstr, ?string $errfile = NULL, ?int $errline = NULL, ?array $errcontext = NULL, ): void { $name = __CRIMSON_error_pretty_print_name($errno); $bg = __CRIMSON_error_pretty_print_bg_color($errno); $text = __CRIMSON_error_pretty_print_text_color($errno); $root_style = " all: unset !important; display: block !important; margin: .1em !important; background: {$bg} !important; color: {$text} !important; font-family: Helvetica, Verdana, Courier, monospace !important; font-size: 14px !important;"; $div_style = " padding: .5em; !important;"; $span_style = " display: block !important"; $title_style=" font-size: 1.2em !important; font-weight: bold !important; background: rgba(255,255,255,.2); !important"; $html = <<
(!) {$name}
In file {$errfile}:{$errline} >>> {$errstr}
EOF; echo $html; } function __CRIMSON_error_print( int $errno, string $errstr, ?string $errfile = NULL, ?int $errline = NULL, ?array $errcontext = NULL, ): void { $name = __CRIMSON_error_pretty_print_name($errno); echo "{$name}: {$errstr}\n\tIn file {$errfile}:{$errline}\n"; } function CRIMSON_error_handler( int $errno, string $errstr, ?string $errfile = NULL, ?int $errline = NULL, ?array $errcontext = NULL, ): void { __CRIMSON_error_pretty_print($errno, $errstr, $errfile, $errline, $errcontext); } set_error_handler("CRIMSON_error_handler"); function CRIMSON_ERROR(string $msg): void { $frame = debug_backtrace()[1]; CRIMSON_error_handler(E_ERROR, $msg, $frame['file'], $frame['line']); } function CRIMSON_FATAL_ERROR(string $msg): void { $frame = debug_backtrace()[1]; CRIMSON_error_handler(CRIMSON_E_FATAL_ERROR, $msg, $frame['file'], $frame['line']); } function CRIMSON_WARNING(string $msg): void { $frame = debug_backtrace()[1]; CRIMSON_error_handler(E_WARNING, $msg, $frame['file'], $frame['line']); }