(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. Anschlieend werden die gefunden Stellen durch einen anderen Text ersetzt. Intern wird dazu die PHP Funktion "preg_replace" verwendet.

Zustzliche Regeln werden in PmWiki mit der PmWiki Funktion Markup() bekannt gemacht. Diese sieht folgendermaen aus:

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

Wobei mit $name ein eindeutiger Name (Zeichenfolge) fr die Regel festgelegt wird. $wann legt fest, wann die Regel in Vergleich zu den Anderen ausgefhrt werden soll. $muster enthlt 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 fr ''emphasized text'' (hervorgehobenen Text, in scripts/stdmarkup.php) erzeugt:

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

Diese Anweisung erstellt eine Regel, die "em" heit, welche zusammen mit anderen "inline" Auszeichnungen ausgefhrt wird. Die Regel ersetzt den Text innerhalb doppelter, einfacher Anfhrungszeichen durch den selben Text ($1), jedoch eingeschlossen von <em> und </em>.

Die ersten beiden Parameter von Markup() legen die Reihenfolge der Anwendung fer Regeln fest. Der erste Parameter gibt der Regel einen Namen -- "em" im obigen Beispiel. Man knnte einen beliebigen anderen Namen benutzen, etwa "''" oder sogar "twosinglequotes". Im Allgemeinen benutzt PmWiki das Markup selbst als Name der Regel (d.h. PmWiki wrde "''" 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 Wikiwrtern
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. oll die Regel dagegen zusammen mit den Direktiven verarbeitet werden, msste man "directives" als zweiten Parameter angeben.

Der dritte Parameter ist ein Perl-kompatibler regulrere Ausdruck. Genaugenommen ist es ein Schrgstrich, ein regulrere Ausdruck, ein weiterer Schrgstrich und (optional) einige Modifikatoren.

Das Beispiel verwendet das Suchmuster "/''(.*?)''/", das ''(.*)'' als regulren Ausdruck ohne weitere Optionen verwendet. (Der regulre Ausdruckj sagt "Finde zwei aufeinanderfolgende einfache Anfhrungszeichen, dann sowenig besondere Zeichen wie mglich, damit das Suchmuster zutrifft, danach wieder zwei aufeinanderfolgende einfache Anfhrungszeichen". Die Klammern "kopieren" einein Teil des Wikitextes fr die sptere 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 regulren Ausdruck einzufgen.

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 fr @@Schreibmaschienenschrift@@:

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

und fr 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 '' enthlt. 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 auszufhren, wrde man stattdessen ">em" verwenden. Damit ist es mglich, 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 eingefgt werden knnen. So kann etwa "<inline" benutzt werden, damit eine Regel vor anderen "inline" Regeln angewendet wird.)

Es ist auch mglich, das vordefinierte Auszeichnungen abzuschalten:

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

Das Fehlen eines Parameters fr das Muster und den Ersatztext zeigt an, dass man diese Auszeichnung nicht mehr verwenden mchte.

Die vordefinierten Auszeichnungen von PmWiki sind in scripts/stdmarkup.php definiert. Um die gesamte Ersetzungstabelle whrend der Programmausfhrung auszugeben, gibt es das Modul scripts/diag.php das die Aktion "?action=ruleset" zur Verfgung 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 zurckliefert

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

Die Auszeichnung (:meeting:) tut das indem eine theoretische, globale Funktion meeting() aufgerufen wird (z.B. in config.php definiert), die die das Datum des nchsten BLUG Treffens als Zeichenkette zurckliefert:

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 knnte auch bei der Lsung 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 Hinzufgen eines Arguments (wie hier bei {big P}) zur Auszeichnung wird als bung dem Leser berlassen.

Google Suche ins Wiki einbauen

Deutsches Beispiel, Gleiches Fenster

Fgen 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

Fgen 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

Fgen 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 hinzufgen

Fgen 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.

Fgen Sie dei Skripzeile zwischen:

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

und

\")");

ein.

<< InterMap anpassen | Dokumentationsindex | Eigene Wikistile? >>

Seite zuletzt geändert am 23.02.2006 09:45 Uhr · Seitenaufrufe: 1257