Sven Rautenberg: string vs. richtext

Beitrag lesen

Moin!

Warum zum Henker kann man Zeichenketten formatieren (und ähnliches)?
Ich beziehe mich auf das http://de.selfhtml.org/javascript/objekte/string.htm@title=String-Objekt, welches allerlei Methoden mit sich bringt, die sich auf RichText beziehen.

Nein, tun sie nicht.

Das, was das String-Objekt da kann, ist eine ziemlich simple und in der Praxis überflüssige Methode, die ganz schlicht um einen String herum noch HTML-Tags einbaut.

Alternativ dazu kann man diese Tags auch manuell um den String bauen:

str = "Hallo Welt";  
document.write(str.small()); // Gibt "<small>Hallo Welt</small>" ins Dokument aus.  
document.write("<small>".str."<\/small>"); // tut dasselbe.

Der String "str" ist dabei nicht "formatiert". Einmal enthält er schlicht nur den Text, danach enthält er (als Parameter zu document.write(), aber man könnte das Ergebnis auch in eine neue Variable speichern) ganz schlicht Text umgeben von anderem Text, welcher aber das Aussehen von HTML-Tags hat.

Was ich meine ist: Ich kenne aus anderen Sprachen, dass es den Datentyp "Richtext" gibt (den ich nicht gerne verwende, weil die Handhabung oft recht kompliziert und verwirrend ist). Und es gibt natürlich String/Zeichenkette.

Ehrlich gesagt: Ich kenne solche Programmiersprachen nicht, was daran liegen könnte, dass ich primär PHP schreibe. Ich kenne aber sehr wohl die Tatsache, dass manche Sprachen für Desktop-Applikationen Dinge wie Rich-Text-Editorfelder anbieten, aus denen man sich die Formatierung dann ja irgendwie rauspulen muss. Das ist aber entweder ein komplexer Datentyp (man denke nur an einen XML-DOM-Baum), bei dem die Formatierung auf einem anderen Kanal übermittelt wird, als der eingegebene Text, oder es ist auch nur die Stringdarstellung des Textfeldes, bei dem die Formatierungskommandos entweder HTML, irgendeine Form von BBCode, oder irgendwelche ASCII-Sonderzeichen sind (wenn man sich mal alte Lineprinter-Dokus durchliest: Der Zeichenbereich ASCII 0 .. 31 wimmelt von Steuerzeichen, die die Druckausgabe beispielsweise auf "fett" oder "kursiv" stellen konnten - und es gibt keinen Grund, diese Steuerzeichen nicht auch heute noch zu verwenden - Tabulatoren werden ja auch noch verwendet).

JavaScript scheint diese Dinge zu mischen also beide Datentypen (Klassen) in einer zu vereinen. Gibt mir aber gleichzeitig keine Methode an die Hand (soweit ich das bisher sehe) nur auf die Zeichenkette zuzugreifen ohne deren Formatierungen ("strip").

Das ist halt falsch. Diese "Formatierungs-Methoden" liefern dir immer nur den Originalstring mit drumrumgebauten HTML-Tags. Am Ende hast du immer wieder nur einen String - aber halt einen mit mehr Zeichen, der auch nur dann "formatiert" wird, wenn du ihn im HTML-Kontext in eine HTML-Seite packst. Wenn du ihn beispielsweise als Value einem Formularfeld zuweisen würdest, würde keine Formatierung wirksam werden, sondern die HTML-Tags drumherum sichtbar werden.

Um es an einem Beispiel festzumachen: toLowerCase() ist eine typische Funktion (oder hier: Methode), die man auf Zeichenketten anwendet.
sub() hingegen ist es idR nicht (Ausnahmen mögen Zeichen sein, die es im Unicode nochmal extra als tiefergestellt gibt).

Nein, es gibt keine Ausnahme. sub() bastelt dir die Zeichenkette "<sub>" vor deinen String, und "</sub>" hinter deinen String. Ganz simpel. Und ziemlich überflüssig. Das brauchte man schon zu Zeiten von Netscape 3 nicht wirklich, und erst recht nicht heutzutage.

toLowerCase() hingegen verändert die im String enthaltenen Zeichen, sofern es für sie eine in Unicode definierte Lower-Case-Variante gibt.

Mein Problem bei der Sache ist halt, dass ich das gedanklich nicht auseinander bekomme. Woher weiß ich ob ich formatierten Text oder eine reine Zeichenkette erhalte, wenn ich z.B. einen Textknoten bzw. dessen Inhalt ergreife.

Wenn du einen Textknoten mit DOM-Funktionen aufspürst, hast du immer simplen Text.

Und wie gesagt, warum bietet mir "String" eine Methode namens "blink" anstatt dessen Elternelement.

Weil die String-Methoden alle extrem blöd sind und vor der Entwicklung eines vernünftigen DOM (sprich: getElementById() etc.) in den Javascript-Standard aufgenommen wurden.

Heutzutage würde man solche Funktionen nicht mehr in Javascript implementieren, und vermutlich würde man sie am liebsten wieder aus dem Standard entfernen.

- Sven Rautenberg