this is an outdated translation of ../PluginConcept into german from 2006-12-15
Plugins sind ein sehr wichtiger Aspekt von MoinMoin, die ein großes Maß an Flexibilität hinsichtlich Eingabeformaten, Verarbeitungsmöglichkeiten, dynamischen Inhalten und Ausgabe von Seiten ermöglichen.
Manchmal wird bei MoinMoin der Begriff Plugin verwendet, manchmal Erweiterung. Gemeint ist aber das selbe. In diesem Text habe ich konsequent Plugin in Erweiterung übersetzt.
Übersicht
Dies sind die Haupttypen von Erweiterungen:
- Aktionen
- Parser
- Formatierer
- Makros
- Themes
Grundsätzlich kannst Du für alle diese Erweiterungs-Typen Dein eigenes Erweiterungs-Modul schreiben, das von MoinMoin ausgeführt wird (sofern angemessen), wenn es eine Client-Anfrage abhandelt.
Erweiterungen werden in Python geschrieben. Sie sind in spezifischen Verzeichnissen aufbewahrt und müssen die benötiget Schnittstelle für MoinMoin bereitstellen, damit das System sie laden und ausführen kann.
Haupt-Event-Sequenz
Die Hauptsequenz für Ereignisse (events) in MoinMoin um mit einer Seite umzugehen sind (im groben):
- Herausfinden, welches Theme zu benutzen ist.
- Die Aktion für die Seite herausfinden
- Die Aktion für die Seite durchführen, welche im Normalfall ist:
- Die Seiten-Eingabe parsen
- Die Seite für die Ausgabe formatieren
- Bei dem Prozess der Ausgabe der Seite, alle Makros oder Prozessoren ausführen, die in der Seite kodiert sind. Jegliche Ausgabe der Markos und Prozessoren wird der anderen Ausgabe der Seite (inline) eingebunden.
- Die Aktion für die Seite durchführen, welche im Normalfall ist:
- Sende das Ergebnis zum Client.
Eingebaute Erweiterungen und Wiki-Erweiterungen
Jedes Wiki Data-Verzeichnis hat ein plugin-Verzeichnis, das ein Python-Paket ist. Darin befinden sich Pakete für jede Art von Erweiterung (Aktion, Makro, etc.). Wiki-Erweiterungen sind in einem dieser Pakete installiert. Zum Beispiel würde data/plugin/macro/RecentChanges.py ein Makro names RecentChanges zur Verfügung stellen. MoinMoin-Erweiterungen sind in dem MoinMoin-Paket unter MoinMoin/plugin-art/plugin name installiert.
Wiki-Erweiterungen überschreiben immer eingebaute Erweiterungen. Wenn Du z. B. einen anderen RecentChanges-Makro haben möchtes, musst Du den MoinMoin-Code nicht anfassen. Schreib einfach Dein eigenes RecentChanges-Makro und speichere es in data/plugin/macro/. Dein Makro wird dann anstelle des eingebauten verwendet.
Denke daran, das Du die Datei __init__.py im Verzeichnis data/plugin/ behalten musst.
Wie Erweiterungen importiert werden
Um eine Erweiterung zu importieren rufe wikiutil.importPlugin auf. Es wird entweder eine Wiki-Erweiterung oder eine eingebaute Erweiterung zurückgeben oder einen wikiutil.PluginErrorerzeugen oder eine spezifischere Subklasse. Wenn Du eine spezifische Erweiterung bekommen möchtest, rufe entweder importWikiPlugin oder importBuiltinPlugin auf.
Wenn Du eines der importXXXPlugin aufrufst, wird der Plugin-Name geprüft in der Liste verfügbarer Erweiterungen, der einmalig durch das laufen des Plugin-Paketes (siehe __init__.py) erzeugt wird. Wenn eine Erweiterung fehlt, wird die Anfrage sie zu importieren einen PluginMissingError hervorrufen ohne nochmals zu versuchen die Erweiterung zu laden.
Wiki-Erweiterungen werden wie jedes andere Modul einmalig geladen und dann in Pythons sys.modules gecached. Wiki-Erweiterungen werden as siteid.plugins.art.name importiert. Eingebaute Erweiterungen werden als MoinMoin.art.name importiert.
Erweiterungen installieren oder modifizieren
Wenn Du eine neu Erweiterung installieren willst oder einen existierenden Erweiterungs-Code ändern willst, wird es nur dann aktiviert, nachdem der MoinMoin-Code neu gestartet wird. Für CGI wird es bei der nächsten Anfrage aktiviert, für den Standalone oder Twisted-Server nach dem Neustart des MoinMoin_Server. Für FastCGI und mod_python wirst Du den Webserver neu starten müssen.
Erweiterungs-Arten
Verfügbare zusätzliche Erweiterungen können auf verschieden Markt-Seiten gefunden werden. Siehe MoinMoinExtensions unter die Links weiter unten.
Aktionen
Aktionen sind, was der MoinMoin-Code mit einer Client-Anfrage (und der angefragten Seite) tut. Die voreingestellte Aktion ist die Seite als Wiki-Text zu parsen und HTML auszugeben. Es können aber auch andere Aktionen definiert werden, um beliebiges Verarbeiten zu erlauben. Aktionen sind das Äquivalent zu CGI-Skripten, aber innerhalb eines MoinMoin-Kontextes.
Durch das Schreiben von Aktionen kannst Du im wesentlichen MoinMoin erweitern, jede Verarbeitung durchzuführen, die Du möchtest. Dies wird meist getan um Verarbeitung auf einer Seite durchzuführen (eine Seite wird als Argument für die Aktion übergeben), aber jede Art von Weiterverarbeitung ist erlaubt.
Die eingebauten Seiten_Aktionen sind Dinge wie:
- "show" - die Seite anzeigen (welches die voreingestellte Aktion ist)
- "edit" - die Seite zu editieren
- "diff" - Versionen der Seite zu vergleichen
- "highlight" - um bestimme Wörter auf der Seite hervorgehoben zu sehen
Es gibt auch einige add-on-Aktionen, die mit dem Standard-MoinMoin mitgeliefert werden, wie SpellCheck (Rechtschreibprüfung)
Siehe auch: HilfeZuAktionen, ActionMarket.
API:
def execute(pagename, request):
Parser
Parser lesen den Inhalt einer Seite und rufen den Formatierer um die Seite auszugeben.
Parser erlauben MoinMoin mehr Flexibilität beim Eingabeformat. Das voreingestellte Eingabeformat ist das Wiki-Format, welches das Textformat ist, worin Seiten normalerweise gespeichert werden. Jedoch sind auch andere Eingabeformate möglich, wie Pythonquelltext-Fragmente, simpler Text oder andere.
Durch das Schreiben eigener Parser kannst Du MoinMoin erweitern um zusätzliche Dokumentenformate zu unterstützen.
Siehe auch: ParserMarket.
Siehe MoinMoin/parser/plain.py für ein einfaches Beispiel
Frage: Das Beispiel inkludiert Dependencies-Variablen auf beiden Leveln: Klasse und Modul. Ist eines davon Teil der API? Es gibt keine Kommentare in dem Beispiel die ihren Status oder Zweck erklären.
Antwort: Wegen Design-Mängeln, sind beide Teil der Pseudo-API. Wenn die Liste leer ist, wird der Makro gecached und nicht während dem Abrufen der Seite aufgerufen. In anderen Fällen, wird es dynamisch gelinkt.
Frage: Verlangt MoinMoin, das der Parser eine Klasse sein muss, oder nur eine aufrufbare Fabrik(factory)? Ist eine extension ein Attribut der Fabrik oder der Instanz?
Antwort: Bitte schau auf den Code. Dieses Feature ist ziemlich stabil.
Formatierer
Formatierer werden benutzt um Seiten in einem bestimmten Format auszugeben. Das voreingestellte Ausgabeformat ist HTML, aber die Seiten-Ergebnisse können auch in XML oder einem anderen Format ausgegeben werden.
Ein Formatierer liefert für MoinMoin eine Schnittstelle, um Standard-Seitenelemente auszuzgeben. Parser und Makros sollten diese Schnittstelle nutzen anstatt direkt HTML auuszugeben. So kann das Dokument an den Client in jedem unterstützten Ausgabeformat ausgegeben werden. Lese ApplyingFormatters um zu lernen, wie man es nutzt oder schaue auf die Sourcen: MoinMoin/formatter/base.py, MoinMoin/formatter/text_html.py
Siehe auch FormatterMarket.
Makros
Ein Makro ist ein Mechanismus um dynamische Inhalte in der Mitte der Seitenausgabe einzubetten. Eine Makro-Definition inkludiert normalerweise eine kleine Anzahl von Parametern und wird benutzt um Informationen auszugeben, die verarbeitet und/oder formatiert wird, wenn die Seite ausgegeben wird.
Sie werden benutzt um Extra-Daten oder Kontrollen auf Teilen der Seite anzuzeigen.
Siehe auch: HilfeZuMakros, MacroMarket. Macros sitzen in MoinMoin/wikimacro.py, MoinSrcMoinMoin/macro and data/plugin/macro.
API:
def execute(macro, args):
Das Makro-Objekt kann auf die folgenden Objekte zugreifen:
macro.request (see MoinMoin/request.py)
macro.formatter (see MoinMoin/formatter/base.py for API)
macro.formatter.page (see MoinMoin/page.py)
Makros sollten den macro.formatter nutzen um eine Augabe zu erzeugen und wiederzugeben.
Themes
Ein Theme bestimmt das visuelle Erscheinungsbild einer Ausgabe. Du kannst verschiedenes Bildschirm-Layout, Icons und CSS pro Theme haben. Das voreingestellte Theme heisst modern. Ein User kann verschiedene Themes in den User-Präferenzen setzen.
Siehe auch: HelpOnThemes, ThemeMarket.