/Nette/Diagnostics/Helpers.php
PHP | 206 lines | 155 code | 22 blank | 29 comment | 19 complexity | 5e67bb7a7f5498a5fa18e6eda1f75816 MD5 | raw file
- <?php
- /**
- * This file is part of the Nette Framework (http://nette.org)
- *
- * Copyright (c) 2004, 2011 David Grudl (http://davidgrudl.com)
- *
- * For the full copyright and license information, please view
- * the file license.txt that was distributed with this source code.
- */
- namespace Nette\Diagnostics;
- use Nette;
- /**
- * Rendering helpers for Debugger.
- *
- * @author David Grudl
- * @internal
- */
- final class Helpers
- {
- /**
- * Returns link to editor.
- * @return Nette\Utils\Html
- */
- public static function editorLink($file, $line)
- {
- if (Debugger::$editor && is_file($file)) {
- $dir = dirname(strtr($file, '/', DIRECTORY_SEPARATOR));
- $base = isset($_SERVER['SCRIPT_FILENAME']) ? dirname(dirname(strtr($_SERVER['SCRIPT_FILENAME'], '/', DIRECTORY_SEPARATOR))) : dirname($dir);
- if (substr($dir, 0, strlen($base)) === $base) {
- $dir = '...' . substr($dir, strlen($base));
- }
- return Nette\Utils\Html::el('a')
- ->href(strtr(Debugger::$editor, array('%file' => rawurlencode($file), '%line' => $line)))
- ->title("$file:$line")
- ->setHtml(htmlSpecialChars(rtrim($dir, DIRECTORY_SEPARATOR)) . DIRECTORY_SEPARATOR . '<b>' . htmlSpecialChars(basename($file)) . '</b>');
- } else {
- return Nette\Utils\Html::el('span')->setText($file);
- }
- }
- /**
- * Internal dump() implementation.
- * @param mixed variable to dump
- * @param int current recursion level
- * @return string
- */
- public static function htmlDump(&$var, $level = 0)
- {
- static $tableUtf, $tableBin, $reBinary = '#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{10FFFF}]#u';
- if ($tableUtf === NULL) {
- foreach (range("\x00", "\xFF") as $ch) {
- if (ord($ch) < 32 && strpos("\r\n\t", $ch) === FALSE) {
- $tableUtf[$ch] = $tableBin[$ch] = '\\x' . str_pad(dechex(ord($ch)), 2, '0', STR_PAD_LEFT);
- } elseif (ord($ch) < 127) {
- $tableUtf[$ch] = $tableBin[$ch] = $ch;
- } else {
- $tableUtf[$ch] = $ch; $tableBin[$ch] = '\\x' . dechex(ord($ch));
- }
- }
- $tableBin["\\"] = '\\\\';
- $tableBin["\r"] = '\\r';
- $tableBin["\n"] = '\\n';
- $tableBin["\t"] = '\\t';
- $tableUtf['\\x'] = $tableBin['\\x'] = '\\\\x';
- }
- if (is_bool($var)) {
- return '<span class="php-bool">' . ($var ? 'TRUE' : 'FALSE') . "</span>\n";
- } elseif ($var === NULL) {
- return "<span class=\"php-null\">NULL</span>\n";
- } elseif (is_int($var)) {
- return "<span class=\"php-int\">$var</span>\n";
- } elseif (is_float($var)) {
- $var = var_export($var, TRUE);
- if (strpos($var, '.') === FALSE) {
- $var .= '.0';
- }
- return "<span class=\"php-float\">$var</span>\n";
- } elseif (is_string($var)) {
- if (Debugger::$maxLen && strlen($var) > Debugger::$maxLen) {
- $s = htmlSpecialChars(substr($var, 0, Debugger::$maxLen), ENT_NOQUOTES) . ' ... ';
- } else {
- $s = htmlSpecialChars($var, ENT_NOQUOTES);
- }
- $s = strtr($s, preg_match($reBinary, $s) || preg_last_error() ? $tableBin : $tableUtf);
- $len = strlen($var);
- return "<span class=\"php-string\">\"$s\"</span>" . ($len > 1 ? " ($len)" : "") . "\n";
- } elseif (is_array($var)) {
- $s = '<span class="php-array">array</span>(' . count($var) . ") ";
- $space = str_repeat($space1 = ' ', $level);
- $brackets = range(0, count($var) - 1) === array_keys($var) ? "[]" : "{}";
- static $marker;
- if ($marker === NULL) {
- $marker = uniqid("\x00", TRUE);
- }
- if (empty($var)) {
- } elseif (isset($var[$marker])) {
- $brackets = $var[$marker];
- $s .= "$brackets[0] *RECURSION* $brackets[1]";
- } elseif ($level < Debugger::$maxDepth || !Debugger::$maxDepth) {
- $s .= "<code>$brackets[0]\n";
- $var[$marker] = $brackets;
- foreach ($var as $k => &$v) {
- if ($k === $marker) {
- continue;
- }
- $k = strtr($k, preg_match($reBinary, $k) || preg_last_error() ? $tableBin : $tableUtf);
- $k = htmlSpecialChars(preg_match('#^\w+$#', $k) ? $k : "\"$k\"");
- $s .= "$space$space1<span class=\"php-key\">$k</span> => " . self::htmlDump($v, $level + 1);
- }
- unset($var[$marker]);
- $s .= "$space$brackets[1]</code>";
- } else {
- $s .= "$brackets[0] ... $brackets[1]";
- }
- return $s . "\n";
- } elseif (is_object($var)) {
- if ($var instanceof \Closure) {
- $rc = new \ReflectionFunction($var);
- $arr = array();
- foreach ($rc->getParameters() as $param) {
- $arr[] = '$' . $param->getName();
- }
- $arr = array('file' => $rc->getFileName(), 'line' => $rc->getStartLine(), 'parameters' => implode(', ', $arr));
- } else {
- $arr = (array) $var;
- }
- $s = '<span class="php-object">' . get_class($var) . "</span>(" . count($arr) . ") ";
- $space = str_repeat($space1 = ' ', $level);
- static $list = array();
- if (empty($arr)) {
- } elseif (in_array($var, $list, TRUE)) {
- $s .= "{ *RECURSION* }";
- } elseif ($level < Debugger::$maxDepth || !Debugger::$maxDepth || $var instanceof \Closure) {
- $s .= "<code>{\n";
- $list[] = $var;
- foreach ($arr as $k => &$v) {
- $m = '';
- if ($k[0] === "\x00") {
- $m = ' <span class="php-visibility">' . ($k[1] === '*' ? 'protected' : 'private') . '</span>';
- $k = substr($k, strrpos($k, "\x00") + 1);
- }
- $k = strtr($k, preg_match($reBinary, $k) || preg_last_error() ? $tableBin : $tableUtf);
- $k = htmlSpecialChars(preg_match('#^\w+$#', $k) ? $k : "\"$k\"");
- $s .= "$space$space1<span class=\"php-key\">$k</span>$m => " . self::htmlDump($v, $level + 1);
- }
- array_pop($list);
- $s .= "$space}</code>";
- } else {
- $s .= "{ ... }";
- }
- return $s . "\n";
- } elseif (is_resource($var)) {
- return '<span class="php-resource">' . htmlSpecialChars(get_resource_type($var)) . " resource</span>\n";
- } else {
- return "<span>unknown type</span>\n";
- }
- }
- /**
- * Dumps variable.
- * @param string
- * @return string
- */
- public static function clickableDump($dump)
- {
- return '<pre class="nette-dump">' . preg_replace_callback(
- '#^( *)((?>[^(]{1,200}))\((\d+)\) <code>#m',
- function ($m) {
- return "$m[1]<a href='#' rel='next'>$m[2]($m[3]) "
- . (trim($m[1]) || $m[3] < 7
- ? '<abbr>▼</abbr> </a><code>'
- : '<abbr>►</abbr> </a><code class="nette-collapsed">');
- },
- self::htmlDump($dump)
- ) . '</pre>';
- }
- }