Как сохранить пробел в блоках шаблонов? - PullRequest
0 голосов
/ 05 января 2010

Я использую SHPAML (HAML для python) для Django, однако я сталкиваюсь с проблемами преобразования SHPAML -> HTML из-за проблем с пробелами при переопределении некоторых блоков, вот пример:

In 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. Как я могу предотвратить это и сохранить пробелы при расширении шаблона?

Ответы [ 4 ]

1 голос
/ 05 января 2010

Похоже, препроцессор SHPAML не вызывается ДО Django. Обычно я пишу все свои документы в SHPAML с расширением .shpaml, а затем конвертирую их в Django с расширением .html, а затем позволяю Django творить чудеса. Таким образом, вы захотите, чтобы операторы вроде «extends» и «include» ссылались на документ .html, который уже был предварительно обработан.

Ваш базовый документ shpaml будет выглядеть примерно так:

html
    body
        #main_page
            {% block body %}
            {% endblock %}

И тогда документ, который расширяет его, будет выглядеть примерно так:

{% extends 'base.html' %}
{% block body %}
    p
        This is a paragraph about {{ book }}...
{% endblock %}

И затем вы хотите предварительно обработать их ДО того, как Джанго их увидит. Я обычно препроцессирую их скриптом Python прямо перед выполнением «manage.py runserver».

1 голос
/ 05 января 2010

из документов:

беспространственен

Удаляет пробелы между тегами HTML. Это включает символы табуляции и новые строки.

Пример использования:

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

Этот пример вернул бы этот HTML:

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

Удален только пробел между тегами, но не пробел между тегами и текстом.

Вы также можете удалить лишние пробелы / переводы строк вручную, но это снизит читабельность шаблона.

0 голосов
/ 05 января 2010

Я написал простой скрипт для рекурсивного изучения каталога, поиска всех файлов 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()
0 голосов
/ 05 января 2010
           #maincontent

ASD

Вы имеете в виду смещение здесь? Ну, выровняйте ваш index.shpaml соответственно:

{% extends "includes/skeleton.shpaml" %}
{% block content %}
            asd
            .test
                .test2 | meh
{% endblock %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...