PyKWiki ein Python Wiki

Präsentation und Organisation von eigenen Projekten
Antworten
Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

PyKWiki ein Python Wiki

Beitrag von Jside » Fr Nov 12, 2010 4:54 am

Hi,

Ich hab neulich mal angefangen eine Wikisoftware in Python zu schreiben, diese hat vorallem folgendes im Fokus:
- Keine SQL Datenbanken zu benutzen, stattdessen MongoDB(http://mongodb.org)
- Kein gro[ss]es Webframework(django, turbo gears etc.) zu benutzen sondern das minimalistische web.py (http://webpy.org/)
- MediaWiki kompatiblen Syntax zu haben
- Generell ehr auf die selben sachen wie Mediawiki fokussiert zu sein.

Mein Wikiparser kann schon einiges bis auf Externe Links, Templates, Tabellen und Listen verarbeiten, Interlinks in allen Formen wie sie in MediaWikis vorkommen kann er vollstaendig parsen und aufloesen, er kann halt nur nicht herausfinden, ob der Artikel dahinter auch existent ist, da ich mit dem Artikelmanagment nochnicht angefangen habe. Da dieser code aber teilweise schlecht designt war hab ich mich dazu entschlossen neu anzufangen und suche auchnoch mitstreiter, also falls wer Interesse hat, eine PN an mich mich gewuenschten Benutzer und Passwort fuer den SVN server.
Zum entwickeln wird MongoDB und pymongo und lxml(um XSS gegenzuwirken) gebraucht, wenn nicht installiert einfach via aptitude installieren, braucht kein Setup.

Webserver braucht ihr auchnicht, web.py hat einen eingebauten webserver einfach die index.py mit python ausfuerhren(bzw stellvertretend run.sh ausfuehren) - ich hab jedoch einen echten zur Entwicklung laufen.

Derzeitiger Code hier:

Code: Alles auswählen

svn co svn://194.88.179.228 PyKWiki
BSD Lizens

Ich bin gerade dabei den Parser neu zu schreiben...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: PyKWiki ein Python Wiki

Beitrag von Xin » Fr Nov 12, 2010 10:31 am

Jside hat geschrieben:Ich hab neulich mal angefangen eine Wikisoftware in Python zu schreiben, diese hat vorallem folgendes im Fokus:
- Keine SQL Datenbanken zu benutzen, stattdessen MongoDB(http://mongodb.org)
- Kein gro[ss]es Webframework(django, turbo gears etc.) zu benutzen sondern das minimalistische web.py (http://webpy.org/)
- MediaWiki kompatiblen Syntax zu haben
- Generell ehr auf die selben sachen wie Mediawiki fokussiert zu sein.
Kannst Du mich zum Thema MongoDB etwas auf's Laufende bringen?
Jside hat geschrieben:Da dieser code aber teilweise schlecht designt war hab ich mich dazu entschlossen neu anzufangen
Eine mutige Entscheidung, aber eine richtige. Wenn man ein Problem erkennt, schafft man es aus der Welt, statt sich Altlasten zu schaffen. :-)
Jside hat geschrieben:und suche auchnoch mitstreiter, also falls wer Interesse hat, eine PN an mich mich gewuenschten Benutzer und Passwort fuer den SVN server.
Würde ich nicht selbst ein Wiki schreiben und Zeit haben, würde ich ja glatt mal meine Python-Kenntnisse erweitern wollen :-)

Aus eigener Erfahrung weiß ich, dass es ein schönes Projekt ist. :-)

Wie implementierst Du den Parser?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: PyKWiki ein Python Wiki

Beitrag von Jside » Fr Nov 12, 2010 11:22 am

Xin hat geschrieben:
Jside hat geschrieben:Ich hab neulich mal angefangen eine Wikisoftware in Python zu schreiben, diese hat vorallem folgendes im Fokus:
- Keine SQL Datenbanken zu benutzen, stattdessen MongoDB(http://mongodb.org)
- Kein gro[ss]es Webframework(django, turbo gears etc.) zu benutzen sondern das minimalistische web.py (http://webpy.org/)
- MediaWiki kompatiblen Syntax zu haben
- Generell ehr auf die selben sachen wie Mediawiki fokussiert zu sein.
Kannst Du mich zum Thema MongoDB etwas auf's Laufende bringen?
Eine Dokument basierende Datenbank, dort kann man direkt JSON Objekte reinschieben, diese muessen aber nicht gleich sein, daher wenn du z.b. Bildinformationen reinschiebst, aber keine Tags gegeben sind kannst du die Tags einfach auslassen, oder generell kannst du die Tags einfach in ein Array innerhalb des JSON Objektes reinschreiben und das wird dann so gespeichert(anstatt irgendwelchen ID verwaist auf andere Inhalte aus anderen Tabellen chaos wie bei SQL), alternativ gibt es auch CouchDB aber ich hab mich halt zur MongoDB entschlossen... MondoDB Teilt jedem "Dokument" automatisch eine ID zu(kann man aber auch selber uebernehmen).

Das Python Interface von MongoDB nimmt Python dicts an, daher brauch ich nichtmahl die Membervariablen einzeln abzutippen (im Gegenteil ich hab eine zu entfernen - naemlich die ID) sondern kann einfach die __dict__ funktion nehmen, was sehr viele Vorteile hat. Abgesehen davon das wo SQL ehr dafuer gemacht ist auf einem (Gro[ss]))Rechner zu laufen die NoSQL Datenbanken ihre Staerke in Clustern haben.
Wie implementierst Du den Parser?
Derzeit Regex welche beim Pattern matching(re.sub siehe python re manual) eine funktion triggert, die in einer Lookuptable nachschaut ob dafuer ein Handler da ist und dann halt diesen Handler ausfuerhrt, welcher dann halt den Formattierten Text zurueckgibt(oder irgendwelche Tags). Funktioniert bei der DokuWiki aehnlich, bei der MediaWiki glaubisch genauso - sofern ich den PHP Code richtig deuten kann. Zeile 94 in PyKWiki/Parser.py:

Code: Alles auswählen

        self.registerHandler('(?P<style>\'{2,4})', 'style', self.styleHandler)
duerfte alles aussagen... Probleme gibt es natuerlich noch mit laengeren Tags(z.b. <pre>, <code>(zwischen denen nicht formatiert werden sollte)) aber dafuer werde ich noch NestingLevel einfuehren, aber immerhinn kann der Parser derzeit bereits Heading, bold/italic und Interwikilinks die 100% Kompatibel zur MediaWiki sind verarbeiten (siehe Beispiel unter Test/parser_test.py) Dafuer dass ich am Parser nur 10 Minuten drangessesen habe auch schonmal ein guter Anfang ist...(zumindets hoffe ich das mal *gg*) :mrgreen:

Dominik
Beiträge: 381
Registriert: Mo Jul 07, 2008 9:39 pm

Re: PyKWiki ein Python Wiki

Beitrag von Dominik » Sa Nov 13, 2010 12:10 pm

Warum baust du es nicht gleich auf Adaptern auf das man nicht an eine spezielle Datenbank gebunden ist?
Rechtschreibefehler sind gewollt und dienen der Unterhaltung

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: PyKWiki ein Python Wiki

Beitrag von Xin » So Nov 14, 2010 12:22 pm

Jside hat geschrieben:Eine Dokument basierende Datenbank, dort kann man direkt JSON Objekte reinschieben, diese muessen aber nicht gleich sein, daher wenn du z.b. Bildinformationen reinschiebst, aber keine Tags gegeben sind kannst du die Tags einfach auslassen, oder generell kannst du die Tags einfach in ein Array innerhalb des JSON Objektes reinschreiben und das wird dann so gespeichert(anstatt irgendwelchen ID verwaist auf andere Inhalte aus anderen Tabellen chaos wie bei SQL), alternativ gibt es auch CouchDB aber ich hab mich halt zur MongoDB entschlossen... MondoDB Teilt jedem "Dokument" automatisch eine ID zu(kann man aber auch selber uebernehmen).
Wie wird das ganze strukturiert?
Wie werden Referenzen verwaltet, wenn mehrere Objekte auf ein gemeinsames Objekt zeigen?
Jside hat geschrieben:Das Python Interface von MongoDB nimmt Python dicts an, daher brauch ich nichtmahl die Membervariablen einzeln abzutippen (im Gegenteil ich hab eine zu entfernen - naemlich die ID) sondern kann einfach die __dict__ funktion nehmen, was sehr viele Vorteile hat. Abgesehen davon das wo SQL ehr dafuer gemacht ist auf einem (Gro[ss]))Rechner zu laufen die NoSQL Datenbanken ihre Staerke in Clustern haben.
Solange man nicht Wikipedia aufbaut, ist ein 10 Jahre alter Rechner ein Großrechner.
Jside hat geschrieben:
Wie implementierst Du den Parser?
Derzeit Regex
Das ist natürlich eine Bremse im System. Wobei ich derzeit hier auch noch keine brauchbare Optimierung betreibe. ^^
Jside hat geschrieben:Funktioniert bei der DokuWiki aehnlich, bei der MediaWiki glaubisch genauso - sofern ich den PHP Code richtig deuten kann.
Was Dokuwiki angeht, habe ich das auch schon gesehen. Für proggen.org mit ein Grund es anders zu machen. Ich hoffe doch, dass proggen.org auf kurz oder lang sich RegEx nicht mehr leisten kann. Ich habe derzeit einfach einfach eine Liste, die ich prüfe, ob ich gerade an einem Item angekommen bin, dass ich parsen sollte, aber über ein Interface gekapselt, hinter das ich Hashs positionieren werde. ;-)
Jside hat geschrieben:aber immerhinn kann der Parser derzeit bereits Heading, bold/italic und Interwikilinks die 100% Kompatibel zur MediaWiki sind verarbeiten (siehe Beispiel unter Test/parser_test.py) Dafuer dass ich am Parser nur 10 Minuten drangessesen habe auch schonmal ein guter Anfang ist...(zumindets hoffe ich das mal *gg*) :mrgreen:
Da habe ich länger dran gesessen und bin etwa auf dem gleichen Stand, bis auf dass ich Interwiki nicht implementiert habe.
Der Parser läuft soweit, aber der kann überhaupt nichts. Alles - inkl. Bold usw. - ist als Plugins implementiert.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: PyKWiki ein Python Wiki

