【问题标题】:How do I retain the whitespace in templates' blocks?如何保留模板块中的空格?
【发布时间】:2010-01-04 21:47:35
【问题描述】:

我正在为 Django 使用 SHPAML(HAML for python),但是,由于在覆盖某些块时出现空格问题,我在转换 SHPAML -> HTML 时遇到了问题,下面是一个示例:

在skeleton.shpaml中:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>{{ title }}</title>

        {% comment %}
        <link rel="shortcut icon" href="/static/images/favicon.ico" type="image/x-icon"/>
        {% endcomment %}

        {% if css_list %}
            {% for css in css_list %}
            <link type="text/css" rel="stylesheet" href="{{css_relative}}{{ css }}">
            {% endfor %}
        {% endif %}

        {% if js_list %}
            {% for js in js_list %}
            <script type="text/javascript" src="{{js_relative}}{{ js }}">
            </script>
            {% endfor %}
        {% endif %}

        {% if no_cache %}
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="Cache-Control" content="no-cache" />
        {% endif %}

    </head>

    body
        #nonFooter
            #content
                {% block header %}&nbsp;{% endblock %}
            #maincontent
                {% block content %}&nbsp;{% endblock %}
        #footer
            &nbsp;

</html>

在 index.shpaml 中:

{% extends "includes/skeleton.shpaml" %}
{% block content %}
asd
.test
    .test2 | meh
{% endblock %}

最后,我的输出是这样的:

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Home | Zineified</title>





            <link type="text/css" rel="stylesheet" href="/media/css/base.css">





            <script type="text/javascript" src="/media/js/jquery-1.3.2.min.js">
            </script>

            <script type="text/javascript" src="/media/js/jquery.form.js">
            </script>

            <script type="text/javascript" src="/media/js/base.js">
            </script>





    </head>

    body
        #nonFooter
            #content
                &nbsp;
            #maincontent

asd
.test
    .test2 | meh

        #footer
            &nbsp;

</html>

如您所见,块中没有保留空格。 index.shpaml 中的下一行直接进入skeleton.shpaml 中的下一行。如何通过模板扩展来防止这种情况并保留空格?

【问题讨论】:

    标签: django shpaml


    【解决方案1】:

    看起来 SHPAML 预处理器在 Django 之前没有被调用。我通常做的是用 .shpaml 扩展名在 SHPAML 中编写我的所有文档,然后我将它们转换为具有 .html 扩展名的 Django,然后让 Django 发挥它的魔力。因此,您会希望“extends”和“include”之类的语句引用已经预处理的 .html 文档。

    您的基本 shpaml 文档将如下所示:

    html 身体 #主页 {% 块体 %} {% 端块 %}

    然后扩展它的文档将如下所示:

    {% 扩展 'base.html' %} {% 块体 %} p 这是关于{{ book }}的一段... {% 端块 %}

    然后你想在 Django 看到它们之前对它们进行预处理。我通常在执行“manage.py runserver”之前使用 Python 脚本对它们进行预处理。

    【讨论】:

      【解决方案2】:

      来自文档:

      没有空间

      删除 HTML 标记之间的空格。这包括制表符和换行符。

      示例用法:

      {% spaceless %}
          <p>
              <a href="foo/">Foo</a>
          </p>
      {% endspaceless %}
      

      这个例子会返回这个 HTML:

      <p><a href="foo/">Foo</a></p>
      

      只删除标签之间的空格 -- 不删除标签和文本之间的空格。

      您也可以手动删除多余的空格/换行符,但这会降低模板的可读性。

      【讨论】:

      • 这行不通。这意味着模板扩展骨架不包含 SHPAML 代码。 SHPAML 代码需要大量的空格。 (SHPAML 本质上是 Python 的 HTML,类似于 HAML)
      • 据我了解,它将 shpaml 标签视为纯文本并保留所有格式。只有 html 标签受到影响
      • 你是对的,它仍然将 shpaml 标签视为纯文本,但是,它并没有解决在覆盖骨架.shpaml 中的块内容时保留空格的问题。我刚试过。
      【解决方案3】:
                 #maincontent
      

      asd

      你的意思是这里的错位?好吧,相应地调整您的 index.shpaml:

      {% extends "includes/skeleton.shpaml" %}
      {% block content %}
                  asd
                  .test
                      .test2 | meh
      {% endblock %}
      

      【讨论】:

        【解决方案4】:

        我编写了一个简单的脚本来递归地探索一个目录并找到所有 shpaml 文件并将它们转换为 *.htm。想我会分享它:

        #!/usr/bin/env python
        
        #===============================================================================
        # Recursively explore this entire directory, 
        # and convert all *.shpaml files to *.htm files.
        #===============================================================================
        
        import shpaml
        import os, glob
        
        count = 0
        
        def main():
            global count
            cwd = os.path.dirname(os.path.abspath(__file__))
            convert_and_iterate(cwd)
            print("Done. Converted "+str(count)+" SHPAML files.")
        
        def convert_and_iterate(path):
            global count
        
            for file in glob.glob(os.path.join(path,'*.shpaml')):
                #getting generic name
                file_basename = os.path.basename(file)
                gen_name = os.path.splitext(file_basename)[0]
        
                #opening shpaml file and converting to html
                shpaml_file = open(file)
                shpaml_content = shpaml_file.read()
                html_content = shpaml.convert_text(shpaml_content)
        
                #writing to *.htm
                html_file = open(os.path.join(path,gen_name+".htm"),"w")
                html_file.write(html_content)
        
                #incrementing count
                count += 1
        
            #transverse into deeper directories
            dir_list = os.listdir(path)
            for possible_dir in dir_list:
                if os.path.isdir(os.path.join(path,possible_dir)): 
                    convert_and_iterate(os.path.join(path,possible_dir))
        
        
        if __name__ == "__main__":
            main()
        

        【讨论】:

          猜你喜欢
          • 2019-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多