保留包含的Twig子模板的缩进级别

6
我正在使用Twig模板引擎,并且想要像下面的示例一样包含子模板:
<header>
  <div id="menu">
    {% include 'menu.twig' %}
  </div>
</header>

所包含的文件包含以下代码:
<ul>
  <li>item 1</li>
  <li>item 2</li>
</ul>

现在Twig生成以下HTML代码:
<header>
  <div id="menu">
    <ul>
  <li>item 1</li>
  <li>item 2</li>
</ul>
  </div>
</header>

正如您所看到的,缩进级别仅对所包含文件的第一行正确,这导致上面的代码相当凌乱且难以维护。

如何才能从Twig获取正确的输出,并具有正确的缩进,如下所示?

<header>
  <div id="menu">
    <ul>
      <li>item 1</li>
      <li>item 2</li>
    </ul>
  </div>
</header>
3个回答

1
我认为在包含模板时保持缩进的方法不存在。我能想象的唯一解决方案是将缩进级别作为变量传递,并在包含的模板中使用循环,在每行前缀中添加相应数量的空格。显然,这个“解决方案”非常疯狂,难以维护。
关于此评论:“[...]导致上面的代码相当混乱,难以维护。” 我想说以下几点:
  • HTML是否“混乱”并不重要。浏览器不会抱怨,用户也看不到。
  • 确实很难维护。幸运的是,您只需维护美观对齐的Twig模板,而不是生成的HTML代码。
如果Twig模板生成需要“完美对齐”的格式,则以上所有内容都将有所不同。但是在HTML的情况下,请不要浪费时间对齐标记。

1
虽然大多数用户不会看到它,但我经常查看我喜欢的页面的HTML,以了解可以从中获取什么内容来用于我的网页。如果HTML格式不良(例如全部在一行上或缩进混乱),那么我很难从中获取任何信息。当我制作我的网页时,我希望它们能够格式良好,以便其他人可以从我的代码中学习。我根本不认为这是浪费时间。 - weux082690
这就是为什么我也喜欢适当的缩进的原因。我想知道为什么Twig这么难做到。它只需要保持所包含文件中所有行的缩进级别(而不仅仅是第一行),一切都会很好。 - ProgUser44
这是真的,而且很可能不仅仅是针对Twig的问题,因为市面上有很多模板引擎都可能存在相同的问题。总的来说,模板引擎的设计初衷是用于处理你编写的代码,而不是生成的HTML内容。 - Qiniso

1
如果您只想保留所包含的子模板的确切缩进,可以这样做:
<header>
  <div id="menu">
{% include 'menu.twig' %}
  </div>
</header>

即将所有的"include"指令放在行首。结果将是:
<header>
  <div id="menu">
<ul>
  <li>item 1</li>
  <li>item 2</li>
</ul>
  </div>
</header>

但是我觉得这样还不够好。另一个解决方案是在子布局中添加缩进,即:
    <ul>
      <li>item 1</li>
      <li>item 2</li>
    </ul>

当然,这仅在子布局始终包含在一定缩进级别时才起作用。
我建议您采取完全不同的路线,并在生成响应后格式化响应,例如通过内核响应事件上的侦听器。

0

在 PHP 中创建 Twig 环境后,您可以像这样添加一个 Twig 过滤器:

$filter = new Twig_Filter('ident', function ($string, $number) {
    $spaces = str_repeat(' ', $number);
    return rtrim(preg_replace('#^(.+)$#m', sprintf('%1$s$1', $spaces), $string));
}, array('is_safe' => array('all')));

$Your_Twig_Environment->addFilter($filter);

之后你可以像这样使用它:

{{ include('menu.twig')|ident(4) }}

(注意使用包含函数语法的{{}}而不是包含标签语法的{% %})


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接