0

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

在骨架.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 中的下一行。如何通过模板扩展来防止这种情况并保留空格?

4

4 回答 4

1

来自文档:

无空间

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

示例用法:

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

此示例将返回此 HTML:

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

只有标签之间的空格被删除——而不是标签和文本之间的空格。

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

于 2010-01-04T21:50:16.903 回答
1

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

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

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

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

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

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

于 2010-01-04T22:25:54.627 回答
0
           #maincontent

asd

你的意思是这里的错位?那么,相应地对齐你的 index.shpaml :

{% extends "includes/skeleton.shpaml" %}
{% block content %}
            asd
            .test
                .test2 | meh
{% endblock %}
于 2010-01-04T22:16:09.497 回答
0

我编写了一个简单的脚本来递归地探索一个目录并找到所有 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()
于 2010-01-05T11:44:08.293 回答