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.

Übersicht

Dies sind die Haupttypen von Erweiterungen:

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):

  1. Herausfinden, welches Theme zu benutzen ist.
  2. 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.
  3. 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.

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:

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.

   1 class Parser:
   2 
   3     extensions = ['.txt']
   4 
   5     def __init__(self, raw, request, **kw):
   6 
   7     def format(self, formatter):

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.

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?

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:

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.

MoinMoin: MoinDev/PluginKonzept (last edited 2011-08-17 15:04:20 by mail)