PageRenderTime 27ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins/UsefulFunctions/vendors/class.dumphper.php

https://github.com/DMeganoski/Gallery-Designer
PHP | 304 lines | 267 code | 23 blank | 14 comment | 23 complexity | fb28f94fa075ef6c6ff424c8388f254b MD5 | raw file
  1. <?php
  2. /**
  3. * Impored var_dump for PHP 5.2.3++
  4. * @author Dmitry "widowmaker" Khavilo
  5. * @email wm .dot. morgun .at. gmail .dot. com
  6. **/
  7. class Dumphper
  8. {
  9. /** config **/
  10. static $encoding = 'UTF-8'; /** Text encoding, needed to escape stings **/
  11. static $escape_keys = false; /** Should array keys be escaped (slow) **/
  12. static $max_showw_depth = 8; /** Defines how many nested levels will be expanded by default **/
  13. /** don't touch **/
  14. static $objects = array();
  15. static $calls = 0;
  16. static $depth = 0;
  17. static function dump(&$source)
  18. {
  19. self::$depth = 0;
  20. self::drawStyles();
  21. //$s = microtime(true);
  22. //self::$objects = array();
  23. self::$calls++;
  24. echo '<div class="dumphper">';
  25. self::_dump($source);
  26. echo '</div>';
  27. //echo round(microtime(true) - $s,6)*1000 . 's';
  28. }
  29. static function _dump(&$source, &$parents = array())
  30. {
  31. self::$depth++;
  32. switch(gettype($source))
  33. {
  34. case 'array':
  35. self::drawArray($source, $parents);
  36. break;
  37. case 'object':
  38. self::drawObject($source, $parents);
  39. break;
  40. case 'NULL':
  41. self::drawNULL();
  42. break;
  43. case 'boolean':
  44. self::drawBoolean($source);
  45. break;
  46. case 'resource':
  47. self::drawResource($source);
  48. break;
  49. default:
  50. self::drawScalar($source);
  51. break;
  52. }
  53. self::$depth--;
  54. }
  55. static function escape(&$source)
  56. {
  57. return ( is_string($source) ? ( $source ? htmlentities($source, ENT_QUOTES, self::$encoding) : '&nbsp;') : $source );
  58. }
  59. static function drawScalar(&$source, &$escape = true)
  60. {
  61. self::drawValue($escape ? self::escape($source) : $source, gettype($source));
  62. }
  63. static function drawNULL()
  64. {
  65. self::drawValue('NULL', 'null');
  66. }
  67. static function drawResource(&$source)
  68. {
  69. self::drawValue(get_resource_type($source) . ' ' . strtolower((string)$source) , 'resource');
  70. }
  71. static function drawBoolean(&$source)
  72. {
  73. self::drawValue($source ? 'true' : 'false', 'boolean');
  74. }
  75. static function drawArray(&$source, &$parents)
  76. {
  77. if (self::isRecursiveArray($source, $parents))
  78. {
  79. self::drawValue('RECURSION', 'recursion');
  80. }
  81. else
  82. {
  83. $c = count($source);
  84. echo '<div class="dumphper-container' . (self::$depth <= self::$max_showw_depth ? '' : ' dumphper-closed') . '">';
  85. self::drawHeader( $c > 0 ? '<a class="dumphper-toggler" href="javascript:;" onclick="dumphper_toggle(this);">Array (' . $c . ')</a>' : 'empty Array ', 'array');
  86. if ( $c > 0 )
  87. {
  88. echo '<table class="dumphper-table" cellspacing="0" cellpadding="0">';
  89. foreach ($source as $key => &$value)
  90. {
  91. echo '<tr><td class="dumphper-key-array">';
  92. self::drawScalar($key, self::$escape_keys);
  93. echo '</td><td>';
  94. self::_dump($value, $parents);
  95. echo '</td></tr>';
  96. }
  97. echo '</table>';
  98. }
  99. echo '</div>';
  100. }
  101. }
  102. static function getObjectId(&$source)
  103. {
  104. $class = get_class($source);
  105. if ( !isset(self::$objects[$class]) )
  106. self::$objects[$class] = array();
  107. foreach (self::$objects[$class] as $id => $obj)
  108. if ( $source === $obj )
  109. return $id;
  110. self::$objects[$class][] = &$source;
  111. return count(self::$objects[$class])-1;
  112. }
  113. static function drawObject(&$source, &$parents)
  114. {
  115. $className = get_class($source);
  116. $object_index = self::getObjectId($source);
  117. $object_id = 'dhph_' . $className . '_' . self::$calls . '_' . $object_index;
  118. if (self::isRecursiveObject($source, $parents))
  119. {
  120. self::drawValue('<a href="#' . $object_id . '" onclick="dumphper_show(this);">' . $className . ' #' . $object_index . '</a>' , 'recursion');
  121. }
  122. else
  123. {
  124. $sClass = new ReflectionObject($source);
  125. $statics = null;
  126. $class = $sClass->getParentClass();
  127. $classArray = '';
  128. while ( is_object($class) )
  129. {
  130. $classArray = ' &gt; ' . $class->getName() . $classArray;
  131. $class = $class->getParentClass();
  132. }
  133. echo '<div class="dumphper-container' . (self::$depth <= self::$max_showw_depth ? '' : ' dumphper-closed') . '">';
  134. self::drawHeader( '<a id="' . $object_id . '" name="' . $object_id . '" class="dumphper-toggler" href="javascript:;" onclick="dumphper_toggle(this);">' . $className . ' #' . $object_index .
  135. (count($classArray) ? ' <span class="dumphper-class-def"> ' . $classArray . '</span>' : '' ).
  136. '</a>', 'object');
  137. echo '<table class="dumphper-table" cellspacing="0" cellpadding="0">';
  138. if(!DPHP_USE_ACCESSIBLE)
  139. $temp = (array)$source;
  140. $class = $sClass;
  141. while ( is_object($class) )
  142. {
  143. $properties = $class->getProperties();
  144. if ($class->name != $className && count($properties))
  145. {
  146. echo '<tr><td colspan = "2">';
  147. self::drawValue('<code>inherited from </code>' . $class->name . ':', 'inherited');
  148. echo '</td></tr>';
  149. }
  150. foreach ($properties as &$value)
  151. {
  152. $declaredClass = $value->getDeclaringClass()->name;
  153. if ($class->name == $declaredClass)
  154. {
  155. echo '<tr><td class="dumphper-key-object">';
  156. self::drawValue($value->name/* . ' <span class="dumphper-class-def">' . $declaredClass . '</span>'*/, join('-',Reflection::getModifierNames($value->getModifiers())));
  157. echo '</td><td>';
  158. if ($value->isPublic())
  159. self::_dump($value->getValue($source), $parents);
  160. /** in case of PHP 5.3+ **/
  161. elseif (DPHP_USE_ACCESSIBLE)
  162. {
  163. $value->setAccessible(true);
  164. self::_dump($value->getValue($source), $parents);
  165. }
  166. /** in case of PHP 5.2.x+ **/
  167. elseif ($value->isStatic())
  168. {
  169. if (!$statics) $statics = $class->getStaticProperties();
  170. self::_dump($statics[$value->name], $parents);
  171. }
  172. else
  173. {
  174. $scope = $value->isPrivate() ? $value->class : '*';
  175. self::_dump($temp["\0{$scope}\0{$value->name}"], $parents);
  176. }
  177. echo '</td></tr>';
  178. }
  179. }
  180. $class = $class->getParentClass();
  181. }
  182. echo '</table>';
  183. echo '</div>';
  184. }
  185. }
  186. static function isRecursiveArray(&$source, &$parents)
  187. {
  188. if ( count($parents) > 0 )
  189. {
  190. $uKey = uniqid('array', true);
  191. $source[$uKey] = true;
  192. foreach ( $parents as &$parrent )
  193. {
  194. if ( is_array($parrent) && isset($parrent[$uKey]) )
  195. {
  196. unset($source[$uKey]);
  197. return true;
  198. }
  199. }
  200. unset($source[$uKey]);
  201. }
  202. $parents[] = &$source;
  203. return false;
  204. }
  205. static function isRecursiveObject(&$source, &$parents)
  206. {
  207. if ( in_array($source, $parents, true) )
  208. return true;
  209. $parents[] = &$source;
  210. return false;
  211. }
  212. static function drawValue($value, $type)
  213. {
  214. echo '<span class="dumphper-value dumphper-' . $type . '" title="' . $type . '">' . $value . '</span>';
  215. }
  216. static function drawHeader($value, $type)
  217. {
  218. echo '<div class="dumphper-head dumphper-head-' . $type . '" title="' . $type . '">' . $value .'</div>';
  219. }
  220. static function drawStyles()
  221. {
  222. static $displayed = false;
  223. if ($displayed) return; //Exit if already shown
  224. $displayed = true;
  225. ?><style type="text/css">
  226. .dumphper { margin: 0 0 3px !important; /*max-width:500px !important;*/}
  227. .dumphper-container { display: inline-block !important; position: relative !important; }
  228. .dumphper-value { background-color: #e7e7e7 !important; border: 1px solid #888 !important; }
  229. .dumphper-table { border-left: 1px solid #888 !important; width: 100%; }
  230. .dumphper-table td { border-right: 1px solid #888 !important; border-bottom: 1px solid #888 !important; vertical-align: top !important;}
  231. .dumphper-table .dumphper-value { border-width: 0 0 0 0 !important;display: block;}
  232. .dumphper, .dumphper-value, .dumphper-key, .dumphper-head { font: normal 12px Arial !important; line-height: 15px !important;}
  233. .dumphper-value { padding: 0 3px 0 12px !important; background-repeat: no-repeat !important; cursor: default !important;max-height: 45px; overflow: auto;}
  234. .dumphper-key { padding: 0 3px !important; }
  235. .dumphper-head { color: #fff !important; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAJCAYAAADzRkbkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACRJREFUeNpi+P//fw8TAwPDfxDxFUR8gROf4axvDEB10gABBgAvWg1pnyJeXQAAAABJRU5ErkJggg==) !important; background-repeat: repeat-x !important; padding: 1px 3px 2px !important; border: 1px solid #888 !important; font-weight: bold !important; }
  236. .dumphper-head-array { background-color: #260 !important;}
  237. .dumphper-key-array, .dumphper-key-array .dumphper-value { background-color: #dcffd0 !important;}
  238. .dumphper-key-array .dumphper-string { color: #030 !important; }
  239. .dumphper-key-array .dumphper-string, .dumphper-key-array .dumphper-integer { background-image: none !important; padding-left: 3px !important;}
  240. .dumphper-key-object { color: #004 !important;}
  241. .dumphper-head-object { background-color: #006 !important;}
  242. .dumphper-key-object, .dumphper-key-object .dumphper-value { background-color: #c8defe !important; }
  243. .dumphper-class-def { color: #666 !important; font: bold oblique 11px Arial !important;}
  244. .dumphper-head-object .dumphper-class-def { color: #bbb !important;}
  245. .dumphper-string { color: #a40 !important; background-image: url(data:image/gif;base64,R0lGODlhCgASAIAAAP/Qmv///yH5BAAAAAAALAAAAAAKABIAAAISjI+py+0MYkRzSQBlpvf5D34FADs=) !important; }
  246. .dumphper-integer { color: #00f !important; background-image: url(data:image/gif;base64,R0lGODlhCgASAIAAAKTC/////yH5BAAAAAAALAAAAAAKABIAAAIVjI+pqwDsGHRvRVtbThdRKoXiSC4FADs=) !important; }
  247. .dumphper-double { color: #f00 !important; background-image: url(data:image/gif;base64,R0lGODlhCgASAIAAAP+/v////yH5BAAAAAAALAAAAAAKABIAAAIWjI+pu+CQHJPxUXTrhI1j6zHiSJZiAQA7) !important; }
  248. .dumphper-resource { color: #660 !important; background-image: url(data:image/gif;base64,R0lGODlhCgASAIAAAP///8zMfyH5BAAAAAAALAAAAAAKABIAAAIVhI+py+0bYgAxSWon1Kpm6T3iSDYFADs=) !important; }
  249. .dumphper-null { color: #000 !important; background-image: url(data:image/gif;base64,R0lGODlhIgASAIAAAL+/v////yH5BAAAAAAALAAAAAAiABIAAAI+jI+py+0Po5wBWHAupswmzy1gtiEaeFWj+pXmhsLuyiqxcZOtKOO9/uL5hjUi8CVLpk4YZugJjUqn1KqVUQAAOw==) !important; padding-left: 37px !important; }
  250. .dumphper-boolean { color: #000 !important; background-image: url(data:image/gif;base64,R0lGODlhIgASAIAAAL+/v////yH5BAAAAAAALAAAAAAiABIAAAI+jI+py+0PYwRULlpVthpcz3VfsJEYgoFGeZzZC8Ktisb2epvzqPdyD6x5fkQVyzSkpYS2ZegJjUqn1KqVUwAAOw==) !important; padding-left: 37px !important; }
  251. .dumphper-inherited { color: #009 !important; background-color: #c8defe !important; /*background-image: url(data:image/gif;base64,R0lGODlhSgASAIABAH9/5f///yH5BAEAAAEALAAAAABKABIAAAJ2jI+py+0Po5y02ospAHDzbGyZt4jdB5ohGqmXCyLwA3uo7eIyGdj951vxfjnO7LdbHUxM4E3EKiaRyOFUSaU2g9lrF+fEJqTZpti7jKoVZva6HC6nS2/jTWklknj7rdDJBZb2JJUXc4iYqLjI2Oj4CBkpOblYAAA7) !important;*/ padding-left: /*7*/4px !important; font-weight: bold !important; }
  252. .dumphper-inherited code { font: 12px Arial; color: #66c !important; }
  253. .dumphper-recursion { color: #609 !important; background-image: url(data:image/gif;base64,R0lGODlhEAASAIAAAP/Uf////yH5BAAAAAAALAAAAAAQABIAAAIejI+py+0PIwMUmGoRvZXrHGzeIWIj2YWpxLbuC0sFADs=) !important; padding-left: 19px !important; font-weight: bold !important; }
  254. .dumphper-recursion a { color: #609 !important; text-decoration: underline !important; }
  255. .dumphper-private { background-image: url(data:image/gif;base64,R0lGODlhCwASAJEAAP///zMzM/8zMwAAACH5BAAAAAAALAAAAAALABIAAAIdhI+py30RWhCRzfrgpGhTwRnahnVhclmlw7auUwAAOw==) !important;}
  256. .dumphper-protected { background-image: url(data:image/gif;base64,R0lGODlhCwASAJEAAP/eADMzM////wAAACH5BAAAAAAALAAAAAALABIAAAIdlI+py30RWgCRzfrgpGhTwBnahnVhclmlw7auUwAAOw==) !important;}
  257. .dumphper-public { background-image: url(data:image/gif;base64,R0lGODlhCwASAJEAAADdADMzM////wAAACH5BAAAAAAALAAAAAALABIAAAIdlI+py30RWgCRzfrgpGhTwBnahnVhclmlw7auUwAAOw==) !important;}
  258. .dumphper-private-static { background-image: url(data:image/gif;base64,R0lGODlhCwASAJEAAP///zMzM/8zMwAAACH5BAAAAAAALAAAAAALABIAAAIdhI+pyw0BY0BBiHqpxfPI6CQfpF1byVFjyLbuUgAAOw==) !important;}
  259. .dumphper-protected-static { background-image: url(data:image/gif;base64,R0lGODlhCwASAJEAAP///zMzM//eAAAAACH5BAAAAAAALAAAAAALABIAAAIdhI+pyw0BY0BBiHqpxfPI6CQfpF1byVFjyLbuUgAAOw==) !important;}
  260. .dumphper-public-static { background-image: url(data:image/gif;base64,R0lGODlhCwASAJEAAP///zMzMwDdAAAAACH5BAAAAAAALAAAAAALABIAAAIdhI+pyw0BY0BBiHqpxfPI6CQfpF1byVFjyLbuUgAAOw==) !important;}
  261. .dumphper-toggler { color: #fff !important; display: block; background: url(data:image/gif;base64,R0lGODlhCgAKAJEAAOfn5zMzM////wAAACH5BAEAAAIALAAAAAAKAAoAAAISlI+pe+HvRAC0UmdtkPCxDyIFADs=) 1px 3px no-repeat !important; padding-left: 14px !important; text-decoration: none !important; cursor: pointer !important;}
  262. .dumphper-closed .dumphper-toggler { background-image: url(data:image/gif;base64,R0lGODlhCgAKAJEAAOfn5zMzM////wAAACH5BAEAAAIALAAAAAAKAAoAAAIZlBVxGwC6kIMmtZek2/PyiSQdpZEVGIVLAQA7) !important; }
  263. .dumphper-closed .dumphper-table, .dumphper-closed .dumphper-class-def { display: none !important; }
  264. </style>
  265. <script type="text/javascript">
  266. function dumphper_toggle(obj)
  267. {
  268. obj.parentNode.parentNode.className = (obj.parentNode.parentNode.className == 'dumphper-container' ? 'dumphper-container dumphper-closed' : 'dumphper-container');
  269. }
  270. function dumphper_show(source_obj)
  271. {
  272. obj = document.getElementById(source_obj.href.match(/[^#]+$/));
  273. while(obj = obj.parentNode)
  274. if (obj.className == 'dumphper-container dumphper-closed')
  275. obj.className = 'dumphper-container';
  276. }
  277. </script><?php
  278. }
  279. }
  280. /** Comment if you don't need this **/
  281. //function dump(&$var) { Dumphper::dump($var); }