Revision: 39540
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at January 18, 2011 06:02 by kendsnyder
Initial Code
<?php
$GLOBALS['ppr_mode'] = 'on';
function ppr_set_mode($mode) {
// mode = html | off | log
$GLOBALS['ppr_mode'] = $mode;
}
function ppr() {
if ($GLOBALS['ppr_mode'] == 'off') {
return;
}
$bt = debug_backtrace();
$file = str_replace($_SERVER['DOCUMENT_ROOT'].'/','',$bt[0]['file']);
$line = $bt[0]['line'];
$context = "ppr from $file($line)\n";
$args = _ppr_format_args(func_get_args());
$html = _ppr_get_html($args);
if ($GLOBALS['ppr_mode'] == 'log') {
$html = $context . $html;
error_log(_ppr_html_to_plain($html));
}
else {
echo _ppr_get_style();
echo '<pre class="ppr">';
echo $context;
echo $html;
echo '</pre>';
}
}
function ppr_table($rows) {
if ($GLOBALS['ppr_mode'] != 'html') {
return;
}
echo _ppr_get_style();
if (count($rows) == 0) {
echo '<pre class="ppr">[Empty Table]</pre>';
return;
}
echo '<pre class="ppr"><table class="ppr-rs" border="1"><tr>';
foreach ($rows[0] as $th => $v) {
echo "<th>$th</th>";
}
echo '</tr>';
foreach ($rows as $row) {
echo '<tr>';
foreach ($row as $value) {
echo '<td>' . _ppr_get_html($value, 1) . '</td>';
}
echo '</tr>';
}
echo '</table></pre>';
}
function _ppr_get_object_vars($obj, $dump = '') {
if (method_exists($obj, 'pprGetObjectVars')) {
return $obj->pprGetObjectVars($dump);
}
$props = get_object_vars($obj);
return $props;
}
function _ppr_format_args($args) {
if (count($args) == 1) {
$args = $args[0];
}
else {
$newArgs = array();
foreach ($args as $i => $a) {
$newArgs["@arg$i"] = $a;
}
$args = $newArgs;
}
return $args;
}
function _ppr_get_html($val, $_maxDepth=16, $_level=0, $_isInObject=false, &$_objIdCache=array()) {
$out = '';
if ($val === false || $val === true) {
$out .= _ppr_get_html_bool($val);
}
elseif ($val === null) {
$out .= _ppr_get_html_null();
}
elseif (is_resource($val)) {
$out .= _ppr_get_html_resource($val);
}
elseif (is_array($val)) {
$out .= _ppr_get_html_array($val, $_maxDepth, $_level, $_isInObject, $_objIdCache);
}
elseif (is_object($val)) {
$out .= _ppr_get_html_object($val, $_maxDepth, $_level, $_isInObject, $_objIdCache);
}
elseif (is_float($val)) {
$out .= _ppr_get_html_float($val);
}
elseif (is_int($val)) {
$out .= _ppr_get_html_int($val);
}
else {
$out .= _ppr_get_html_string($val);
}
if (!$_isInObject) {
$out .= "<br />";
}
return $out;
}
function _ppr_get_html_bool($val) {
return '<span class="ppr-bool">' . ($val ? 'true' : 'false') . '</span>';
}
function _ppr_get_html_null() {
return '<span class="ppr-null">null</span>';
}
function _ppr_get_html_resource($val) {
ob_start();
var_dump($val);
$dump = ob_get_clean();
preg_match('/^.+\((\d+)\) of type \(([\w_ ]+)\)$/',$dump,$match);
return '<span class="ppr-resource">Resource #' . $match[1] . ' <span class="ppr-resource-type">'.$match[2].'</span></span>';
}
function _ppr_get_html_array($val, $_maxDepth=16, $_level=0, $_isInObject=false, &$_objIdCache=array()) {
$indent = str_repeat(' ',$_level);
$indentNext = str_repeat(' ',$_level+1);
$out = '';
if ($_maxDepth == 0) {
$out .= '<span class="ppr-array">Array <span class="ppr-parens">(</span> <span class="ppr-max">Max Depth</span> <span class="ppr-parens">)</span></span>';
}
else {
if (!$_isInObject) {
$out .= '<span class="ppr-array">Array <span class="ppr-parens">(</span></span><br />';
}
foreach ($val as $k => $v) {
$out .= $indentNext . '<span class="ppr-bracket">[<span class="ppr-array-key">' . htmlentities((string) $k,ENT_QUOTES,'utf-8') . '</span>]</span>';
$out .= ' <span class="ppr-arrow">=></span> ' . _ppr_get_html($v, $_maxDepth-1, $_level+1, false, $_objIdCache);
}
if (!$_isInObject) {
$out .= $indent . '<span class="ppr-parens">)</span>';
}
}
return $out;
}
function _ppr_get_html_object($val, $_maxDepth=16, $_level=0, $_isInObject=false, &$_objIdCache=array()) {
$indent = str_repeat(' ',$_level);
$out = '';
ob_start();
var_dump($val);
$dump = ob_get_clean();
preg_match('/^\w+\(([\w_]+)\)#(\d+)/',$dump,$match);
unset($dump);
$class = $match[1];
$id = $match[2];
if ($_maxDepth <= 1 || isset($_objIdCache[$id])) {
$text = (isset($_objIdCache[$id]) ? 'Recursion' : 'Max Depth');
$out .= '<span class="ppr-object">Object #' . $id .' <span class="ppr-class">'.$class.'</span> <span class="ppr-brace">{</span> <span class="ppr-max">'.$text.'</span> <span class="ppr-brace">}</span></span>';
}
else {
$_objIdCache[$id] = 1;
$props = _ppr_get_object_vars($val, $dump);
$out .= '<span class="ppr-object">Object #' . $id .' <span class="ppr-class">'.$class.'</span> <span class="ppr-brace">{</span></span>';
if (count($props)) {
$out .= "<br />";
$out .= _ppr_get_html($props,$_maxDepth-1,$_level,true,$_objIdCache);
$out .= $indent;
}
$out .= '<span class="ppr-brace">}</span>';
}
return $out;
}
function _ppr_get_html_float($val) {
return '<span class="ppr-float">' . $val . '</span>';
}
function _ppr_get_html_int($val) {
return '<span class="ppr-int">' . $val . '</span>';
}
function _ppr_get_html_string($val) {
return '<span class="ppr-string"><span class="ppr-lquot">“</span>' . htmlentities((string) $val,ENT_QUOTES) . '<span class="ppr-rquot">”</span></span>';
}
function _ppr_get_style() {
static $style_printed;
if ($style_printed) {
return '';
}
$style_printed = true;
return '
<style type="text/css" media="screen">
pre.ppr {
font-family: "Bitstream Vera Sans Mono", Consolas, "Courier New", monospace;
font-size: 12px;
line-height: 130%;
word-wrap: break-word; /* IE 5.5 - 7 */
white-space: pre-wrap; /* IE8, EOMB */
background-color: rgb(255,255,255);
background-color: rgba(255,255,255,0.92);
border: 1px solid #888;
padding: 5px;
text-align: left;
clear: both;
}
.ppr-array,
.ppr-object,
.ppr-resource {
font-style: italic;
}
.ppr-brace,
.ppr-parens {
font-style: normal;
}
.ppr-string {
color: #008800;
font-weight: normal;
}
.ppr-lquot {
color: #777;
font-family: "Times New Roman", Times, serif;
font-weight: bold;
font-size: 10px;
margin-right: 2px;
}
.ppr-rquot {
color: #777;
font-family: "Times New Roman", Times, serif;
font-weight: bold;
font-size: 10px;
margin-left: 2px;
}
.ppr-arrow {
color: #777;
font-weight: bold;
}
.ppr-array-key {
color: #303030;
font-weight: normal;
}
.ppr-class,
.ppr-resource-type {
color: #0055ee;
font-weight: bold;
font-style: normal;
}
.ppr-null {
color: #0000ee;
font-style: italic;
}
.ppr-bool {
color: #dd7700;
font-style: italic;
}
.ppr-bracket {
color: #888;
}
.ppr-float {
color: #2200ee;
font-weight: bold;
}
.ppr-int {
color: #cc0000;
font-weight: bold;
}
.ppr-max {
text-transform: uppercase;
font-style: italic;
color: #bb6666;
font-weight: bold;
}
</style>';
}
function _ppr_html_to_plain($html) {
$html = str_replace('“','"', $html);
$html = str_replace('”','"', $html);
$html = str_replace(' '," ", $html);
$html = str_replace('<br />',"\n", $html);
$str = strip_tags($html);
$str = html_entity_decode($str);
$str = trim($str);
return $str;
}
Initial URL
Initial Description
Initial Title
Pretty print_r()
Initial Tags
debug
Initial Language
PHP