(deutsche Übersetzung der Seite PmWiki.CustomMarkup, Stand 28.09.2005) Administratoren (Fortgeschritten)
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 fer 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. oll 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.
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.
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 ;)
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.
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
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? >>