X-Git-Url: https://yaffs.net/gitweb/?a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Fdevel%2Fkint%2Fsrc%2FTwig%2FKintExtension.php;fp=web%2Fmodules%2Fcontrib%2Fdevel%2Fkint%2Fsrc%2FTwig%2FKintExtension.php;h=4f177f9bffb3ad97bfa99348e4b20af202efc505;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/modules/contrib/devel/kint/src/Twig/KintExtension.php b/web/modules/contrib/devel/kint/src/Twig/KintExtension.php new file mode 100644 index 000000000..4f177f9bf --- /dev/null +++ b/web/modules/contrib/devel/kint/src/Twig/KintExtension.php @@ -0,0 +1,154 @@ + array('html'), + 'needs_environment' => TRUE, + 'needs_context' => TRUE, + 'is_variadic' => TRUE, + )), + ); + } + + /** + * Provides Kint function to Twig templates. + * + * Handles 0, 1, or multiple arguments. + * + * Code derived from https://github.com/barelon/CgKintBundle. + * + * @param \Twig_Environment $env + * The twig environment instance. + * @param array $context + * An array of parameters passed to the template. + * @param array $args + * An array of parameters passed the function. + * + * @return string + * String representation of the input variables. + */ + public function kint(\Twig_Environment $env, array $context, array $args = []) { + // Don't do anything unless twig_debug is enabled. This reads from the Twig + // environment, not Drupal Settings, so a container rebuild is necessary + // when toggling twig_debug on and off. We can consider injecting Settings. + if (!$env->isDebug()) { + return; + } + kint_require(); + // Don't display where Kint was called from. + // @todo Can we add information about which template Kint was called from? + \Kint::$displayCalledFrom = FALSE; + + // No arguments passed to kint(), display full Twig context. + if (empty($args)) { + $kint_variable = array(); + foreach ($context as $key => $value) { + if (!$value instanceof \Twig_Template) { + $kint_variable[$key] = $value; + } + } + + $result = @\Kint::dump($kint_variable); + $output = str_replace('$kint_variable', 'Twig context', $result); + } + else { + // Try to get the names of variables from the Twig template. + $parameters = $this->getTwigFunctionParameters(); + + // If there is only one argument, pass to Kint without too much hassle. + if (count($args) == 1) { + $kint_variable = reset($args); + $variable_name = reset($parameters); + $result = @\Kint::dump($kint_variable); + // Replace $kint_variable with the name of the variable in the Twig + // template. + $output = str_replace('$kint_variable', $variable_name, $result); + } + else { + $kint_args = []; + // Build an array of variable to pass to Kint. + // @todo Can we just call_user_func_array while still retaining the + // variable names? + foreach ($args as $index => $arg) { + // Prepend a unique index to allow debugging the same variable more + // than once in the same Kint dump. + $name = !empty($parameters[$index]) ? $parameters[$index] : $index; + $kint_args['_index_' . $index . '_' . $name] = $arg; + } + + $result = @\Kint::dump($kint_args); + // Display a comma separated list of the variables contained in this group. + $output = str_replace('$kint_args', implode(', ', $parameters), $result); + // Remove unique indexes from output. + $output = preg_replace('/_index_([0-9]+)_/', '', $output); + } + } + + return $output; + } + + /** + * Gets the twig function parameters for the current invocation. + * + * @return array + * The detected twig function parameters. + */ + protected function getTwigFunctionParameters() { + $callee = NULL; + $template = NULL; + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT); + + foreach ($backtrace as $index => $trace) { + if (isset($trace['object']) && $trace['object'] instanceof \Twig_Template && 'Twig_Template' !== get_class($trace['object'])) { + $template = $trace['object']; + $callee = $backtrace[$index - 1]; + break; + } + } + + $parameters = []; + + /** @var \Twig_Template $template */ + if (NULL !== $template && NULL !== $callee) { + $line_number = $callee['line']; + $debug_infos = $template->getDebugInfo(); + + if (isset($debug_infos[$line_number])) { + $source_line = $debug_infos[$line_number]; + $source_file_name = $template->getTemplateName(); + + if (is_readable($source_file_name)) { + $source = file($source_file_name, FILE_IGNORE_NEW_LINES); + $line = $source[$source_line - 1]; + + preg_match('/kint\((.+)\)/', $line, $matches); + if (isset($matches[1])) { + $parameters = array_map('trim', explode(',', $matches[1])); + } + } + } + } + + return $parameters; + } + +}