WaBis

walter.bislins.ch

Implementation:Spezialzeichen

Viele Zeichen in der Wiki-Syntax haben spezielle Funktionen, z.B. Wiki-Links, Makros, HTML-Tags, Tabellen usw. Möchte man diese Zeichen als normale Zeichen verwenden, ohne dass die Wiki-Engine sie interpretiert, muss man sie irgendwie maskieren. Dazu gibt es mehrere Möglichkeiten:

  1. Sonderzeichen können durch entsprechende HTML-Strings codiert werden (z.B. & &)
  2. Spezialzeichen können mit \ maskiert werden (z.B. \[ \] [ ])
  3. Ganze Abschnitte können zwischen <nowiki> und </nowiki> gesetzt werden

Probleme

Sonderzeichen in Links und Überschriften können nur mit den ersten beiden Methoden eingesetzt werden. Dabei gibt es mehrere Möglichkeiten, ein einzelnes Zeichen zu maskieren.

Beispiele, wie das & Zeichen in Wiki-Syntax eingegeben werden kann:

  • & (keine Maskierung nötig, wenn das & nicht Teil eines HTML-Strings ist)
  • \& (Maskierung mit \)
  • &amp; (HTML-String codierung)
  • &#38; (HTML-String codierung mit Zeichencode dezimal)
  • &#x26; (HTML-String codierung mit Zeichencode hexadezimal)

In jedem Fall wird nur das &-Zeichen auf der Wiki-Seite oder einer Überschrift dargestellt.

Wenn das Wiki Links auf eine Seite mit Sonderzeichen im Seitennamen suchen soll, besteht das Problem, dass man keine reguläre Ausdrücke formulieren kann, mit denen man Seiten nach slchen Links durchsuchen könnte, da die Abbildung vom Seitennamen zum entsprechenden Link nicht eindeutig ist.

Beispiel

Eine Seite heisse «Wabis & CO». Ein Link auf diese Seite kann mehrere Formen annehmen:

[[Wabis & CO]]
[[Wabis \& CO]]
[[Wabis &amp; CO]]
[[Wabis &#38; CO]]
[[Wabis &#x26; CO]]

Jeder dieser Links führt zur Seite «Wabis & CO». Nach welcher Form soll nun das Wiki suchen, wenn Links auf «Wabis & CO» gesucht werden sollen?

Lösung

Das Wiki verarbeitet vor der Suche nach Links jede Seite vor. Zunächst werden alle Maskierungen in ein internes Format codiert, damit maskierte Zeichen nicht als Wiki-Funktionen mehr interpretiert werden. Dann werden alle Links einer Seite gesammelt und schliesslich werden die gefunden Links mit DecodeName() wieder demaskiert. Dabei entstehen die eindeutigen Seitennamen. Diese Links können also nun eindeutig mit den Seitennamen verglichen werden.

Für das Sammeln von Links einer Seite gibt es die Funktion GetLinks(), welche von der Wiki-Funktion Links (Links auf diese Seite) intern verwendet wird.

Einschränkungen

Die Funktion DecodeName() wandelt HTML-Strings in ihre entsprechenden Zeichen um (z.B. &amp; &, &lt; < usw.). Es gibt eine recht grosse Zahl von solchen HTML-Strings und zudem können alle Zeichen auch Codiert werden (&#nnnn; oder &#xhhhh;).

Um die Performance wegen selten benötigter Sonderzeichen nicht zu sehr zu belasten, habe ich mich auf diejenigen HTML-Strings beschränkt, deren Zeichen man über eine normale Tastatur auch eingeben kann oder solche, die HTML-Codiert sind.

Daraus folgt die Beschränkung, dass in Links und Überschriften neben benannten HTML-Zeichen nur folgende Zeichen (maskiert) verwendet werden dürfen:

[ ] { } | # $ ~ & < > \

Einige häufig benötigte Zeichen dürfen zusätzlich verwendet werden:

« und » (Können wiefolgt << bzw. >> eingegeben werden)

Spezialzeichen wie →, α, β, π usw. sollten in Überschriften und Links nur in der Form &name; verwendet werden um im ganzen Wiki konsistent zu bleiben. Insbesondere sollten Sonderzeichen nicht einfach von Webseiten hineinkopiert werden, da solche Links dann nicht die richtige Seite finden.

Weitere Infos zur Seite
Erzeugt Mittwoch, 28. Juni 2006
von wabis
Zum Seitenanfang
Geändert Dienstag, 5. August 2014
von wabis