public function parse(&$var, Kint_Object &$o) { if (!is_string($var) || !preg_match('/0\\.[0-9]{8} [0-9]{10}/', $var)) { return; } if ($o->name !== 'microtime()' || $o->depth !== 0) { return; } list($usec, $sec) = explode(' ', $var); $time = (double) $usec + (double) $sec; if (self::$last !== null) { $last_time = array_sum(array_map('floatval', explode(' ', self::$last))); $lap = $time - $last_time; ++self::$times; } else { $lap = null; self::$start = $time; } self::$last = $var; if ($lap !== null) { $total = $time - self::$start; $r = new Kint_Object_Representation_Microtime(self::$group, $lap, $total, self::$times); } else { $r = new Kint_Object_Representation_Microtime(self::$group); } $r->contents = $var; $r->implicit_label = true; $o->removeRepresentation($o->value->name); $o->addRepresentation($r); }
public function parse(&$var, Kint_Object &$o) { if (!is_string($var) || strlen($var) > 2048 || preg_match('[[:?<>"*|]]', $var) || !@is_readable($var)) { return; } if (class_exists('SplFileInfo')) { $r = new Kint_Object_Representation_FsPath(new SplFileInfo($var)); $o->addRepresentation($r, 0); } }
public function renderChildren(Kint_Object $o) { $contents = array(); $tabs = array(); foreach ($o->getRepresentations() as $rep) { $result = $this->renderTab($o, $rep); if (Kint_Object_Blob::strlen($result)) { $contents[] = $result; $tabs[] = $rep; } } if (empty($tabs)) { return ''; } $output = '<dd>'; if (count($tabs) === 1 && $tabs[0]->labelIsImplicit()) { $output .= reset($contents); } else { $output .= '<ul class="kint-tabs">'; foreach ($tabs as $i => $tab) { if ($i === 0) { $output .= '<li class="kint-active-tab">'; } else { $output .= '<li>'; } $output .= Kint_Object_Blob::escape($tab->getLabel()) . '</li>'; } $output .= '</ul><ul>'; foreach ($contents as $tab) { $output .= '<li>' . $tab . '</li>'; } $output .= '</ul>'; } return $output . '</dd>'; }
public function parse(&$var, Kint_Object &$o) { if (!is_object($var)) { return; } foreach (self::$blacklist as $class) { if ($var instanceof $class) { $o->clearRepresentations(); $o->value = null; $o->size = null; $o->hints[] = 'blacklist'; $this->parser->haltPlugins(); return; } } }
public function getSize() { if (!$this->size) { return 'empty'; } return parent::getSize(); }
public function parse(&$var, Kint_Object &$o) { if (!$var instanceof Closure || !$o instanceof Kint_Object_Instance || !$this->parseChildren($o)) { return; } $o = $o->transplant(new Kint_Object_Closure()); $o->removeRepresentation('properties'); $closure = new ReflectionFunction($var); $o->filename = $closure->getFileName(); $o->startline = $closure->getStartLine(); foreach ($closure->getParameters() as $param) { $o->parameters[] = new Kint_Object_Parameter($param); } $p = new Kint_Object_Representation('Parameters'); $p->contents =& $o->parameters; $o->addRepresentation($p, 0); $statics = array(); if (method_exists($closure, 'getClosureThis') && ($v = $closure->getClosureThis())) { $statics = array('this' => $v); } if (count($statics = $statics + $closure->getStaticVariables())) { foreach ($statics as $name => &$static) { $obj = Kint_Object::blank('$' . $name); $obj->depth = $o->depth + 1; $static = $this->parser->parse($static, $obj); if ($static->value === null) { $static->access_path = null; } } $r = new Kint_Object_Representation('Uses'); $r->contents = $statics; $o->addRepresentation($r, 0); } }
public function parse(&$var, Kint_Object &$o) { if (!is_object($var) || !($var instanceof DOMNamedNodeMap || $var instanceof DOMNodeList)) { return; } // Recursion (This should never happen, should always be stopped at the parent DOMNode) if (in_array('recursion', $o->hints)) { return; } $o->size = $var->length; if ($o->size === 0) { $o->replaceRepresentation(new Kint_Object_Representation('Iterator')); $o->size = null; return; } // Depth limit // Make empty iterator representation since we need it in DOMNode to point out depth limits if ($this->parser->max_depth && $o->depth + 1 >= $this->parser->max_depth) { $b = new Kint_Object(); $b->name = $o->classname . ' Iterator Contents'; $b->access_path = 'iterator_to_array(' . $o->access_path . ', true)'; $b->depth = $o->depth + 1; $b->hints[] = 'depth_limit'; $r = new Kint_Object_Representation('Iterator'); $r->contents = array($b); $o->replaceRepresentation($r, 0); return; } $data = iterator_to_array($var, true); $r = new Kint_Object_Representation('Iterator'); $o->replaceRepresentation($r, 0); foreach ($data as $key => $item) { $base_obj = new Kint_Object(); $base_obj->depth = $o->depth + 1; $base_obj->name = $item->nodeName; if ($o->access_path) { if ($var instanceof DOMNamedNodeMap) { $base_obj->access_path = $o->access_path . '->getNamedItem(' . var_export($key, true) . ')'; } elseif ($var instanceof DOMNodeList) { $base_obj->access_path = $o->access_path . '->item(' . var_export($key, true) . ')'; } else { $base_obj->access_path = 'iterator_to_array(' . $o->access_path . ', true)[' . var_export($key, true) . ']'; } } $r->contents[] = $this->parser->parse($item, $base_obj); } }
public static function renderLockedHeader(Kint_Object $o, $content) { $header = '<dt class="kint-parent kint-locked">'; if ($o->depth > 0 && ($ap = $o->getAccessPath())) { $header .= '<span class="kint-access-path-trigger" title="Show access path">⇄</span>'; } $header .= '<span class="kint-popup-trigger" title="Open in new window">→</span><nav></nav>'; if (($s = $o->getModifiers()) !== null) { $header .= '<var>' . $s . '</var> '; } if (($s = $o->getName()) !== null) { $header .= '<dfn>' . Kint_Object_Blob::escape($s) . '</dfn> '; if ($s = $o->getOperator()) { $header .= Kint_Object_Blob::escape($s) . ' '; } } if (($s = $o->getType()) !== null) { $header .= '<var>' . Kint_Object_Blob::escape($s) . '</var>'; } if (($s = $o->getSize()) !== null) { $header .= '(' . $s . ') '; } $header .= $content; if (!empty($ap)) { $header .= '<div class="access-path">' . Kint_Object_Blob::escape($ap) . '</div>'; } return $header . '</dt>'; }
public function transplant(Kint_Object $new) { $new = parent::transplant($new); $new->classname = $this->classname; $new->hash = $this->hash; $new->filename = $this->filename; $new->startline = $this->startline; return $new; }
public function parse(&$var, Kint_Object &$o) { if (!is_string($var) || !preg_match('%^(?:[A-Za-z0-9+/=]{4})+$%', $var)) { return; } $data = base64_decode($var); if ($data === false) { return; } $base_obj = new Kint_Object(); $base_obj->depth = $o->depth + 1; $base_obj->name = 'base64_decode(' . $o->name . ')'; if ($o->access_path) { $base_obj->access_path = 'base64_decode(' . $o->access_path . ')'; } $r = new Kint_Object_Representation('Base64'); $r->contents = $this->parser->parse($data, $base_obj); $o->addRepresentation($r, 0); }
public function parse(&$var, Kint_Object &$o) { if (!is_string($var) || !isset($var[0]) || $var[0] !== '{' && $var[0] !== '[' || ($json = json_decode($var, true)) === null) { return; } $json = (array) $json; if (empty($json)) { return; } $base_obj = new Kint_Object(); $base_obj->depth = $o->depth; if ($o->access_path) { $base_obj->access_path = 'json_decode(' . $o->access_path . ', true)'; } $r = new Kint_Object_Representation('Json'); $r->contents = $this->parser->parse($json, $base_obj); if (!in_array('depth_limit', $r->contents->hints)) { $r->contents = $r->contents->value->contents; } $o->addRepresentation($r, 0); }
private static function sort(Kint_Object $a, Kint_Object $b) { $sort = (int) $a->const - (int) $b->const; if ($sort) { return $sort; } $sort = Kint_Object::sortByAccess($a, $b); if ($sort) { return $sort; } return Kint_Object_Instance::sortByHierarchy($a->owner_class, $b->owner_class); }
public function parse(&$var, Kint_Object &$o) { if (!is_string($var) || substr($var, 0, 5) !== '<?xml') { return; } if (!method_exists($this, 'xmlTo' . self::$parse_method)) { return; } $xml = call_user_func(array(get_class($this), 'xmlTo' . self::$parse_method), $var, $o->access_path); if (empty($xml)) { return; } list($xml, $access_path, $name) = $xml; $base_obj = new Kint_Object(); $base_obj->depth = $o->depth + 1; $base_obj->name = $name; $base_obj->access_path = $access_path; $r = new Kint_Object_Representation('XML'); $r->contents = $this->parser->parse($xml, $base_obj); $o->addRepresentation($r, 0); }
public function parse(&$var, Kint_Object &$o) { if (!is_string($var)) { return; } $trimmed = rtrim($var); if ($trimmed !== 'N;' && !preg_match('/^[COabdis]:\\d+[:;]/', $trimmed)) { return; } // Second parameter only supported on PHP 7 if (KINT_PHP70) { // Suppress warnings on unserializeable variable $data = @unserialize($trimmed, self::$options); } else { $data = @unserialize($trimmed); } if ($data === false && $trimmed !== 'b:0;') { return; } $base_obj = new Kint_Object(); $base_obj->depth = $o->depth + 1; $base_obj->name = 'unserialize(' . $o->name . ')'; if ($o->access_path) { $base_obj->access_path = 'unserialize(' . $o->access_path; if (!KINT_PHP70 || self::$options === array(true)) { $base_obj->access_path .= ')'; } elseif (self::$options === array(false)) { $base_obj->access_path .= ', false)'; } else { $base_obj->access_path .= ', Kint_Parser_Plugin_Serialize::$options)'; } } $r = new Kint_Object_Representation('Serialized'); $r->contents = $this->parser->parse($data, $base_obj); if (!in_array('depth_limit', $r->contents->hints) && is_array($data)) { $r->contents = $r->contents->value->contents; } $o->addRepresentation($r, 0); }
public static function isTrace(array $trace) { if (!Kint_Object::isSequential($trace)) { return false; } $any_required = array('file', 'line', 'args', 'class'); $file_found = false; foreach ($trace as $frame) { if (!is_array($frame) || !isset($frame['function'])) { return false; } if (!$file_found && isset($frame['file']) && file_exists($frame['file'])) { $file_found = true; } if (!array_intersect(array_keys($frame), $any_required)) { return false; } } return $file_found; }
public function getAccessPath() { if ($this->access_path !== null) { return parent::getAccessPath() . '(' . $this->getParams() . ')'; } }
private static function sortObjectProperties(Kint_Object $a, Kint_Object $b) { $sort = Kint_Object::sortByAccess($a, $b); if ($sort) { return $sort; } $sort = Kint_Object::sortByName($a, $b); if ($sort) { return $sort; } return Kint_Object_Instance::sortByHierarchy($a->owner_class, $b->owner_class); }
/** * Dump information about variables, accepts any number of parameters, supports modifiers:. * * clean up any output before kint and place the dump at the top of page: * - Kint::dump() * ***** * expand all nodes on display: * ! Kint::dump() * ***** * dump variables disregarding their depth: * + Kint::dump() * ***** * return output instead of displaying it: * * @ Kint::dump() * ***** * force output as plain text * ~ Kint::dump() * * Modifiers are supported by all dump wrapper functions, including Kint::trace(). Space is optional. * * @param mixed $data * * @return void|string */ public static function dump($data = null) { if (!self::$enabled_mode) { return ''; } $stash = self::settings(); list($names, $parameters, $modifiers, $callee, $caller, $mini_trace) = self::getCalleeInfo(defined('DEBUG_BACKTRACE_IGNORE_ARGS') ? debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) : debug_backtrace()); // set mode for current run if (self::$enabled_mode === true) { self::$enabled_mode = self::$mode_default; if (PHP_SAPI === 'cli' && self::$cli_detection === true) { self::$enabled_mode = self::$mode_default_cli; } } if (strpos($modifiers, '~') !== false) { self::$enabled_mode = self::MODE_WHITESPACE; } if (!array_key_exists(self::$enabled_mode, self::$renderers)) { $renderer = self::$renderers[self::MODE_PLAIN]; } else { $renderer = self::$renderers[self::$enabled_mode]; } // process modifiers: @, +, ! and - if (strpos($modifiers, '-') !== false) { while (ob_get_level()) { ob_end_clean(); } } if (strpos($modifiers, '!') !== false) { self::$expanded = true; } if (strpos($modifiers, '+') !== false) { self::$max_depth = false; } if (strpos($modifiers, '@') !== false) { self::$return = true; } $renderer = new $renderer($names, $parameters, $modifiers, $callee, $caller, $mini_trace); $output = call_user_func(array($renderer, 'preRender')); $parser = new Kint_Parser(self::$max_depth, empty($caller['class']) ? null : $caller['class']); if ($names === array(null) && func_num_args() === 1 && $data === 1) { // Kint::dump(1) shorthand $trace = Kint_Parser_Plugin_Trace::trimTrace(debug_backtrace(true)); $lastframe = array_shift($trace); $tracename = $lastframe['function'] . '(1)'; if (isset($lastframe['class'], $lastframe['type'])) { $tracename = $lastframe['class'] . $lastframe['type'] . $tracename; } $tracebase = Kint_Object::blank($tracename, 'debug_backtrace()'); if (empty($trace)) { $output .= call_user_func(array($renderer, 'render'), $tracebase->transplant(new Kint_Object_Trace())); } else { $output .= call_user_func(array($renderer, 'render'), $parser->parse($trace, $tracebase)); } } else { $data = func_get_args(); if ($data === array()) { $output .= call_user_func(array($renderer, 'render'), new Kint_Object_Nothing()); } foreach ($data as $i => $argument) { $output .= call_user_func(array($renderer, 'render'), $parser->parse($argument, Kint_Object::blank(isset($names[$i]) ? $names[$i] : null, isset($parameters[$i]) ? $parameters[$i] : null))); } } $output .= call_user_func(array($renderer, 'postRender')); if (self::$return) { self::settings($stash); return $output; } self::settings($stash); echo $output; return ''; }