blob: 4d51a33232241a1e2d53faf9681488181ac5da2b [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001SYNOPSIS
2 varargs string terminal_colour(string str,
3 null | mapping | closure map,
Zesstrad59c3892019-11-28 20:53:39 +01004 int wrap, int indent)
MG Mud User88f12472016-06-24 23:31:02 +02005BESCHREIBUNG
6 Ist <map> ein Wert ungleich 0, ersetzt diese Efun alle Farb-
7 Definitionen der Form "%^KEY%^" (siehe unten fuer Details) im
8 String <str> und ersetzt sie durch die entsprechenden Werte aus dem
9 unter <map> angegebenen Farbschluessel.
10
11 Ist <map> ein Mapping, muessen die Eintraege das Format
12 "KEY" : "wert" haben; Eintraege, die keine Strings enthalten,
13 werden ignoriert. Einzige Ausnahme dazu: enthaelt <map> einen
14 Eintrag der Form 0:wert, wird dieser fuer alle Farbdefinitionen
15 verwendet, die keinem anderen Schluessel zugeordnet werden koennen.
16 <wert> kann in diesem Fall ein String oder eine Closure sein. Handelt
17 es sich um eine Closure, erhaelt diese den <KEY> als Argument und
18 muss einen String zurueck liefern, der <KEY> ersetzt.
19
20 Ist <map> eine Closure, wird diese mit den Farbdefinitionen <KEY>
21 als Argument aufgerufen und muss einen String zurueck liefern, der
22 die <KEY>s ersetzt.
23
24 Die speziellen Schluessel "%^%^" und "%%^^" werden immer durch das
25 Literal "%^" ersetzt.
26
27 Die Parameter <wrap> und <indent> sind optional. Ist nur <wrap>
28 angegeben, wird <str> in der Spalte <wrap> umgebrochen. Ist
29 zusaetzlich <indent> angegeben, werden alle umgebrochenen Zeilen
30 um <indent> Spalten eingerueckt.
31
32 Der Zeilenumbruch ignoriert die Laenge der Farbmakros und ihrer
33 Inhalte. Er bricht <str> anhand der Laenge der uebrigen Zeichen
34 um, ist also farb-neutral.
35
36 Ist <map> als 0 angegeben, fuehrt die Efun kein Suchen und Ersetzen
37 von Farbdefinitionen durch. Die Funktionalitaet von Zeilenumbruch
38 und Einrueckung bleiben erhalten, wenn gewuenscht. Auf diese Weise
39 dupliziert terminal_colour() die Funktion von sprintf("%-=s") und
40 wirkt als einfache Zeilenumbruch Funktion.
41
42
43 ERKENNEN VON FARBDEFINITIONEN
44
45 Wie bereits erwaehnt, werden die speziellen Schluessel "%^%^" und
46 "%%^^" durch das Literal "%^" ersetzt und spielen im Weiteren
47 keine Rolle.
48
49 Fuer den Eingabestring wird das folgende Format vorausgesetzt:
50
51 text { '%^' colorkey '%^' text } [ '%^' colorkey ]
52
53 Oder in Worten: die Efun trennt den String bei jedem '%^', das
54 sie antrifft und behandelt anschliessend jeden zweiten Teilstring
55 als Farbschluessel.
56
57 Merke: dieses Verhalten unterscheidet sich von der Behandlung des
58 Eingabestrings unter MudOS. Dort lautet die Syntax:
59
60 key_oder_text { '%^' key_oder_text }
61
62 Oder in Worten: die MudOS Efun trennt den String bei jedem '%^'
63 und versucht dann jeden Teilstring als Farbschluessel zu behandeln.
64 Dieses Verhalten laesst sich auch unter LPC erreichen:
65
Zesstrad59c3892019-11-28 20:53:39 +010066 string mudos_terminal_colour(string str, mapping ext, int w, int i) {
MG Mud User88f12472016-06-24 23:31:02 +020067 return terminal_colour("%^"+implode(explode(str, "%^")-({""})
68 ,"%^%^")
69 , ext, w, i);
70 }
71
72
73BEISPIELE
74 mapping trans;
75 string str;
76
77 trans = ([ "GREEN" : "ansi-green", "RED" : "", "BLUE" : 1 ]);
78
79 str = terminal_colour( "%^GREEN%^ and %^RED%^ and %^BLUE%^", trans );
80
81 Dies fuehrt zu str == "ansi-green and and BLUE".
82
83 "%^GREEN^%" wird ersetzt durch "ansi-green", weil <trans> das so
84 definiert,
85 "%^RED%^" wird aus <str> entfernt, weil es mit "" ersetzt wird, und
86 "%^BLUE%^" wird um die "%^" verkuert, weil der Eintrag zu BLUE in
87 <trans> keinen gueltigen Wert enthaelt (d.h. kein String ist). Das
88 selbe wuerde passieren, wenn <str> "%^DEFINE%^" enthalten wuerde,
89 zu dem es keinen Eintrag in <trans> gibt.
90
91 Merke: um direkt benachbarte Schluessel zu ersetzen, soll die
92 Efun wie folgt verwendet werden:
93
94 str = terminal_colour( "%^GREEN%^%^RED%^", trans );
95
96 Eine Eingabe der Form
97
98 str = terminal_colour( "%^GREEN%^RED%^", trans );
99
100 fuehrt zum logischen, aber vielleicht unerwarteten Ergebnis
101 "ansi-greenRED".
102
103
104 Einige Worte zum Zeilenumbruch:
105
106 Ein String, der ohne Einrueckung umgebrochen wird (<indent> ist 0),
107 sieht so aus:
108
109 "dies ist die erste Zeile\nund dies ist die zweite Zeile"
110
111 Ein String, der mit <indent> 3 umgebrochen wird, sieht so aus:
112
113 "dies ist die erste Zeile\n und dies ist die zweite Zeile"
114
Zesstrad59c3892019-11-28 20:53:39 +0100115GESCHICHTE
MG Mud User88f12472016-06-24 23:31:02 +0200116 Die Idee fuer diese Efun und die erste Implementierung stammen
117 aus MudOS; die Strategie fuer das Erkennen von Schluesseln
118 (eingeschlossen die pure Zeilenumbruch Funktion) wurde in
119 LDMud 3.2.8 geglaettet.
120 LDMud 3.2.9 fuegte die Verwendung von Closures zur Definition
121 von Farbschluesseln hinzu. Es erklaerte zudem offiziell das
122 Verhalten betreffen "%%^^" aus Gruenden besserer Kompatibilitaet
123 mit MudOS.
124
125SIEHE AUCH
126 sprintf(E)