1

这是我有史以来第一个关于 SO 的问题,我很高兴提出任何改进建议。要温柔 :)

为了提高可维护性,我试图将 CSS、JS 和 HTML 放在同一个文件中。这对于包含文件或宏等变得很困难。最终输出template.render()应该抓取所有 CSS 和 JS,并将其放置在基本 HTML 模板的顶部和底部。

示例应该解释我的意思:

base.html

<html>
<head>
  <style>
    {{ print_css() }}
  </style>
</head>
<body>
  {% include 'bolded_text.html' %}
  <script>
    {{ print_js() }}
  </script>
</body>
</html>

加粗文本.html

{# this doesn't need to be a filter. It could be a block, or anything else that would make this work #}
{% filter add_css %}
   strong {
     background: #ccc;
   }
{% endfilter %}
<strong>Bolded text</strong>
{% filter add_js %}
   alert('javascript included!');
{% endfilter %}

输出当然是:

<html>
<head>
  <style>
    strong {
      background: #ccc;
    }
  </style>
</head>
<body>
  {% include 'bolded_text.html' %}
  <script>
    alert('javascript included!')
  </script>
</body>
</html>

可以预见,问题是 print_css() 什么也不输出。

我尝试使用上下文过滤器执行此操作,在上下文中的位置add_js和附加到变量,add_css然后输出该变量。这对于 JavaScript 来说工作得很好而且很简单,因为 print 语句遵循所有的过滤器。print_cssprint_js

但是,我想不出一种使它与 CSS 一起工作的方法。如果我可以使print_css()调用变得懒惰,或者以某种方式在 jinja2 AST 中交换输出,那可能会起作用。我试图避免 hacky 字符串操作(例如在底部输出 CSS,然后使用正则表达式将其移动到顶部)。

我想可能有一种方法可以优雅地做到这一点,而我对 jinja2 的低级 API 的经验是有限的。

非常感谢任何帮助,谢谢!

4

1 回答 1

0

会做到这一点,但我不明白为什么你不使用样式表,这使浏览器能够更好地缓存并且也更容易维护。

编辑

例子:

{% macro generate_css(strong_bg='#ccc', additional_options=None) -%}
    strong {
        background: {{ strong_bg }};
    }
{%- endmacro %}

<head>
  <style>
    {{ generate_css() }}
  </style>
</head>
于 2012-05-01T13:37:51.087 回答