Englisch: |
PmWikiDe /
Eigene Auszeichnungen
Administratoren (FTP)
EinleitungDie 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() oder Markup_e() bekannt gemacht. Diese sehen folgendermaßen aus: Markup($name, $wann, $muster, $ersetzung); # ODER Markup_e($name, $wann, $muster, $ersetzung); Wobei mit Als Beispiel hier der Programmcode, der die Regel für 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 zweier Paare einfacher Anführungszeichen durch den selben Text ($1), jedoch eingeschlossen von Die ersten beiden Parameter von Markup() legen die Reihenfolge der Anwendung der Regeln fest. Der erste Parameter gibt der Regel einen Namen — " Der zweite Parameter sagt, dass die Regel zusammen mit anderen "inline" Auszeichnungen bearbeitet werden soll. PmWiki erledigt den Übersetzungsvorgang in mehreren Phasen: _begin Beginn 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 Dies Argument wird normalerweise als öffnende spitze Klammer ("vorher") oder schließende spitze Klammer ("nachher") angegeben, gefolgt vom Namen einer anderen Regel. Die Angabe "inline" als zweiter Parameter bedeutet somit, dass die Regel zusammen mit anderen "inline" Regeln verarbeitet wird. Soll die Regel dagegen zusammen mit den Direktiven verarbeitet werden, d. h. bevor die inline-Regeln verarbeitet werden, müsste man "directives" oder "<inline" als zweiten Parameter angeben. Der dritte Parameter ist ein Perl-kompatibler regulärer Ausdruck. Genau genommen ist es ein Schrägstrich, ein regulärer Ausdruck, ein weiterer Schrägstrich und (optional) einige Modifikatoren. Das Beispiel verwendet das Suchmuster Der vierte Parameter ist der Ersetzungstext, der anstatt des des kompletten Suchmusters (Auszeichnung und Wikitext) angezeigt werden soll. Man kann In diesem Beispiel wird BeispieleHier die Regel für Markup("@@", "inline", "/@@(.*?)@@/", "<code>$1</code>");
und für eine Markup("comment", "directives", "/\\(:comment .*?:\\)/", '');
Aber wie funktioniert das bei der 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, Erweiterungen an jeder Stelle der Umwandlung von Auszeichnungen vorzunehmen. (Genau genommen sind "inline", "block", "directives" usw. nur Platzhalter um den Gesamtablauf zu strukturieren, sodass 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.) Wenn Sie verfügbare Auszeichnungen abschalten wollen, schreiben sie einfach z. B.: DisableMarkup("strong");
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 " Weitere gängige BeispieleDefinieren einer eigenen Funktion, die eine spezielle HTML- oder Javascript-Sequenz erzeugtAngenommen, ein Admin möchte eine einfache " Markup('example', 'directives', '/\\(:example:\\)/', Keep("<div class='example'><p>Here is a <a target='_blank' href='http://www.example.com'>link</a> to <em>example.com</em></p></div>") );
Aufruf einer eigenen Funktion, die etwas zurückliefertDie Option 'e' beim Parameter Markup('random', 'directives', '/\\(:random:\\)/e', "rand(1, 100)"); Dies ruft die PHP-interne rand()-Funktion auf und ersetzt die Direktive mit dem Ergebnis. Jede Funktion kann aufgerufen werden, einschließlich der Funktionen, die in einer Datei für Lokale Anpassungen definiert wurden. Argumente können auch übergeben werden, indem reguläre Ausdrücke einfangende Klammern benutzt werden, so bewirkt die Auszeichnung Markup('randomargs', 'directives', '/\\(:random (\\d+) (\\d+):\\)/e', "rand('$1', '$2')"); dass die Direktive Beachten Sie: Seien Sie sehr vorsichtig mit dem /e-Modifier in regulären Ausdrücken; arglistige Autoren könnten in der Lage sein, Zeichenketten zu übergeben, die die Ausführung eigenmächtiger und unerwünschter Funktionen bewirkt.
Wegen einer PmWiki-Funktion, die hilft, beliebige Sequenzen aus Schlüssel-Wert-Paaren zu parsen, siehe Cookbook:ParseArgs. Migration zu PHP 5.5 und Markup_e()Seit PHP Version 5.5 wird der /e-Auswertungs-Modifier missbilligt und einige Hoster erlauben seine Verwendung nicht mehr. Jüngere Versionen des PmWiki-Kerns (2.2.58 und jünger) erlauben neue Wege, um Auszeichnungsregeln zu definieren, ohne auf den Modifier /e zuzückgreifen zu müssen. Die historischen Wege, Auszeichnungsregeln zu definieren, wurden nicht entfernt und laufen weiterhin, aber sie könnten mit PHP-5.5-Installationen unverträglich sein. Beachten Sie: Wenn ihr Ersatzmuster nicht ausgewertet werden muss, sollten Sie Markup() benutzen wie bisher und nicht Markup_e(). Das Folgende ist akzeptabel für PHP 5.5+ (verträglich mit PmWiki 2.2.58+, läuft auch mit PHP 5.4 und älter)
Beispiele:
Das läuft auch unter PHP 5.4 und älter, erfordert aber PmWiki 2.2.58 oder jünger.
Ein weiteres Beispiel:
Offensichtlich kann die LinkMaxi-Funktion auch umgeschrieben werden, sodass sie das Übereinstimmungs-Array direkt akzeptiert. Das läuft auch unter PHP 5.4 und älter, erfordert aber PmWiki 2.2.58 oder jünger. Das Obige mag kompliziert erscheinen, aber es ist tatsächlich einfacher, Sie benutzen ihre eigene callback-Funktion. Markup('mykey', 'directives', '/\\(:mydirective (.*?) (.*?):\\)/i', 'MyFunction' ); function MyFunction($matches) { extract($GLOBALS["MarkupToHTML"]); # ... do stuff with $matches ... return $out; # or return Keep($html); } Markup für beide, neue und alte, Versionen von PmWikiWenn Ihr Rezept mit PmWiki 2.2.58 und jünger unter PHP 5.5 und mit älteren PmWiki+PHP-Versionen laufen soll, können Sie etwa das Folgende benutzen: if(function_exists('Markup_e')) { # new format, no /e Markup_e('rnd', 'directives', '/\\(:random (\\d+) (\\d+):\\)/', "rand(\$m[1], \$m[2])"); } else { # old format Markup('rnd', 'directives', '/\\(:random (\\d+) (\\d+):\\)/e', "rand($1, $2)"); } Wenn Sie Fragen bezüglich des neuen Weges haben, mit dem man eigenen Markup-Funktionen definiert, fragen Sie uns auf der Talk-Seite? oder der Mailingliste. FAQWie kann ich JavaScript in die Ausgabe einer Seite einfügen? Es gibt mehrere Wege, das zu erreichen. Das Cookbook:JavaScript-Rezept beschreibt ein einfaches Verfahren, um statisches JavaScript in eine Webseite einzufügen mit Hilfe von eigenen Auszeichnungen. Um JavaScript direkt in Wikiseiten zu schreiben (was verschiedene Sicherheitsrisiken öffnen kann), siehe das JavaScript-Editable-Rezept. Für JavaScript, das im Kopf- und Fußbereich von Seiten erscheinen soll, können Sie die skin-Vorlage direkt verändern, oder Sie fügen <script>-Anweisungen ein, indem Sie das Wie erstelle ich ein Markup ((:nodiscussion:)), das eine Seitenvariable ({$HideDiscussion}) setzt, die wiederum mit (:if enabled HideDiscussion:) in .PageActions? eingesetzt werden kann? Fügen Sie den folgenden Kodeabschnitt in Ihre config.php ein: SDV($HideDiscussion, 0); #define var name Markup('hideDiscussion', '<{$var}', '/\\(:nodiscussion:\\)/e', 'setHideDiscussion(true)'); function setHideDiscussion($val) { global $HideDiscussion; $HideDiscussion = $val; } Das macht es möglich, die Anscheinend trifft (.*?) in den Funktionen nicht auf Zeilenumbrüche zu, sodass das obige Beispiel nicht funktioniert, wenn der Text, der in <em> eingeklammert werden soll, Zeilenumbrüche enthält. Wenn Sie den "s"-Modifier im regulären Ausdruck verwenden, wird der Punkt (.) auf einen Zeilenumbruch passen. So wird Ihr regulärer Ausdruck zu "/KRAMS(.*?)/s". Das "s" ganz am Ende ist es, wonach Sie suchten. Wenn Sie beginnen, sich mit mehrzeiligen Ausdrücken zu beschäftigen, sollten Sie sich auch mal die m-Option anzusehen — durch sie passen die Anker (^und $) nicht nur auf den Beginn und das Ende der Zeichenkette, sondern auch auf den Beginn und das Ende von Zeilen, also unmittelbar vor und hinter dem Zeilenumbruch. Wie kann der Text, den meine Markup-Funktion zurückliefert, noch einmal den Markup-Prozess durchlaufen? Wenn das Ergebnis Ihres Markups weitere Markups enthält, die auch noch behandelt werden sollen, haben Sie zwei Optionen. Die erste ist, ein "wann"-Argument zu wählen, dass vor dem Markup in Ihrem Ergebnis bearbeitet wird. Wenn zum Beispiel Ihr Markup [[links]] zurückliefert, könnte Ihr "wann"-Argument Wie beginne ich mit dem Schreiben von Rezepten und dem Erzeugen von eigenen Markups? (alternative) Einführung in angepasste Auszeichnungen für Anfänger (auf englisch) Wie mache ich eine Regel, die einmalig nach der Behandlung aller anderen Regeln angewendet wird? Wenden Sie diese Anweisung anstelle des üblichen
Übersetzung von PmWiki.CustomMarkup
Originalseite auf PmWikiDe.CustomMarkup - Rückverweise |