'', 'debug_info' => '', 'rendered_markup' => '', 'debug_suffix' => '', ]; try { $output['rendered_markup'] = $twig_service->load($template_file)->render($variables); } catch (RuntimeError $e) { // In case there is a previous exception, re-throw the previous exception, // so that the original exception is shown, rather than // \Twig\Template::displayWithErrorHandling()'s exception. $previous_exception = $e->getPrevious(); if ($previous_exception) { throw $previous_exception; } throw $e; } if ($twig_service->isDebug()) { $output['debug_prefix'] .= "\n\n"; $output['debug_prefix'] .= "\n"; // If there are theme suggestions, reverse the array so more specific // suggestions are shown first. if (!empty($variables['theme_hook_suggestions'])) { $variables['theme_hook_suggestions'] = array_reverse($variables['theme_hook_suggestions']); } // Add debug output for directly called suggestions like // '#theme' => 'comment__node__article'. if (strpos($variables['theme_hook_original'], '__') !== FALSE) { $derived_suggestions[] = $hook = $variables['theme_hook_original']; while ($pos = strrpos($hook, '__')) { $hook = substr($hook, 0, $pos); $derived_suggestions[] = $hook; } // Get the value of the base hook (last derived suggestion) and append it // to the end of all theme suggestions. $base_hook = array_pop($derived_suggestions); $variables['theme_hook_suggestions'] = array_merge($derived_suggestions, $variables['theme_hook_suggestions']); $variables['theme_hook_suggestions'][] = $base_hook; } if (!empty($variables['theme_hook_suggestions'])) { $extension = twig_extension(); $current_template = basename($template_file); $suggestions = $variables['theme_hook_suggestions']; // Only add the original theme hook if it wasn't a directly called // suggestion. if (strpos($variables['theme_hook_original'], '__') === FALSE) { $suggestions[] = $variables['theme_hook_original']; } $invalid_suggestions = []; $base_hook = $base_hook ?? $variables['theme_hook_original']; foreach ($suggestions as $key => &$suggestion) { // Valid suggestions are $base_hook, $base_hook__*, and contain no hyphens. if (($suggestion !== $base_hook && !str_starts_with($suggestion, $base_hook . '__')) || str_contains($suggestion, '-')) { $invalid_suggestions[] = $suggestion; unset($suggestions[$key]); continue; } $template = strtr($suggestion, '_', '-') . $extension; $prefix = ($template == $current_template) ? 'x' : '*'; $suggestion = $prefix . ' ' . $template; } $output['debug_info'] .= "\n"; if (!empty($invalid_suggestions)) { $output['debug_info'] .= "\n"; } } $output['debug_info'] .= "\n\n"; $output['debug_suffix'] .= "\n\n\n"; } // This output has already been rendered and is therefore considered safe. return Markup::create(implode('', $output)); }