Подтвердить что ты не робот

Замены внутри ссылок в reST/Sphinx

Я использую Sphinx для документирования веб-сервиса, который будет развернут на разных серверах. Документация заполнена примерами URL-адресов, которые пользователь может щелкнуть, и они должны просто работать. Моя проблема заключается в том, что корень хоста, порта и развертывания будет отличаться, и документация должна быть сгенерирована для каждого развертывания.

Я попытался определить такие подстановки следующим образом:

|base_url|/path
.. |base_url| replace:: http://localhost:8080

Но сгенерированный HTML не то, что я хочу (не содержит "/path" в сгенерированной ссылке):

<a href="#" onclick="location.href='http://localhost:8080'; return false;">http://localhost:8080</a>/path

Кто-нибудь знает, как обойти это?

4b9b3361

Ответ 1

Новое в Sphinx v1.0:

sphinx.ext.extlinks - Разметка для сокращения внешних ссылок

http://sphinx.pocoo.org/ext/extlinks.html

Расширение добавляет одно новое значение конфигурации:

extlinks

Это значение конфигурации должно быть словарем внешних сайтов, сопоставляя уникальные короткие псевдонимы с базовым URL-адресом и префиксом. Например, чтобы создать псевдоним для вышеупомянутых проблем, вы должны добавить

extlinks = {'issue': 
    ('http://bitbucket.org/birkenfeld/sphinx/issue/%s', 'issue ')}

Теперь вы можете использовать имя псевдонима в качестве новой роли, например. :issue:`123`. Затем вставляется ссылка на http://bitbucket.org/birkenfeld/sphinx/issue/123. Как вы можете видеть, цель, указанная в роли, заменяется в базовом URL-адресе вместо %s.

Заголовок ссылки зависит от второго элемента в кортеже, префикса:

Если префикс равен None, заголовок ссылки - полный URL. Если префикс является пустой строкой, заголовок ссылки - это частичный URL-адрес, указанный в содержании роли (в этом случае 123). Если префикс является непустой строкой, заголовок ссылки является частичным URL-адресом, добавленным префиксом - в приведенном выше примере заголовок ссылки будет выпуском 123. Вы также можете использовать обычный синтаксис "явного заголовка", поддерживаемый другими ролями, которые генерируют ссылки, т.е. :issue:`this issue <123>`. В этом случае префикс не имеет значения.

Ответ 2

Хорошо, вот как я это сделал. Во-первых, apilinks.py (расширение Sphinx):

from docutils import nodes, utils

def setup(app):
    def api_link_role(role, rawtext, text, lineno, inliner, options={},
                      content=[]):
        ref = app.config.apilinks_base + text
        node = nodes.reference(rawtext, utils.unescape(ref), refuri=ref,
                               **options)
        return [node], []
    app.add_config_value('apilinks_base', 'http://localhost/', False)
    app.add_role('apilink', api_link_role)

Теперь в conf.py добавьте 'apilinks' в список расширений и установите соответствующее значение для 'apilinks_base' (в противном случае по умолчанию будет 'http://localhost/'). Мой файл выглядит следующим образом:

extensions = ['sphinx.ext.autodoc', 'apilinks']
# lots of other stuff
apilinks_base = 'http://host:88/base/'

Использование:

:apilink:`path`

Вывод:

<a href="http://host:88/base/path">http://host:88/base/path</a>

Ответ 3

Вы можете написать Sphinx extension, который создает роль, например

:apilink:`path` 

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