diff core/themes/engines/twig/twig.engine @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children 12f9dff5fda9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/themes/engines/twig/twig.engine	Thu Jul 05 14:24:15 2018 +0000
@@ -0,0 +1,152 @@
+<?php
+
+/**
+ * @file
+ * Handles integration of Twig templates with the Drupal theme system.
+ */
+
+use Drupal\Component\Utility\Html;
+use Drupal\Core\Render\Markup;
+use Drupal\Core\Extension\Extension;
+
+/**
+ * Implements hook_theme().
+ */
+function twig_theme($existing, $type, $theme, $path) {
+  $templates = drupal_find_theme_functions($existing, [$theme]);
+  $templates += drupal_find_theme_templates($existing, '.html.twig', $path);
+  return $templates;
+}
+
+/**
+ * Implements hook_extension().
+ */
+function twig_extension() {
+  return '.html.twig';
+}
+
+/**
+ * Includes .theme file from themes.
+ *
+ * @param \Drupal\Core\Extension\Extension $theme
+ *   The theme extension object.
+ */
+function twig_init(Extension $theme) {
+  $theme->load();
+}
+
+/**
+ * Implements hook_render_template().
+ *
+ * Renders a Twig template.
+ *
+ * If the Twig debug setting is enabled, HTML comments including the theme hook
+ * and template file name suggestions will surround the template markup.
+ *
+ * @param string $template_file
+ *   The file name of the template to render.
+ * @param array $variables
+ *   A keyed array of variables that will appear in the output.
+ *
+ * @return string|\Drupal\Component\Render\MarkupInterface
+ *   The output generated by the template, plus any debug information.
+ */
+function twig_render_template($template_file, array $variables) {
+  /** @var \Twig_Environment $twig_service */
+  $twig_service = \Drupal::service('twig');
+  $output = [
+    'debug_prefix' => '',
+    'debug_info' => '',
+    'rendered_markup' => '',
+    'debug_suffix' => '',
+  ];
+  try {
+    $output['rendered_markup'] = $twig_service->loadTemplate($template_file)->render($variables);
+  }
+  catch (\Twig_Error_Runtime $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<!-- THEME DEBUG -->";
+    $output['debug_prefix'] .= "\n<!-- THEME HOOK: '" . Html::escape($variables['theme_hook_original']) . "' -->";
+    // 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'];
+      }
+      foreach ($suggestions as &$suggestion) {
+        $template = strtr($suggestion, '_', '-') . $extension;
+        $prefix = ($template == $current_template) ? 'x' : '*';
+        $suggestion = $prefix . ' ' . $template;
+      }
+      $output['debug_info'] .= "\n<!-- FILE NAME SUGGESTIONS:\n   " . Html::escape(implode("\n   ", $suggestions)) . "\n-->";
+    }
+    $output['debug_info']   .= "\n<!-- BEGIN OUTPUT from '" . Html::escape($template_file) . "' -->\n";
+    $output['debug_suffix'] .= "\n<!-- END OUTPUT from '" . Html::escape($template_file) . "' -->\n\n";
+  }
+  // This output has already been rendered and is therefore considered safe.
+  return Markup::create(implode('', $output));
+}
+
+/**
+ * Removes child elements from a copy of the original array.
+ *
+ * Creates a copy of the renderable array and removes child elements by key
+ * specified through filter's arguments. The copy can be printed without these
+ * elements. The original renderable array is still available and can be used
+ * to print child elements in their entirety in the twig template.
+ *
+ * @param array|object $element
+ *   The parent renderable array to exclude the child items.
+ * @param string[] ...
+ *   The string keys of $element to prevent printing.
+ *
+ * @return array
+ *   The filtered renderable array.
+ */
+function twig_without($element) {
+  if ($element instanceof ArrayAccess) {
+    $filtered_element = clone $element;
+  }
+  else {
+    $filtered_element = $element;
+  }
+  $args = func_get_args();
+  unset($args[0]);
+  foreach ($args as $arg) {
+    if (isset($filtered_element[$arg])) {
+      unset($filtered_element[$arg]);
+    }
+  }
+  return $filtered_element;
+}