Beitrag von Jside » So Nov 14, 2010 1:19 pm

Warum baust du es nicht gleich auf Adaptern auf das man nicht an eine spezielle Datenbank gebunden ist?
\
Hab da derzeit keine Lust drauf, aber es nimmt ja dicts an, genau wie die CouchDB Driver daher kann man ohne weitere Probleme schnell nen Wrapper proggen, wenn benoetigt, da ich keinen solchen Wrapper kenne....
Xin hat geschrieben:
Jside hat geschrieben:Eine Dokument basierende Datenbank, dort kann man direkt JSON Objekte reinschieben, diese muessen aber nicht gleich sein, daher wenn du z.b. Bildinformationen reinschiebst, aber keine Tags gegeben sind kannst du die Tags einfach auslassen, oder generell kannst du die Tags einfach in ein Array innerhalb des JSON Objektes reinschreiben und das wird dann so gespeichert(anstatt irgendwelchen ID verwaist auf andere Inhalte aus anderen Tabellen chaos wie bei SQL), alternativ gibt es auch CouchDB aber ich hab mich halt zur MongoDB entschlossen... MondoDB Teilt jedem "Dokument" automatisch eine ID zu(kann man aber auch selber uebernehmen).
Wie wird das ganze strukturiert?
Wie werden Referenzen verwaltet, wenn mehrere Objekte auf ein gemeinsames Objekt zeigen?

