【问题标题】:Can we make twig remove whitespace when it's compiled, rather than when it's rendered?我们可以让 twig 在编译时而不是在渲染时删除空格吗?
【发布时间】:2015-11-25 16:20:01
【问题描述】:

Twig 有 {% spaceless %} 标记,它会删除 HTML 标记之间的所有空白。

但是,当您渲染模板时,它会使用 preg_replace 执行此操作。小文件很好,但如果您有一个大型复杂模板,则会影响性能。

我觉得应该可以在编译时去掉空格?

我编译的模板充满了诸如

之类的东西
        echo "    <h2>Heading</h2>
";

模板包含以下内容:

<section>
    <h2>Heading</h2>
</section>

我想要的最终呈现的 HTML 是

<section><h2>Heading</h2></section>

为什么twig(很简单)在构建编译模板时不能添加trim,给我们:

echo "<h2>Heading</h2>";

在编译的模板php代码中。

我知道在{{ }} 内填充模板的任何数据中仍然可能存在空格,但我可以通过我的 PHP 轻松控制。

【问题讨论】:

    标签: php templates twig


    【解决方案1】:

    好的,在库中大量挖掘试图找出哪些文件生成哪些输出位之后,我终于找到了这个“修复”。

    改变

    ->string($this->getAttribute('data'))
    

    ->string(trim(preg_replace('/>\s+</', '><', $this->getAttribute('data'))))
    

    在 /lib/Twig/Node/Text.php 的第 30 行。

    正确地执行此操作会给我一个“无空间”的输出,但不需要昂贵的模板渲染时间 preg_replace 调用。

    它会引起问题吗?可能在某些用例中,可能带有部分&lt;pre&gt;&lt;textarea&gt; 标签。不过,我看不出其中任何一个对我来说是个问题。

    有什么我没有想到的问题吗?

    【讨论】:

    • 好主意,你应该在 Symfony 或 Twig 问题队列中提出这个选项。
    • 这很好,但可悲的是,当通过包管理器安装时,更改库的内部不会奏效。因为如果有更新,并且您安装它,上面的行将再次被删除。至少如果我正确理解库/包的话。
    • 正确@Allart。从理论上讲,我可以将它作为 PR 提交,他们可能会将其合并,但实际上,如果他们还没有,我只能假设他们不想这样做 - 这是一个如此简单的“修复”,他们必须有他们的理由不这样做。毫无疑问,我没有考虑过一些边缘情况。
    • 是的,也许是因为他们也有这个:twig.symfony.com/doc/2.x/templates.html#whitespace-control。至少这对我有用。使用{{- -}}
    【解决方案2】:

    【讨论】:

    • 你误解了我的问题。
    【解决方案3】:

    如果空格在模板源中,则适合您需要的工具是 Twig 的空白控制功能:http://twig.sensiolabs.org/doc/templates.html#whitespace-control

    如果空格在输出中显示的变量中,您应该使用修剪过滤器(或在将变量传递给 Twig 之前修剪变量,无论如何都会这样做)

    【讨论】:

    • 我不确定这是正确的工具吗?我说的是我的树枝模板中裸露的 HTML 位周围的空白。我刚刚编辑了问题以使其更清晰。
    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    相关资源
    最近更新 更多