promo­wiki

Doktorandenwiki der {iw,mi}

(deutsche Übersetzung der Seite PmWiki.CustomMarkup, Stand 28.09.2005) Administratoren (Fortgeschritten)

Einleitung

Die Auszeichnungsumwandlung wird bei PmWiki durch einzelne Regeln gesteuert. Jede Regel definiert eine bestimmte Zeichenkette, nach der der Wikitext zuerst durchsucht wird. Anschließend werden die gefunden Stellen durch einen anderen Text ersetzt. Intern wird dazu die PHP Funktion "preg_replace" verwendet.

Zusätzliche Regeln werden in PmWiki mit der PmWiki Funktion Markup() bekannt gemacht. Diese sieht folgendermaßen aus:

Markup($name, $wann, $muster, $ersetzung);

Wobei mit $name ein eindeutiger Name (Zeichenfolge) für die Regel festgelegt wird. $wann legt fest, wann die Regel in Vergleich zu den Anderen ausgeführt werden soll. $muster enthält das Suchmuster, nach dem im Wikitext gesucht wird und $ersetzung ist die Zeichenkette, die das gesuchte Muster ersetzen soll.

Als Beispiel hier der Programmcode, der die Regel für ''emphasized text'' (hervorgehobenen Text, in scripts/stdmarkup.php) erzeugt:

Markup("em", "inline", "/''(.*?)''/", "<em>$1</em>");

Diese Anweisung erstellt eine Regel, die "em" heißt, welche zusammen mit anderen "inline" Auszeichnungen ausgeführt wird. Die Regel ersetzt den Text innerhalb doppelter, einfacher Anführungszeichen durch den selben Text ($1), jedoch eingeschlossen von <em> und </em>.

Die ersten beiden Parameter von Markup() legen die Reihenfolge der Anwendung der Regeln fest. Der erste Parameter gibt der Regel einen Namen -- "em" im obigen Beispiel. Man könnte einen beliebigen anderen Namen benutzen, etwa "''" oder sogar "twosinglequotes". Im Allgemeinen benutzt PmWiki das Markup selbst als Name der Regel (d.h. PmWiki würde "''" und nicht "em" benutzen), aber im Interesse der Lesbarkeit benutzen den alternativen Namen.

Der zweite Parameter sagt, dass die Regel zusammen mit anderem "inline" Auszeichnungen bearbeitet werden soll. PmWiki erledigt den Übersetzungsvorgang in mehreren Phasen:

_begin      Begin der Umwandlung
fulltext    Verarbeitung des gesamten Eingabetextes         
split       Zerteilen des Eingabetextes in einzelne, zu verarbeitende Zeilen
directives  Verarbeitung von Direktiven
inline      Übersetzung von im Text auftauchenden Auszeichnungen
links       Übersetzung von Verweisen, Internetadressen und Wikiwörtern
block       Übersetzung von Block-Auszeichnungen
style       Umsetzung von Stilen    
_end        Ende der Umwandlung

Die Angabe "inline" als zweiter Parameter bedeutet somit, dass die Regel zusammem mit anderen "inline" Regeln verarbeitet wird. Soll die Regel dagegen zusammen mit den Direktiven verarbeitet werden, müsste man "directives" als zweiten Parameter angeben.

Der dritte Parameter ist ein Perl-kompatibler regulärere Ausdruck. Genaugenommen ist es ein Schrägstrich, ein regulärere Ausdruck, ein weiterer Schrägstrich und (optional) einige Modifikatoren.

Das Beispiel verwendet das Suchmuster "/''(.*?)''/", das ''(.*)'' als regulären Ausdruck ohne weitere Optionen verwendet. (Der reguläre Ausdruckj sagt "Finde zwei aufeinanderfolgende einfache Anführungszeichen, dann sowenig besondere Zeichen wie möglich, damit das Suchmuster zutrifft, danach wieder zwei aufeinanderfolgende einfache Anführungszeichen". Die Klammern "kopieren" einein Teil des Wikitextes für die spätere Verwendung.)

