Schöner Schreiben
Posted by Jesco Freund at Nov. 29, 2009 11:32 p.m.
reStructuredText und Pygments sind ein prima Gespann. Mit ihnen kann man z. B. Blog-Inhalte oder Wiki-Seiten rendern, oder gleich ein komplettes Dokumentationspaket bauen. Ich selbst verwende das Pärchen gerade für den Rewrite meiner Homepage. Dabei ist mir allerdings aufgefallen, dass der rst-Renderer leider keine typographischen Zeichen rendert, also z. B. aus – ein – macht oder typographische Anführungszeichen („“ statt „“) erzeugt.
Das ließe sich eigentlich mit einfachen .replace()-Aufrufen auf dem Rendering-Ergebnis nachrüsten – allerdings geht das nicht mehr, sobald mit Pygments gehighlightete Code-Blöcke (oder andere unformatierte Blöcke) mit von der Partie sind. Aber hey, es ist doch Python! Mit ein bisschen Code funktioniert das nachträgliche Umschreiben recht gut:
from docutils.core import publish_parts
# Diese einfache Ersetzen-Funktion erstzt hier im Beispiel nur
# -- und ---, könnte aber ohne weiteres erweitert werden.
def ent_replace(text):
text = text.replace(" -- ", " – ")
text = text.replace(" --- ", " — ")
return text
# Diese Funktion wird mit dem ReStructuredText-Input gefüttert
# und übernimmt das Aufrufen der docutils-Funktionen
def render(text):
parts = publish_parts(source=text, writer_name='html')
frags = parts['html_body'].split('<pre>')
content = ent_replace(frags.pop(0))
for snatch in frags:
content += "<pre>"
content += snatch.split('</pre>')[0]
content += "</pre>"
content += ent_replace(snatch.split('</pre>')[1])
return content
Zur Erklärung: Die render()-Funktion splittet das von publish_parts() gelieferte Ergebnis anhand der <pre>-Tags auf. Das erste Element der so entstehenden Liste ist grundsätzlich kein Preformatted Text – dies wird durch den HTML Writer aus den docutils gewährleistet. Das erste Element kann daher unbesehen aus der Liste entfernt und an die Ersetzen-Funktion verfüttert werden; das Ergebnis wird als Startwert für den Rückgabewert festgehalten.
Die verbleibenden Elemente in der Liste (frags) bestehen nun immer aus einem Anfangsteil Preformatted Text, dem abschließenden </pre>-Tag und ggf. einem Rest „normalem“ Text. Jedes der verbleibenden Elemente muss nun anhand von </pre> erneut gesplittet werden. Der vordere Teil des Split-Ergebnis' muss dabei unverändert an den Rückgabewert angehängt werden (die zugehörigen Tags müssen jedoch wieder ergänzt werden, da sie durch den Split verloren gehen), während der jeweils hintere Teil vorher einmal die Ersetzen-Funktion passieren muss.
No comments | Defined tags for this entry: code, python
Comments
No comments

Content is subject to the conditions of the