Генши: для циклов вставки разрывов строк - PullRequest
0 голосов
/ 06 ноября 2018

Исходный код: У меня есть следующая программа.

import genshi
from genshi.template import MarkupTemplate

html = '''
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://genshi.edgewall.org/">
        <head>
        </head>
        <body>
            <py:for each="i in range(3)">
                <py:choose>
                    <del py:when="i == 1">
                        ${i}
                    </del>
                    <py:otherwise>
                        ${i}
                    </py:otherwise>
                </py:choose>
            </py:for>
        </body>
    </html>
'''

template = MarkupTemplate(html)
stream = template.generate()
html = stream.render('html')

print(html)

Ожидаемый результат: числа печатаются последовательно без пробелов (и, что наиболее важно, без разрыва строки) между ними.

<html>
    <head>
    </head>
    <body>
            0<del>1</del>2
    </body>
</html>

Фактический вывод: Выводит следующее:

<html>
    <head>
    </head>
    <body>
            0
            <del>1</del>
            2
    </body>
</html>

Вопрос: Как устранить разрывы строк? Я могу справиться с лидирующим пробелом, убрав его из окончательного HTML, но я не знаю, как избавиться от разрывов строк. Мне нужно, чтобы содержимое цикла for отображалось как одно непрерывное «слово» (например, 012 вместо 0 \n 1 \n 2).

Что я пробовал:

  • Чтение документации Генши.
  • Поиск StackOverflow
  • Поиск в Google
  • Использование кодового блока <?python ...code... ?>. Это не работает, поскольку экранированные и отображаемые каретки в тегах <del>.

    <?python
        def numbers():
            n = ''
            for i in range(3):
                if i == 1:
                    n += '<del>{i}</del>'.format(i=i)
                else:
                    n += str(i)
            return n
    ?>
    ${numbers()}
    

    Производит 0&lt;del&gt;1&lt;/del&gt;2 Я также попробовал это, но вместо этого использовал genshi.builder.Element('del'). Результаты совпадают, и я смог окончательно определить, что строка, возвращаемая numbers(), экранируется после того, как происходит возврат.

  • Куча других вещей, которые я сейчас не могу вспомнить.

1 Ответ

0 голосов
/ 12 ноября 2018

Не идеально, но я наконец нашел приемлемое решение. Хитрость заключается в том, чтобы поместить закрывающую карету для данного тега на следующей строке непосредственно перед открывающей кареткой следующего тега.

<body>
    <py:for each="i in range(3)"
        ><py:choose
            ><del py:when="i == 1">${i}</del
            ><py:otherwise>${i}</py:otherwise
        ></py:choose
    </py:for>
</body>

Источник: https://css -tricks.com / боевые действия в пространстве между строковыми элементами блока /

Если у кого-то есть лучший подход, я бы с удовольствием его услышал.

...