Der vierte Parameter ist der Ersetzungstext, der anstatt des des kompletten Suchmusters (Auszeichnung und Wikitext) angezeigt werden soll. Man kann $1, $2 usw. verweden, um den Text aus dem ersten, zweiten usw. Bereich innerhalb des geklammerten Textes im regulären Ausdruck einzufügen.

In diesem Beispiel wird "<em>$1</em>" verwendet, das aus <em>, dem gefundenen Text innerhalb der ersten Klammer (d.h. den Teil .*? des Musters) und </em> besteht.

Beispiele

Hier die Regel für @@Schreibmaschienenschrift@@:

Markup("@@", "inline", "/@@(.*?)@@/", "<code>$1</code>");

und für eine [:comment ...:] Direktive, die einfach aus bei der Ausgabe entfernt wird:

Markup("comment", "directives", "/\\(:comment .*?:\\)/", '');

Aber wie funktioniert das bei der '''starken Hervorhebung'''? Hier muss man etwas vorsichtig sein. Zwar wird diese zusammen mit anderem inline Auzeichnungen bearbeitet, aber es muss auch sichergestellt werden, dass die Regel ''' vor the Regel '' bearbeitet wird,, da ''' auch '' enthält. Der zweite Parameter von Markup() kann auch benutzt werden, um die Beziehung einer Regel zu einer anderen festzulegen:

Markup("strong", "<em", "/'''(.*?)'''/", "<strong>$1</strong>");

Dies erzeugt eine Regel mit Namen "strong" und der zweite Parameter "<em" legt fest, dass die Regel vor der weiter oben gezeigten "em" Regel verarbeitet werden soll. Um etwas nach der "em"-Regel auszuführen, würde man stattdessen ">em" verwenden. Damit ist es möglich, an jeder Stelle der Umwandlung der Auszeichnungen Erweiterungen vorzunehmen. (Genaugenommen sind "inline", "block", "directives" usw. nur Platzhalter um den Gesamtablauf zu strukturieren, so dass andere Regeln an passender Stelle eingefügt werden können. So kann etwa "<inline" benutzt werden, damit eine Regel vor anderen "inline" Regeln angewendet wird.)

Es ist auch möglich, das vordefinierte Auszeichnungen abzuschalten:

Markup("strong", "<em");

Das Fehlen eines Parameters für das Muster und den Ersatztext zeigt an, dass man diese Auszeichnung nicht mehr verwenden möchte.

Die vordefinierten Auszeichnungen von PmWiki sind in scripts/stdmarkup.php definiert. Um die gesamte Ersetzungstabelle während der Programmausführung auszugeben, gibt es das Modul scripts/diag.php das die Aktion "?action=ruleset" zur Verfügung stellt. Damit werden die festgelegten Regeln in der Reihenfolge angezeigt, in der sie verarbeitet werden. Man sieht dies z.B. in Eigene Auszeichnugnen?action=ruleset.

Weitere Beispiele

Aufruf einer eigenen Funktion, die etwas zurückliefert

Die Option 'e' beim Parameter $muster veranlasst PmWiki den Parameter $ersetzung nicht als Ersetzungstext, sondern als PHP Ausdruck zu interpretieren, der den Ersetzungsausdruck zurückliefert.

Die Auszeichnung (:meeting:) tut das indem eine theoretische, globale Funktion meeting() aufgerufen wird (z.B. in config.php definiert), die die das Datum des nächsten BLUG Treffens als Zeichenkette zurückliefert:

Markup('meeting', 'directives', '/\\(:meeting:\\)/e', 'meeting()');

Die Option 'e' ist eine Standardoption von preg_replace() und erlaubt immer noch 'Referenzersetzungen' (Das ist das, was durch die Klammern im $muster kopiert wird und $1, $2 ... ersetzt). Das könnte auch bei der Lösung nachfolgender Übung helfen ;)

Einfache Makro-Ersetzung:

Markup('bigP', 'fulltext', '/\{bigP\}/',
  '%font-size="40px"% P' .
  '%block font-size="15px" border="0px" ' .
  'padding="4px 14px 7px 14px" bgcolor=#FFB% ');

