public static function getBacktraceCode(array $trace, $includeCode = true, $plaintext = false)
{
$backtraceCode = '';
if (count($trace)) {
foreach ($trace as $index => $step) {
if ($plaintext) {
$class = isset($step['class']) ? $step['class'] . '::' : '';
} else {
$class = isset($step['class']) ? $step['class'] . '<span style="color:white;">::</span>' : '';
}
$arguments = '';
if (isset($step['args']) && is_array($step['args'])) {
foreach ($step['args'] as $argument) {
if ($plaintext) {
$arguments .= strlen($arguments) === 0 ? '' : ', ';
} else {
$arguments .= strlen($arguments) === 0 ? '' : '<span style="color:white;">,</span> ';
}
if (is_object($argument)) {
if ($plaintext) {
$arguments .= get_class($argument);
} else {
$arguments .= '<span style="color:#FF8700;"><em>' . get_class($argument) . '</em></span>';
}
} elseif (is_string($argument)) {
$preparedArgument = strlen($argument) < 100 ? $argument : substr($argument, 0, 50) . '…' . substr($argument, -50);
$preparedArgument = htmlspecialchars($preparedArgument);
if ($plaintext) {
$arguments .= '"' . $argument . '"';
} else {
$preparedArgument = str_replace('…', '<span style="color:white;">…</span>', $preparedArgument);
$preparedArgument = str_replace("\n", '<span style="color:white;">⏎</span>', $preparedArgument);
$arguments .= '"<span style="color:#FF8700;" title="' . htmlspecialchars($argument) . '">' . $preparedArgument . '</span>"';
}
} elseif (is_numeric($argument)) {
if ($plaintext) {
$arguments .= (string) $argument;
} else {
$arguments .= '<span style="color:#FF8700;">' . (string) $argument . '</span>';
}
} elseif (is_bool($argument)) {
if ($plaintext) {
$arguments .= $argument === true ? 'TRUE' : 'FALSE';
} else {
$arguments .= '<span style="color:#FF8700;">' . ($argument === true ? 'TRUE' : 'FALSE') . '</span>';
}
} elseif (is_array($argument)) {
if ($plaintext) {
$arguments .= 'array|' . count($argument) . '|';
} else {
$arguments .= sprintf('<span style="color:#FF8700;" title="%s"><em>array|%d|</em></span>', htmlspecialchars(self::renderArrayDump($argument, 0, true)), count($argument));
}
} else {
if ($plaintext) {
$arguments .= gettype($argument);
} else {
$arguments .= '<span style="color:#FF8700;"><em>' . gettype($argument) . '</em></span>';
}
}
}
}
if ($plaintext) {
$backtraceCode .= count($trace) - $index . ' ' . $class . $step['function'] . '(' . $arguments . ')';
} else {
$backtraceCode .= '<pre style="color:#69A550; background-color: #414141; padding: 4px 2px 4px 2px;">';
$backtraceCode .= '<span style="color:white;">' . (count($trace) - $index) . '</span> ' . $class . $step['function'] . '<span style="color:white;">(' . $arguments . ')</span>';
$backtraceCode .= '</pre>';
}
if (isset($step['file']) && $includeCode) {
$backtraceCode .= self::getCodeSnippet($step['file'], $step['line'], $plaintext);
}
if ($plaintext) {
$backtraceCode .= PHP_EOL;
} else {
$backtraceCode .= '<br />';
}
}
}
return $backtraceCode;
}