Markupconverter...

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

Dienstag 18. November 2008, 17:58

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?

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

Samstag 22. November 2008, 10:55

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
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 27. November 2008, 13:44

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.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 27. November 2008, 18:31

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.

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

Donnerstag 27. November 2008, 19:46

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
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 27. November 2008, 20:14

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.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
lunar

Donnerstag 27. November 2008, 20:51

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

Freitag 28. November 2008, 10:32

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
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 28. November 2008, 15:58

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten