Генши: для цикла вставляет разрывы строк

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

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).

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

  • Чтение документации Genshi.
  • Поиск в 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(), экранируется после того, как происходит возврат.

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


person ErikusMaximus    schedule 06.11.2018    source источник


Ответы (1)


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

<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/fighting-the-space-between-inline-block-elements/

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

person ErikusMaximus    schedule 12.11.2018