2013-03-09 13 views
7

Ich möchte folgendes restrukturiert Textausschnitt nehmen, die eine substitution definition enthält:Resolve Auswechslungen in RestructuredText

text = """ 

|python| 

.. |python| image:: python.jpg 
""" 

und zu lösen, die Definitionen so die Substitution Text angezeigt wird:

resolved_text = """ 
.. image:: python.jpg 

""" 

Gibt es eine Funktion oder Dienstprogramm in Docutils oder einem anderen Modul, das dies tun kann?

Antwort

2

docutils bietet publisher functions, um Docutils als Bibliothek zu verwenden.

So könnte docutils.core.publish_string eine Option für Ihren Anwendungsfall sein.

In [90]: from docutils import core 

In [91]: text = '|python|\n\n.. |python| image:: python.jpg\n' 

In [92]: print core.publish_string(text) 
<document source="<string>"> 
    <paragraph> 
     <image alt="python" uri="python.jpg"> 
    <substitution_definition names="python"> 
     <image alt="python" uri="python.jpg"> 

standardmäßig puplish_string verwendet einen pseudoxml Schriftsteller, die Sie in der Ausgabe sehen. Wenn Sie jedoch die einfache Textausgabe von Ihrer Frage haben möchten, benötigen Sie eine benutzerdefinierte Writer-Klasse, die von docutils.writers.Writer abgeleitet ist. Ich bin mir nicht sicher, wie dies zu implementieren ist, vielleicht könnte die SphinxTextWriter ein Ausgangspunkt sein.

Scheint, dass, wenn Sie wirklich nur die einfache Ersetzung benötigen, replace auf Ihrem Text wäre eine einfachere Lösung, wenn Sie kompliziertere Dinge benötigen, implementieren Sie dies mit Docutils ist auch kompliziert.

+0

Dank dafür funktionieren würde. Es sieht so aus, als wäre dies der einzige Ansatz, ich hatte gehofft, dass es etwas gibt, das bereits verfügbar ist, aber es scheint nicht so. – geographika

1

Werfen Sie einen Blick auf die Docutils Hacker's Guide. Es erklärt, wie Docutils funktioniert.

Sie könnten mit der Anwendung eines geeigneten Transform auf die Knotenstruktur, die durch Parsing der Eingabedatei generiert wird, kommen. Nach dem Anwenden der Transformation sollten Sie ein Writer Objekt verwenden, um ReStructuredText erneut auszugeben. Dieser Writer existiert noch nicht, also musst du ihn zuerst erstellen.

+0

Danke für den Ansatz. bmu expandierte hier etwas weiter. – geographika

1

nicht sicher, dass ich voll und ganz verstehe die Frage, aber hier ist ein Stich in der Extraktion mit Liste Verständnis:

extracted_line = [x for x in text.split("\n") if x[:2] == ".."][0] 
resolved_text = """{}""".format(extracted_line.replace("|python|","")) 

Sie benötigen eine gewisse Logik hinzufügen, wenn mehr als ein Auftreten des Unter def erwartet.

+0

Danke - das ist eine gute Lösung für ein paar Ersatz, aber ich hatte gehofft für eine robuste Lösung, die auf jeder ersten – geographika