Docutils-Markup-API¶
Dieser Abschnitt beschreibt die API zum Hinzufügen von reStructuredText-Markup-Elementen (Rollen und Direktiven).
Rollen¶
Rollen folgen der unten beschriebenen Schnittstelle. Sie müssen von einer Erweiterung mit Sphinx.add_role() oder Sphinx.add_role_to_domain() registriert werden.
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
Die Parameter options und content werden nur für benutzerdefinierte Rollen verwendet, die über die role-Direktive erstellt wurden. Der Rückgabewert ist ein Tupel aus zwei Listen, die erste enthält die Textknoten und Elemente der Rolle, und die zweite enthält alle generierten Systemmeldungen. Weitere Informationen finden Sie in der Übersicht zu benutzerdefinierten Rollen von Docutils.
Erstellen benutzerdefinierter Rollen¶
Sphinx bietet zwei Basisklassen für die Erstellung benutzerdefinierter Rollen: SphinxRole und ReferenceRole.
Diese stellen eine klassenbasierte Schnittstelle zur Erstellung von Rollen bereit, wobei die Hauptlogik in Ihrer run()-Methode implementiert werden muss. Die Klassen bieten eine Reihe nützlicher Methoden und Attribute wie self.text, self.config und self.env. Die Klasse ReferenceRole implementiert die Logik title <target> von Sphinx und stellt die Attribute self.target und self.title zur Verfügung. Dies ist nützlich für die Erstellung von Querverweis-Rollen.
Direktiven¶
Direktiven werden von Klassen verarbeitet, die von docutils.parsers.rst.Directive abgeleitet sind. Sie müssen von einer Erweiterung mit Sphinx.add_directive() oder Sphinx.add_directive_to_domain() registriert werden.
- class docutils.parsers.rst.Directive[Quelle]¶
Die Markup-Syntax der neuen Direktive wird durch die folgenden fünf Klassenattribute bestimmt
- required_arguments = 0¶
Anzahl der erforderlichen Direktivenargumente.
- optional_arguments = 0¶
Anzahl der optionalen Argumente nach den erforderlichen Argumenten.
- final_argument_whitespace = False¶
Darf das letzte Argument Leerzeichen enthalten?
- option_spec = None¶
Zuordnung von Optionsnamen zu Validierungsfunktionen.
Optionsvalidierungsfunktionen nehmen einen einzelnen Parameter entgegen, das Optionsargument (oder
None, wenn nicht angegeben), und sollten es validieren oder in die richtige Form konvertieren. Sie lösenValueErroroderTypeErroraus, um einen Fehler anzuzeigen.Es gibt mehrere vordefinierte und möglicherweise nützliche Validatoren im Modul
docutils.parsers.rst.directives.
- has_content = False¶
Darf die Direktive Inhalt haben?
Neue Direktiven müssen die Methode
run()implementieren- run()[Quelle]¶
Diese Methode muss die Direktivenargumente, Optionen und den Inhalt verarbeiten und eine Liste von Docutils/Sphinx-Knoten zurückgeben, die an der Stelle, an der die Direktive angetroffen wurde, in den Dokumentenbaum eingefügt werden.
Instanzattribute, die auf der Direktive immer gesetzt sind
- name¶
Der Name der Direktive (nützlich, wenn dieselbe Direktivenklasse unter mehreren Namen registriert wird).
- arguments¶
Die der Direktive übergebenen Argumente als Liste.
- options¶
Die der Direktive übergebenen Optionen als Wörterbuch, das Optionsnamen mit validierten/konvertierten Werten abbildet.
- content¶
Der Direktiveninhalt, falls angegeben, als
ViewList.
- lineno¶
Die absolute Zeilennummer, an der die Direktive erschien. Dies ist nicht immer ein nützlicher Wert; verwenden Sie stattdessen
srcline.
- content_offset¶
Interner Offset des Direktiveninhalts. Wird beim Aufruf von
nested_parse(siehe unten) verwendet.
- block_text¶
Der String, der die gesamte Direktive enthält.
Siehe auch
HOWTO zur Erstellung von Direktiven in der Docutils-Dokumentation
Parsen von Direktiven-Inhalt als reStructuredText¶
Viele Direktiven enthalten mehr Markup, das analysiert werden muss. Verwenden Sie hierfür eine der folgenden APIs aus der Methode run()
Die erste Methode analysiert den gesamten Inhalt der Direktive als Markup, während die zweite nur den angegebenen Text-String analysiert. Beide Methoden geben die analysierten Docutils-Knoten in einer Liste zurück.
Die Methoden werden wie folgt verwendet
def run(self) -> list[Node]:
# either
parsed = self.parse_content_to_nodes()
# or
parsed = self.parse_text_to_nodes('spam spam spam')
return parsed
Hinweis
Die obigen Hilfsmethoden wurden in Sphinx 7.4 hinzugefügt. Vor Sphinx 7.4 sollten die folgenden Methoden zum Parsen von Inhalten verwendet werden
self.state.nested_parsesphinx.util.nodes.nested_parse_with_titles()– dies ermöglicht Titel im analysierten Inhalt.
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
Zum Parsen von Inline-Markup verwenden Sie parse_inline(). Dies darf nur für Text verwendet werden, der eine einzelne Zeile oder einen Absatz darstellt und keine strukturellen Elemente (Überschriften, Übergänge, Direktiven usw.) enthält.
Hinweis
sphinx.util.docutils.switch_source_input() ermöglicht die Änderung der Quelle (Eingabedatei) während des Parsens von Inhalt in einer Direktive. Dies ist nützlich für das Parsen von gemischtem Inhalt, wie z. B. in sphinx.ext.autodoc, wo es zum Parsen von Docstrings verwendet wird.
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)
Veraltet seit Version 1.7: Bis Sphinx 1.6 wurde dafür sphinx.ext.autodoc.AutodocReporter verwendet. Es wurde durch switch_source_input() ersetzt.
ViewLists und StringLists¶
Docutils stellt Dokumentenquellzeilen in der Klasse StringList dar, die von ViewList erbt, beide im Modul docutils.statemachine. Dies ist eine Liste mit erweiterter Funktionalität, einschließlich der Tatsache, dass Slicing Ansichten der ursprünglichen Liste erstellt und dass die Liste Informationen über Quellzeilennummern enthält.
Das Attribut Directive.content ist eine StringList. Wenn Sie Inhalt generieren, der als reStructuredText geparst werden soll, müssen Sie eine StringList für die Docutils-APIs erstellen. Die von Sphinx bereitgestellten Hilfsfunktionen erledigen dies automatisch. Wichtig für die Inhaltserstellung sind die folgenden Punkte
Der Konstruktor von
ViewListnimmt eine Liste von Strings (Zeilen) und einen Quell-(Dokumenten-)Namen entgegen.Die Methode
ViewList.append()nimmt ebenfalls eine Zeile und einen Quellennamen entgegen.