Garnicht entweder du schreibst alles in ein Objekt(was ja wiederum sub Obekte haben kann) oder du machts auf den SQL way(halt quasi ID verwaist auf andere ID). Sind uebrigends BSON nicht JSON objekte, CouchDB ist die von beiden mit JSON verwechsle ich immer... Das mit den IDs hatte ich ehr so in Form von du hast irgendwie ne Table mit id, key, value wo key ein Variablenname, Value - ist klar und id auf irgendein einen anderen Eintrag verwaist, und du dann quasi fuer irgendwelche Parameter sowas wie SELECT * FROM properties WHERE id=7 veranstaltest, wie es anscheinend die MediaWiki derzeit macht: http://www.mediawiki.org/wiki/Manual:Page_props_table und http://www.mediawiki.org/wiki/Manual:Us ... ties_table was bei X Millionen Seiten und X Millionen usern bestimmt ganz witzig ist - zumindets nicht fuer den DB server... Bei Document NoSQL Datenbanken kannst du halt alles zum Objekt reinschieben z.b. ein Array mit subobjekten:

Code: Alles auswählen

{ 
    "test" : 1, 
    "vars" : [  { "a" : 1 }, { "b" : 1 }  ]
}
Kann natuerlich auch einen massiven overhead erzeugen wenn man dann die Querys nicht praezise auf das eingrenzt was man denn ueberhaupt auslesen moechte.

