Создание именованной ссылки на директиву - PullRequest
0 голосов
/ 06 января 2020

Я создаю пользовательскую директиву, которая наследует Admonition и хотела бы включить именованную ссылку, используя :ref:`some_label`, которая принимает название директивы в качестве отображаемого имени ссылки, почти так же, как на рисунках используется текст заголовка как отображаемое имя.

Мне не удалось воспроизвести способ, которым директивы Figure () или Image () делают это в директиве admonition. Я могу заставить его работать с добавлением узла раздела, но это вызывает дублирование заголовка.

Я ищу простое решение, которое решит приведенный ниже вариант использования:

Some reference to :ref:`policy_one`. 

.. _policy_one

.. policy Some policy title

   text

Следует отобразить как:

Некоторая ссылка на Политика - Некоторая часть названия политики .

Я часто получаю сообщение об ошибке

undefined label: policy_one (if the link has no caption the label must precede a
section header)

Код

Моя простая директива политики, которая не работает:

class PolicyDirective(directives.admonitions.Admonition):

    def run(self): 
        self.options['class'] = ['policy']
        return super().run()

Реорганизация Admonition, которая работает, но вызывает дублирование названий:

class PolicyDirective(directives.admonitions.Admonition):

    def run(self):
        set_classes(self.options)
        self.assert_has_content()
        text = '\n'.join(self.content)
        admonition_node = self.node_class(text, **self.options)
        self.add_name(admonition_node)

        if self.node_class is nodes.admonition:
            title_text = 'Policy - ' + self.arguments[0]
            textnodes, messages = self.state.inline_text(title_text,
                                                         self.lineno)
            title = nodes.title(title_text, '', *textnodes)
            title.source, title.line = (
                    self.state_machine.get_source_and_line(self.lineno))
            admonition_node += title
            admonition_node += messages

            section = nodes.section()
            section += title

            if not 'classes' in self.options:
                admonition_node['classes'] += ['admonition-' +
                                               nodes.make_id(title_text)]
        self.state.nested_parse(self.content, self.content_offset,
                                admonition_node)
        return [section, admonition_node]
...