2013-03-09 9 views
7

Chcę podjąć następujące zreorganizowana fragment tekstu, który zawiera substitution definition:Resolve Zastępstwa w reStructuredText

text = """ 

|python| 

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

i rozwiązać definicje więc wyświetlany jest tekst podstawienie:

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

""" 

Czy istnieje funkcja lub narzędzie w docutils lub innym module, który może to zrobić?

Odpowiedz

2

docutils zapewnia publisher functions używać docutils jako biblioteki.

Używanie docutils.core.publish_string może być opcjonalną opcją do użycia.

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"> 

Domyślnie puplish_string używa pseudoxml pisarz, który można zobaczyć na wyjściu. Jednak jeśli naprawdę chcesz mieć wydrukowany tekst w pytaniu, potrzebujesz niestandardowej klasy programu piszącego pochodzącej z docutils.writers.Writer. Nie jestem pewien, jak to zaimplementować, być może SphinxTextWriter może być punktem wyjścia. Wygląda na to, że jeśli naprawdę potrzebujesz tylko prostego zamiennika, użycie w tekście tekstu replace byłoby prostszym rozwiązaniem, jeśli potrzebujesz bardziej skomplikowanych rzeczy, zaimplementuj to za pomocą docutils również jest skomplikowane.

+0

. Dzięki za to. Wygląda na to, że jest to jedyne podejście do podjęcia, miałem nadzieję, że będzie coś już dostępnego, ale wydaje się, że nie. – geographika

1

Spójrz na Docutils Hacker's Guide. Wyjaśnia, jak działa docutils.

Możesz uciec, stosując odpowiednie drzewo Transform do drzewa węzłów, które jest generowane podczas analizowania pliku wejściowego. Po zastosowaniu transformacji powinieneś użyć obiektu Writer do ponownego wydania ReStructuredText. Ten pisarz jeszcze nie istnieje, więc musisz go najpierw utworzyć.

+0

Dzięki za podejście. bmu rozszerzyło się nieco dalej. – geographika

1

Nie jestem pewien, że w pełni rozumiem pytanie, ale tutaj jest stab na ekstrakcji za pomocą listowych:

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

Musisz dodać trochę logiki, jeśli więcej niż jeden wystąpienie def sub jest spodziewany.

+0

Dzięki - to jest dobre rozwiązanie dla kilku zamienników, ale liczyłem na solidne rozwiązanie, które zadziałałoby na każdym pierwszym – geographika

Powiązane problemy