Diese Regel wird in der fulltext Phase bearbeitet und ersetzt die Auszeichnung {bigP} durch etwas anderes. Somit bewirkt

 {bigP}ie Jesu Domine, dona eis requiem (''whack'').

diesen Effekt:

P ie Jesu Domine, dona eis requiem (whack).

das Hinzufügen eines Arguments (wie hier bei {big P}) zur Auszeichnung wird als Übung dem Leser überlassen.

Google Suche ins Wiki einbauen

Deutsches Beispiel, Gleiches Fenster

Fügen Sie nachfolgenden Text am Ende der Datei config.php ein

Markup('googlesearch', 'directives', '/\\(:googlesearch:\\)/e',"Keep(\"
<FORM method=GET action='http://www.google.de/search'>
<TABLE><tr><td>
<A HREF='http://www.google.de'>
<IMG SRC='http://www.google.de/logos/Logo_40wht.gif' border='0'
ALT='Google' align='absmiddle'></A>
<INPUT TYPE=text name=q size=20 maxlength=255 value=''>
<INPUT TYPE=hidden name=hl value=de>
<INPUT type=submit name=btnG VALUE='Google Search'>
</td></tr></TABLE>
</FORM>
\")");

Schreiben Sie nun (:googlesearch:) irgendwo in Ihre Seite. --newmy

Sichere Google Suche in neuem Fenster in das Wiki einbauen

Englisches Beispiel, Sichere Suche in neuem Fenster

Fügen Sie nachfolgenden Text am Ende der Datei config.php ein

Markup('googlesearch', 'directives', '/\\(:googlesearch:\\)/e',"Keep(\"
<FORM method=GET action='http://www.google.com/search' target='_blank'>
<TABLE><tr><td>
Google Safe Search
<A HREF='http://www.google.com/search?safe=vss'></A>
<INPUT TYPE=text name=q size=42 maxlength=255 value=''>
<INPUT type=hidden name=safe value=strict>
<INPUT type=submit name=sa value='Google Search'>
</td></tr></TABLE>
</FORM>
\")");

Schreiben Sie nun (:googlesearch:) irgendwo in Ihre Seite. --Jeff, Corpus Christi, Texas

Standardsuche im englischen Google - Neues Fenster mit Ergebnissen

Fügen Sie nachfolgenden Text am Ende der Datei config.php ein

Markup('googlesearch', 'directives', '/\\(:googlesearch:\\)/e',"Keep(\"
<FORM method=GET action='http://www.google.com/search' target='_blank'>
<input type=hidden name=ie value=UTF-8>
<input type=hidden name=oe value=UTF-8>
<TABLE bgcolor='#FFFFFF'><tr><td>
<A HREF='http://www.google.com/'>
<IMG SRC='http://www.google.com/logos/Logo_40wht.gif' 
border='0' ALT='Google' align='absmiddle'></A>
<INPUT TYPE=text name=q size=25 maxlength=255 value=''>
<INPUT type=submit name=btnG VALUE='Google Search'>
</td></tr></TABLE>
</FORM>
\")");

Schreiben Sie nun (:googlesearch:) irgendwo in Ihre Seite. --Jeff, Corpus Christi, Texas

Lokale Wetterinformationen hinzufügen

Fügen Sie nachfolgenden Text am Ende der Datei config.php ein

Markup('localweather', 'directives', '/\\(:localweather:\\)/e',"Keep(\"
<script src='http://voap.weather.com/weather/oap/78410?template=GENXV&par=null&unit=0&key=021c5b063db71b7fdd9a11f5ec88c033'></script>
\")");

Jetzt kann man irgendwo im Text (:localweather:) unterbringen. --Jeff, Corpus Christi, Texas

Hinweis: Man muss http://www.weather.com aufrufen, um die Skriptzeile zu erhalten, die obige Skriptzeile ersetzt.

Fügen Sie dei Skripzeile zwischen:

Markup('localweather', 'directives', '/\\(:localweather:\\)/e',"Keep(\"

und

\")");

ein.

<< InterMap anpassen | Dokumentationsindex | Eigene Wikistile >>