das Problem dabei ist aber noch, das - und ich hab mir die Sources von MongoDB nochnicht angeschaut - ich nicht glaube das MongoDB so schlau ist zu merken, das z.b. alle Artikel Objekte/Daten bei mir einen "Title" haben und diese Zeichenkette(also der Key Title) auf einen Pointer im RAM zu bringen oder so aehnlich zu speichern, was dann natuerlich gerade auch massiv HDD Speicherplatz brauche kann...
Xin hat geschrieben:
Jside hat geschrieben:Das Python Interface von MongoDB nimmt Python dicts an, daher brauch ich nichtmahl die Membervariablen einzeln abzutippen (im Gegenteil ich hab eine zu entfernen - naemlich die ID) sondern kann einfach die __dict__ funktion nehmen, was sehr viele Vorteile hat. Abgesehen davon das wo SQL ehr dafuer gemacht ist auf einem (Gro[ss]))Rechner zu laufen die NoSQL Datenbanken ihre Staerke in Clustern haben.
Solange man nicht Wikipedia aufbaut, ist ein 10 Jahre alter Rechner ein Großrechner.
"Rechner" waren aber vor ca 20 Jahren Gro[ss]rechner, vor 10 Jahren waren Gro[ss]rechner Supercomputer zumindest in meiner Betrachtung...

Die Wiki Software benutzt ab jetzt Jinja2 als Template Engine, da mir die web.py mitgelieferte nicht gepasst hat, ansonsten koennte es sein, das die Software in 2 Tagen oder so zumindest mal anfaenglich benutzbar sein duerfte..

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: PyKWiki ein Python Wiki

Beitrag von Jside » Mi Nov 24, 2010 5:20 pm

Die Aktuelle Version (svn@28) ist ready fuer den Gebrauch auf dem Lokalen Desktop, hat aber immernoch dutzend Bugs und Login etc ist nochnicht implementiert.
Z.b. hab ich mal zum testen den Artikel ueber Python aus der en.wikipedia rueberkopiert: http://194.88.179.228/pykwikiscrn1.jpg (Reference Tags, Templates, Listen und Tables muessen halt manuell entfernt werden, da die derzeit nicht vom Parser unterstuezt werden.)

Zudem eine Limitierung von Max 4MB an daten pro Seite(alle Revision zusammengezaehlt). Ich portiere gerade zu CouchDB rueber, da MongoDB Dateien im RAM mappt, was die Maximale Datenbankgroe[ss]e zudem auf 2GB bei 32Bit limitiert, bei meinem Desktoprechner kein Problem(64Bit) aber auf einigen meiner Server ein Problem. CouchDB hat da noch ein paar Vorteile...

Antworten