Exemple #1
0
 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);
 }
Exemple #2
0
 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);
     }
 }
Exemple #3
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>';
 }
Exemple #4
0
 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;
         }
     }
 }
Exemple #5
0
 public function getSize()
 {
     if (!$this->size) {
         return 'empty';
     }
     return parent::getSize();
 }
Exemple #6
0
 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);
     }
 }
Exemple #7
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);
     }
 }
Exemple #8
0
 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">&rlarr;</span>';
     }
     $header .= '<span class="kint-popup-trigger" title="Open in new window">&rarr;</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>';
 }
Exemple #9
0
 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;
 }
Exemple #10
0
 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);
 }
Exemple #11
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);
 }
Exemple #12
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);
 }
Exemple #13
0
 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);
 }
Exemple #14
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);
 }
Exemple #15
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;
 }
Exemple #16
0
 public function getAccessPath()
 {
     if ($this->access_path !== null) {
         return parent::getAccessPath() . '(' . $this->getParams() . ')';
     }
 }
Exemple #17
0
 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);
 }
Exemple #18
0
 /**
  * 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 '';
 }