Как добавить начальные/конечные пробелы в моноширинный текст в Sphinx reStructuredText

Заголовок говорит сам за себя... это работает для создания моноширинного текста:

``foo``

но это не так:

`` foo``
``foo ``

Как я могу получить начальные/конечные пробелы в моноширинном тексте? (прежде чем кто-то процитирует мне проблему XY: это именно то, что я хочу, ни больше, ни меньше.)


person Jason S    schedule 25.08.2016    source источник


Ответы (3)


Грр. Похоже, для обходного пути требуется глупый хакерский подход Sphinx/docutils с настраиваемой ролью.

добавлено в conf.py:

import re
from docutils import nodes

tt_re = re.compile('^:tt:`\\|(.*)\\|`$')
def tt_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
    """
    Can be used as :tt:`|SOME_TEXT_HERE|`,
    where SOME_TEXT_HERE can include leading/trailing spaces
    """
    result = []
    m = tt_re.search(rawtext)
    if m:
        arg = m.group(1)
        result = [nodes.literal('', arg)]
    return result,[]

def setup(app):
    app.add_role('tt', tt_role)

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

this :tt:`|  ab12    |` is just like ``foobar`` except it can have leading/trailing spaces.

CSS для code.literal также должен иметь шрифт фиксированной ширины (по какой-то причине пробелы остаются вне блоков <span class="pre">) и использовать white-space: pre; или white-space: pre-wrap;.

person Jason S    schedule 25.08.2016
comment
АРХ! Это исключает пробелы из моноширинного шрифта. @#%!%#@$%$#@%! - person Jason S; 30.08.2016
comment
Грр, это вещь CSS. - person Jason S; 30.08.2016

Похоже, он работает с ZERO WIDTH SPACE при запуске в исходном коде.

Find the file in our Google Drive folder It is located at ``​   foo``

где это ``<zwspace><space><space><space>foo`` в источнике. Производит html:

<code class="docutils literal"><span class="pre">​</span>&#160;&#160; <span class="pre">foo</span></code>
person Community    schedule 06.03.2017

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

.. default-role:: literal

This is the paragraph with inline 
codes: `` foo``, `\  foo` and `\  foo \ `.

С sphinx-doc v1.7.4 я получаю следующий html-код::

<p>This is the paragraph with inline codes: `` foo``, <code class="docutils literal  notranslate"> <span class="pre">foo</span></code> and <code class="docutils literal notranslate"> <span class="pre">foo</span> </code>.</p>

Текст внутри двойных обратных кавычек вообще не интерпретируется, в то время как экранирование обратной косой черты выполняется для содержимого в одиночных обратных кавычках. default-role необходим для изменения роли по умолчанию с title-reference на literal.

person Anton T.    schedule 22.01.2019