API de marcações do Docutils¶
Esta seção descreve a API para adicionar elementos de marcação reStructuredText (papéis e diretivas).
Papéis¶
Os papéis seguem a interface descrita abaixo. Eles devem ser registrados por uma extensão usando Sphinx.add_role() ou Sphinx.add_role_to_domain().
def role_function(
role_name: str, raw_source: str, text: str,
lineno: int, inliner: Inliner,
options: dict = {}, content: list = [],
) -> tuple[list[Node], list[system_message]]:
elements = []
messages = []
return elements, messages
Os parâmetros options e content são usados apenas para papéis personalizados criados através da diretiva role. O valor de retorno é uma tupla de duas listas, a primeira contendo os nós de texto e os elementos do papel, e a segunda contendo quaisquer mensagens do sistema geradas. Para obter mais informações, consulte a visão geral de papel personalizado do Docutils.
Criando papéis personalizados¶
O Sphinx fornece duas classes base para a criação de papéis personalizados, SphinxRole e ReferenceRole.
Eles fornecem uma interface baseada em classes para criação de papéis, onde a lógica principal deve ser implementada em seu método run(). As classes fornecem vários métodos e atributos úteis, como self.text, self.config e self.env. A classe ReferenceRole implementa a lógica título <alvo> do Sphinx, expondo os atributos self.alvo e self.título. Isto é útil para criar papéis de referência cruzada.
Diretivas¶
As diretivas são tratadas por classes derivadas de docutils.parsers.rst.Directive. Eles devem ser registrados por uma extensão usando Sphinx.add_directive() ou Sphinx.add_directive_to_domain().
- class docutils.parsers.rst.Directive[código-fonte]¶
A sintaxe de marcação da nova diretiva é determinada pelos cinco atributos de classe a seguir:
- required_arguments = 0¶
Número de argumentos de diretiva necessários.
- optional_arguments = 0¶
Número de argumentos opcionais após os argumentos obrigatórios.
- final_argument_whitespace = False¶
O argumento final pode conter espaços em branco?
- option_spec = None¶
Mapeamento de nomes de opções para funções validadoras.
As funções validadoras de opções recebem um único parâmetro, o argumento da opção (ou
Nonese não for fornecido), e devem validá-lo ou convertê-lo para o formato apropriado. Eles levantamValueErrorouTypeErrorpara indicar falha.Existem vários validadores predefinidos e possivelmente úteis no módulo
docutils.parsers.rst.directives.
- has_content = False¶
A diretiva pode ter conteúdo?
Novas diretivas devem implementar o método
run():- run()[código-fonte]¶
Este método deve processar os argumentos, opções e conteúdo da diretiva e retornar uma lista de nós Docutils/Sphinx que serão inseridos na árvore do documento no ponto onde a diretiva foi encontrada.
Os atributos de instância que são sempre definidos na diretiva são:
- name¶
O nome da diretiva (útil ao registrar a mesma classe de diretiva com vários nomes).
- arguments¶
Os argumentos apresentados à diretiva, em forma de lista.
- options¶
As opções dadas à diretiva, como uma opção de mapeamento de dicionário, nomeiam para valores validados/convertidos.
- content¶
O conteúdo da diretiva, se fornecido, como
ViewList.
- lineno¶
O número absoluto da linha em que a diretiva apareceu. Este nem sempre é um valor útil; use
srclineem vez disso.
- content_offset¶
Deslocamento interno do conteúdo da diretiva. Usado ao chamar
nested_parse(veja abaixo).
- block_text¶
A string que contém toda a diretiva.
Ver também
HOWTO Creating directives da documentação do Docutils
Analisando o conteúdo da diretiva como reStructuredText¶
Muitas diretivas conterão mais marcações que devem ser analisadas. Para fazer isso, use uma das seguintes APIs do método run():
O primeiro método analisa todo o conteúdo da diretiva como marcação, enquanto o segundo analisa apenas a string text fornecida. Ambos os métodos retornam os nós Docutils analisados em uma lista.
Os métodos são usados como demonstrado a seguir.
def run(self) -> list[Node]:
# either
parsed = self.parse_content_to_nodes()
# or
parsed = self.parse_text_to_nodes('spam spam spam')
return parsed
Nota
Os métodos utilitários acima foram adicionados no Sphinx 7.4. Antes do Sphinx 7.4, os seguintes métodos deviam ser usados para analisar o conteúdo:
self.state.nested_parsesphinx.util.nodes.nested_parse_with_titles()essa isso permite títulos no conteúdo analisado.
def run(self) -> list[Node]:
container = docutils.nodes.Element()
# either
nested_parse_with_titles(self.state, self.result, container, self.content_offset)
# or
self.state.nested_parse(self.result, self.content_offset, container)
parsed = container.children
return parsed
Para analisar a marcação em linha, use parse_inline(). Deve ser utilizado apenas para textos que sejam de uma única linha ou parágrafo e não contenham quaisquer elementos estruturais (títulos, transições, diretivas, etc.).
Nota
sphinx.util.docutils.switch_source_input() permite alterar o arquivo fonte (entrada) durante a análise do conteúdo de uma diretiva. É útil analisar conteúdo misto, como em sphinx.ext.autodoc, onde é usado para analisar docstrings.
from sphinx.util.docutils import switch_source_input
from sphinx.util.parsing import nested_parse_to_nodes
# Switch source_input between parsing content.
# Inside this context, all parsing errors and warnings are reported as
# happened in new source_input (in this case, ``self.result``).
with switch_source_input(self.state, self.result):
parsed = nested_parse_to_nodes(self.state, self.result)
Descontinuado desde a versão 1.7: Até o Sphinx 1.6, sphinx.ext.autodoc.AutodocReporter era usado para este propósito. Ele foi substituído por switch_source_input().
ViewLists e StringLists¶
Docutils representa as linhas fonte do documento em uma classe StringList, que herda de ViewList, ambas no módulo docutils.statemachine. Esta é uma lista com funcionalidade estendida, incluindo que o fatiamento cria visualizações da lista original e que a lista contém informações sobre os números das linhas do código-fonte.
O atributo Directive.content é um StringList. Se você gerar conteúdo para ser analisado como reStructuredText, você terá que criar um StringList para as APIs do Docutils. As funções utilitárias fornecidas pelo Sphinx tratam disso automaticamente. Importantes para a geração de conteúdo são os seguintes pontos:
O construtor de
ViewListrecebe uma lista de strings (linhas) e um nome de origem (documento).O método
ViewList.append()leva uma linha e um nome de origem também.