Markupconverter...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich möchte gern einen Markup converter programmieren.

In PyLucid hatte ich lange Zeit mein tinyTextile genutzt, aber es hat so seine macken, die nur weg gehen würde, wenn ich das neu implementieren würde. Nun ist aber Creole fester Bestandteil von PyLucid und die Implementierung hat keine Fehler wie tinyTextile.

Also ein Konvertierer der von tinyTextile nach Creole umwandelt...

Nun frage ich mich, wie stelle ich das an?

Natürlich könnte ich die bestehenden TinyTextile RE Beuasteine nehmen und mit re.sub() schon eine Menge machen.

Auf der Anderen Seite könnte ich als Ausgangsmaterial nicht den Source-Markup-Text nehmen, sondern das erzeugte HTML und dann den html code durch einen Parser jagen und daraus wieder Creole Markup zaubern.
Das hätte den Vorteile, das man alle bestehenden Markup-Sprachen nach Creole wandeln könnte und nicht nur ein tinyTextile -> Creole ding...
Ich weiß allerdings noch nicht so ganz, wie ich das anstellen kann. Vielleicht HTMLParser ( http://docs.python.org/library/htmlparser.html ) nutzten?

Gibt es evtl. sowas schon?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich würde über den Umweg (X)HTML gehen. Erscheint mir einfacher und allgemeiner. Statt N Konvertern für N Eingabeformate brauchst du so nur einen Konverter.

Ich würde die Eingabe vorsichtshalber mit BeautifulSoup lesen und dann systematisch nach Überschriften, Absätzen und alles, was Creole noch so versteht untersuchen.

Treffe ich etwa auf ein <pre>, so nehme ich mir dessen Kinder, ersetze jedes <br> durch \n, ersetze jedes andere Element durch den Text, den es erhält, habe so einen String (hoffentlich würde BS da alle Entities bereits rausgeschmissen haben) und kann dann "{{{\n" + s + "\n}}}" in das Zieldokument einfügen. Die Doku von BS ist aber IMHO BS, sodass ich nicht auf Anhieb sehe, was für Möglichkeiten man dort im Detail hat.

Stefan
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich hab mal angefangen: http://paste.pocoo.org/show/92770/

Ab Zeile 213 hängt ein dicker unittest dran. Noch funktioniert aber nicht alles... Siehe TODO ab Zeile 567 unten.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab nochmal weiter gemacht: http://trac.pylucid.net/browser/trunk/p ... y?rev=1810

Aber ich denke das ist kein richtig guter Ansatz, auch wenn vieles schon geht.
Besser ist es wohl erstmal einen tree zu bauen und den dann abzuarbeiten.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sieht doch gar nicht schlecht aus. Denke allerdings auch, dass es einfacher wäre, über deinem DOM zu laufen als das SAX-ähnlich zu machen.

Stefan
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Was würdest du vorschlagen?

btw. es sollte mit Python 2.4 laufen und keine externen Abhängigkeiten haben. Es soll mal ein Plugin für PyLucid werden.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
lunar

jens hat geschrieben:btw. es sollte mit Python 2.4 laufen und keine externen Abhängigkeiten haben. Es soll mal ein Plugin für PyLucid werden.
Mmmh, ich hätte ja lxml.html vorgeschlagen, so aber würde ich dir zu BeautifulSoup raten. Das ist zwar ein externes Modul, aber im Gegensatz zu lxml.html ausschließlich in Python implementiert. Es hindert dich also nichts daran, es einfach mit PyLucid zusammen auszuliefern.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

jens hat geschrieben:Was würdest du vorschlagen?
Das etree-API ist nicht wirklich kompliziert nachzubauen. Vielleicht lässt du deinen Parser einfach Exemplare von z.B. dieser Klasse erzeugen:

Code: Alles auswählen

class Element(object):
  def __init__(self, tag, attrib=None, children=(), text=None):
    self.tag, self.attrib, self.children, self.text = tag, attrib or {}, list(children), text
    for child in children: child.parent = self
    self.tail = None
  def __iter__(self):
    return iter(self.children)
  def __getitem__(self, index):
    return self.children[index]
  def get(self, name, default=None):
    return self.attrib.get(name, default)
Einzig nervig ist, dass bei mixedmode-Dokumenten, tail gesetzt werden muss.

Stefan
Zuletzt geändert von sma am Samstag 29. November 2008, 11:57, insgesamt 1-mal geändert.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So, ich mache mal ein externes Projekt draus:
http://code.google.com/p/python-creole/

Darin kommen auch die Teile, die ich eigentlich in PyLucid schon drin hab.

EDIT: So nun ist auch die html2creole variante die einen baum erzeugt online: http://code.google.com/p/python-creole/ ... 2creole.py

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten