anpera.net
http://anpera.homeip.net/phpbb3/

Doppelte + Einfache Farbcodes
http://anpera.homeip.net/phpbb3/viewtopic.php?f=25&t=5215
Seite 1 von 2

Autor:  Shaddar [ Mo 15 Nov, 2010 08:14 ]
Betreff des Beitrags:  Doppelte + Einfache Farbcodes

Guten Morgen ^^

Wir stehen gerade vor einem kleinen Problem. Undzwar möchten wir unsere Farben gerne um ein "paar" aufstocken 100-200 was am Ende vielleicht was um die 250 Farben ergeben würde. Nun haben wir aber so ziemlich alle Sonderzeichen verbastelt die uns eingefallen sind und die die Datenbank geschluckt hat ... (benutzen den Mod für die Farben aus der DB von Eliwood)

Gäbe es eine Möglichkeit Farbcodes mit doppelten Zeichen einzubauen z.B. `?? ohne das die einfachen `? dabei beeinflusst werden würden ? Wir wollen unsere alten Farben eben gerne behalten und nur um die neuen erweitern und haben entsprechend auch nicht Lust alle Farbcodes abzuändern ^^

Ich hoffe es ist verständlich was ich meine. Es soll also einen Unterschied machen ob ich nun einen einfachen oder soppelten Farbcode habe. Nur wie sag ich dem System das es beides paralell geben soll und sich nicht noch zu den einfachen Farbcodes das Zeichen dahinter sucht ?

Autor:  Eliwood [ Mo 15 Nov, 2010 08:30 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Vielleicht wäre ja das was für dich:
viewtopic.php?f=43&t=4877&hilit=Farben+Farbsystem
"Doppelte Farbtags" wäre mühsam, da man nicht unterscheiden kann, ob man nun beim zweiten Buchstaben den ersten Buchstaben eines Wortes meint oder den zweiten des Farbtags.

Autor:  Shaddar [ Mo 15 Nov, 2010 22:35 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Wäre es "nur" mühsam oder würde dir eine Lösung dafür einfallen ?
Das das System dann nicht unterscheiden kann ob der Farbcode noch weitergeht oder das folgende Zeichen nur eingefärbt werden soll ist mir auch klar ...

Das von dir angesprochene System klingt durchaus interessant wäre aber leider mit einem Komplettumbau verbunden, den wir ja eigentlich scheuen xD

Autor:  Eliwood [ Di 16 Nov, 2010 08:18 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Nicht unbedingt - es ist durchaus vorstellbar, eine Funktion zu schreiben, die gewöhnliche Farbtags einfach umschreibt ;)

Zum Problem mit den doppelten Farbtags: Es gibt zwei Lösungen plus eine dritte, für die aber der programmtechnische Aufwand viel zu hoch ist. Lösung 1: Jeden zweiten Buchstaben, solange kein Leerzeichen, als dem Farbtag zugehörig interpretieren (`5machen hat also den Farbtag `5m, `5 machen aber den `5). Lösung 2: Jeden zweiten Buchstaben als nicht dem Farbtag zugehörig interpretieren, wenn nach dem zweiten Zeichen kein Leerzeichen kommt (`5machen hat den Farbtag `5, `5m machen hat den Farbtag `5m).
Die Lösung 2 hat am wenigsten Überschneidungen, aber gibt Probleme innerhalb vom Strings, die innerhalb des Wortes einen Farbwechsel haben sollen. Lösung 1 gibt für 1-Tag-Tags Probleme, Lösung 2 für 2-Tag-Tags...

Als einzige Lösung für das Problem, die es umschiffen kann, wäre die Interpretation der zweiten Stelle, wenn sie 0 ist, als Pseudo-Eintag-Tag, damit wäre Lösung 1 am besten: Für `5m heisst es `5mmachen, für `5 heisst es `50machen. Probleme gibts dann aber trotzdem noch mit alten Texten.

Wie du siehst, gibt alles Probleme ;)

Autor:  Minerva [ Di 16 Nov, 2010 09:33 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

*hat geschafft* machbar ist es also, sage aber gleich, dass es ne heiden Arbeit wird, und manche Sachen dadurch nicht mehr funktionieren könnten!
Meine Jägerhütte mag z.b. nicht mehr mit den Farbcodes funzen.. aber naja. die wurde ohnehin ausgebaut ^^
Titel färben geht bei mir wo anders, wo die User auch ihren Namen gleich mit ändern können... *baut sich nen RP-Server da ist ihr das egal*
Habe aber Chatvorschau und alles andre hinbekommen
klappt im übrigen besser, wenn man gewisse Tags (bei mir z.B. * + und #) als Vorzeichen für zweistellige Farbcodes nimmt und diese dann aus der Liste der einstelligen entfernt (Ist auch DAU freundlicher)

Wenn du willst können wir uns per PM zusammensetzen. Werde das Ding hier nicht veröffentlichen, weil a) zu viel Arbeit drinnen steckt
und b) es durch solche Dinge eben nicht mit dem normalen Logd kompatibel wäre.. das müsste man dann halt gemeinsam lösen
*hat keine Lust sich von zisch Leuten anhören zu müssen, warum nun dieses und jenes nicht funktioniert, nur weil sie das Zeuch veröffentlicht hat*

Autor:  Harthas [ Di 16 Nov, 2010 10:25 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Oder ganz einfach "`" als Vorzeichen für einstellige Tags verwenden, und "#" oder "~" oder irgend etwas anderes als Vorzeichen für zweistellige Tags?

Dadurch könnte man zumindest die Kompatibilität zum bisherigen System gewährleisten.

Autor:  MySql [ Di 16 Nov, 2010 15:52 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Du kannst die Appoencode Funktion auch ganz einfach (und ja, dass ist wirklich einfach) abändern. Hatte auch das Problem, dass ich zu viele Farben, allerdings zu wenig Zeichen hatte. Höhö. Letztendlich konnte ich später so viele Zeichen wie ich wollte für eine Farbe eintragen.

$this->bbcode_second_pass_code('', '[@] = Grün
[EinfachGanzVieleZeichenFürGelb] = Gelb.')

Ich schau mal ob ich die veränderte Funktion noch mal finde, da ich nicht weiß ob ich die auch die externe Festplatte kopiert habe. Sofern ich sie finde, schick ich sie Dir per PN. Notfalls kann ich dir die Funktion auch noch mal schreiben.

Wenn Du aber nicht sooo lange warten willst: Du musst genau genommen nur gucken wie sich die While-Abfrage aufbaut und daran ein paar Dinge verändern.

Viel Glück.

Autor:  MySql [ Di 16 Nov, 2010 16:58 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Da auf der Festplatte nicht mehr gefunden, eben noch mal. Es ist [!!!] generell nur die Appoencode-Funktion. Verändert, damit mehrere Tags zugänglich sind. Funktioniert so auch , würde diese Funktion trotzdem nur als 2. Funktion nutzen und nicht als Hauptfunktion. Wieso? Habe nur eben die Abfrage verändert, damit er mehrere Tags erkennt. Alles weitere müsstest Du selbst ändern. (Chat usw.)

$this->bbcode_second_pass_code('', 'function getColor($data) {

while( !(($x=strpos($data,"[")) === false) && !(($y=strpos($data,']')) === false)){

$countTags = $y-$x;
$tag=substr($data,$x+1,$countTags-1);
$append=substr($data,0,$x);
$output.=($priv?$append:HTMLEntities($append));
$data=substr($data,$x+$countTags+1);

switch($tag){
case "0":
if ($nestedtags[font]) $output.="</span>";
unset($nestedtags[font]);
break;
case "1":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colDkBlue'>";
break;
case "2":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colDkGreen'>";
break;
case "3":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colDkCyan'>";
break;
case "4":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colDkRed'>";
break;
case "5":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colDkMagenta'>";
break;
case "6":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colDkYellow'>";
break;
case "7":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colDkWhite'>";
break;
case "8":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colLime'>";
break;
case "9":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colBlue'>";
break;
case "!":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colLtBlue'>";
break;
case "@":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colLtGreen'>";
break;
case "#":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colLtCyan'>";
break;
case "$":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colLtRed'>";
break;
case "%":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colLtMagenta'>";
break;
case "^":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colLtYellow'>";
break;
case "&":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colLtWhite'>";
break;
case ")":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colLtBlack'>";
break;
case "~":
if (($session[user][dragonkills]>=5)||($session[user][superuser]>=2)){
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colBlack'>";
}
break;
case "Q":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colDkOrange'>";
break;
case "q":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colOrange'>";
break;
case "r":
case "R":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colRose'>";
break;
case "V":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colBlueViolet'>";
break;
case "v":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='coliceviolet'>";
break;
case "g":
case "G":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colXLtGreen'>";
break;
case "T":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colDkBrown'>";
break;
case "t":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colLtBrown'>";
break;
case "?":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colWhiteBlack'>";
break;
case "*":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colBack'>";
break;
case "A":
case "a":
if ($nestedtags[font]) $output.="</span>"; else $nestedtags[font]=true;
$output.="<span class='colAttention'>";
break;
case "c":
if ($nestedtags[div]) {
$output.="</div>";
unset($nestedtags[div]);
}else{
$nestedtags[div]=true;
$output.="<div align='center'>";
}
break;
case "H":
if ($nestedtags[div]) {
$output.="</span>";
unset($nestedtags[div]);
}else{
$nestedtags[div]=true;
$output.="<span class='navhi'>";
}
break;
case "b":
if ($nestedtags[b]){
$output.="</b>";
unset($nestedtags[b]);
}else{
$nestedtags[b]=true;
$output.="<b>";
}
break;
case "i":
if ($nestedtags[i]) {
$output.="</i>";
unset($nestedtags[i]);
}else{
$nestedtags[i]=true;
$output.="<i>";
}
break;
case "n":
$output.="<br>\n";
break;
case "w":
$output.=$session[user][weapon];
break;
case "`":
$output.="`";
break;
default:
$output.="[".$tag.']';
}
}
if ($priv){
$output.=$data;
}else{
$output.=HTMLEntities($data);
}
return $output;
}')

Autor:  Shaddar [ Fr 19 Nov, 2010 20:49 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Danke schonmal für die hilfreichen Antworten. Werd das mal die Tage ausprobieren :D

Autor:  Shaddar [ Sa 12 Feb, 2011 17:11 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Ich habe mich daran versucht die Sache mit den doppelten Farbcodes hinzubekommen, bis mir eine vermeintlich einfachere Lösung eingefallen ist. Statt doppelte Farbcodes soll es nu einfach ein weiteres Vorzeichen sein. Ich habe mich hier für ´ entschieden, weil es einfach nach naheliegenste ist, ber egal.

Habe die Tabelle um ein weiteres Attritbut "sign" erweitert, wo das dazugehörige Vorzeichen gespeichert wird. Entweder ` oder ´. Dann habe ich mich versucht die appoencode() umzuarbeiten, damit auch die neuen Codes angenommen werden. Dachte zuerst das es wohl nicht so schwierig werden könnte, aber inzwischen raucht mir die Birne und ich check gerade garnichts mehr ...

$this->bbcode_second_pass_code('', 'function appoencode($data,$priv=false) {
global $nestedtags,$session,$appoencode;
/* Überarbeitet und verkleinert von Eliwood =D */ /*
$output = "";
while( !(($x=strpos($data,"`")) === false) && !(($x=strpos($data,"´")) === false)) {
$sign = substr($data,$x,1);
$tag = substr($data,$x+1,1);
$append = substr($data,0,$x);
$output.=($priv?$append:HTMLSpecialChars($append));
$data = substr($data,$x+2);
if ($tag == "0") {
if ($nestedtags['color']) $output.="</span>";
unset($nestedtags['color']);
} else if ($tag == $sign) {
$output.=$sign;
} else {
if (isset($appoencode[$tag]) && $appoencode[$tag]['sign']==$sign) {
$tagrow = $appoencode[$tag];
if (empty($tagrow['color'])) {
if ($nestedtags[$tagrow['tag']] && strchr($tagrow['tag']," /")==false) {
$output.="</".$tagrow['tag'].">";
unset($nestedtags[$tagrow['tag']]);
} else if (strchr($tagrow['tag']," /")==true) {
$output.="<".$tagrow['tag'].">\n";
} else {
$output.="<".$tagrow['tag']." ".$tagrow['style'].">";
$nestedtags[$tagrow['tag']] = true; }
} else {
if ($nestedtags['color']) $output.="</span>"; else $nestedtags['color']=true;
$output.="<span style='color: #".$tagrow['color'].";'>"; }
} else {
$output.=$tag; }
}
}

if ($priv) {
$output.=$data;
} else {
$output.=HTMLSpecialChars($data); }
return $output; }')

Ich weiß, dass ich das im Prinzip für das andere Vorzeichen genauso machen müsste, aber irgendwie ist meine Birne grad hohl ... mit dem && geht es momentan ohnehin noch nicht, speziell weil er dann das $x überschreibt ... einzeln geht es natürlich xD Meine Frage ist halt nur wie ich die beiden nun vereinigen kann, bin für jeden Tipp dankbar ^^

Autor:  MySql [ So 13 Feb, 2011 18:00 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Ohne mir den Snippet nun genau angesehen zu haben, würde ich folgendes vorschlagen:

$tag == $sign - Weg.

Alternativ:

$this->bbcode_second_pass_code('', 'switch( $sign ) {

case '´':
# Input.
break;

case '`':
#Input.
break;

}')

Oder alternativ mit einer If-Abfrage. Der Tag kann allerdings nicht "gleich" Sign sein. :P

Autor:  Chaos [ Mi 16 Feb, 2011 18:53 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

dieser ansatz wird so nicht hinhauen

Zitat:
while( !(($x=strpos($data,"`")) === false) && !(($x=strpos($data,"´")) === false)) {


Den && wird nicht funktionieren weil er dann beides erwartet, selbst wenn immer beides da wäre wird der string in dem script immer gekürzt so das am ende nur noch eins da sein kann und er niemals alle farben ersetzen würde.
Die Lösung wäre da eigentich eher eine ODER abfrage. Das haut jedoch nicht hin weil er dann prüft ob $x einen wert hat und $y nicht besetzt... das führt dann auch zum gleichen problem, der string wird bei $x abgeschnitten und werte von $y die dazwischen liegen gehen einfach verloren und werden nicht in farben umgewandelt.

EDIT: kann auch gut sein das ich das falsch sehe XD

Autor:  Shaddar [ Fr 18 Feb, 2011 16:00 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Hab da mal was zusammen gebastelt. Funktioniert zwar soweit, aber schön ist sicherlich was anderes ^^
Mein einziges Problem ist nun eigentlich nurnoch das Javascript für die Chatvorschau ... doof nur das ich von JS Mal garkeine Ahnung habe -.-

Function Appoencode
$this->bbcode_second_pass_code('', 'function appoencode($data,$priv=false) {
global $nestedtags,$appoencode;
if ($priv==false) {
$data = HTMLSpecialChars($data);
$data = str_replace('&amp;','&',$data); }
while( !(($x=strpos($data,"`")) === false)) {
$sign = substr($data,$x,1);
$tag = substr($data,$x+1,1);
$ende = substr($data,$x+2);
$data = substr($data,0,$x);

if ($tag == "0") {
if ($nestedtags['color']) $data.="</span>";
unset($nestedtags['color']);
} else if ($tag == $sign) {
$data.=$sign;
} else {
if (isset($appoencode[$sign.$tag]) && $appoencode[$sign.$tag]['sign']==$sign) {
$tagrow = $appoencode[$sign.$tag];
if (empty($tagrow['color'])) {
if ($nestedtags[$tagrow['tag']] && strchr($tagrow['tag']," /")==false) {
$data.="</".$tagrow['tag'].">";
unset($nestedtags[$tagrow['tag']]);
} else if (strchr($tagrow['tag']," /")==true) {
$data.="<".$tagrow['tag'].">\n";
} else {
$data.="<".$tagrow['tag']." ".$tagrow['style'].">";
$nestedtags[$tagrow['tag']] = true; }
} else {
if ($nestedtags['color']) $data.="</span>"; else $nestedtags['color']=true;
$data.="<span style='color: #".$tagrow['color'].";'>"; }
} else {
$data.=$tag; }
}
$data.=$ende; }

while( !(($x=strpos($data,"´")) === false)) {
$sign = substr($data,$x,1);
$tag = substr($data,$x+1,1);
$ende = substr($data,$x+2);
$data = substr($data,0,$x);

if ($tag == "0") {
if ($nestedtags['color']) $data.="</span>";
unset($nestedtags['color']);
} else if ($tag == $sign) {
$data.=$sign;
} else {
if (isset($appoencode[$sign.$tag]) && $appoencode[$sign.$tag]['sign']==$sign) {
$tagrow = $appoencode[$sign.$tag];
if (empty($tagrow['color'])) {
if ($nestedtags[$tagrow['tag']] && strchr($tagrow['tag']," /")==false) {
$data.="</".$tagrow['tag'].">";
unset($nestedtags[$tagrow['tag']]);
} else if (strchr($tagrow['tag']," /")==true) {
$data.="<".$tagrow['tag'].">\n";
} else {
$data.="<".$tagrow['tag']." ".$tagrow['style'].">";
$nestedtags[$tagrow['tag']] = true; }
} else {
if ($nestedtags['color']) $data.="</span>"; else $nestedtags['color']=true;
$data.="<span style='color: #".$tagrow['color'].";'>"; }
} else {
$data.=$tag; }
}
$data.=$ende; }

return $data; }')

Function LoadTags
$this->bbcode_second_pass_code('', 'function Load_Tags() {
global $db,$link;
/* (c) 2005 by Eliwood & Serra */
$result = DB_Query("SELECT SQL_CACHE * FROM appoencode",LINK);
$tags = array();
while($row = DB_Fetch_Assoc($result)) {
$tags[$row['sign'].$row['code']] = $row; }
return $tags; } ')

Was haltet ihr davon ? Gibt sicherlich einiges was man daran noch verbessern könnte.
Und für einen Tipp bezüglich dem JS wäre ich überaus dankbar ^^

Autor:  Chaos [ Sa 19 Feb, 2011 11:18 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Also die Lösung hat auch große macken weshalb ich sie nicht nehmen würde.

Das Problem ist das du jetzt 2 durchläufe hast für die Farbcodes, dabei entsteht folgedes

du hast z.B. an Position 10 ein `g drin und er setzt dort einen tag ein und speichert sich das er nen tag reingesetzt hat damit er weiß das er einen zu schließen hat beim nächsten. Beim zweiten durchlauf hast du dann z.B. ein ´g an 8 stelle... dann wird er dir einen tag schließen ohne das einer geöffnet wurde. Es wird früher oder später zu fehlern führen.

Bsp. bei einem text von
Zitat:
´gtest`gtest

wäre das bei rausgekommen:
Zitat:
</span><span style="">test<span style="">test</span>

Autor:  Shaddar [ Sa 19 Feb, 2011 13:07 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Hast du das getestet ? Bei mir macht er das alles sauber und ordentlich, weil ich ja zuerst alle Codes mit ` durchgehe und dannach im Anschluss die mit ´.

Beispiel:

`gTe`@st`dte`jxt
$this->bbcode_second_pass_code('', '<span style="color: rgb(136, 255, 136);">Te</span><span style="color: rgb(0, 255, 0);">st</span><span style="color: rgb(0, 221, 0);">te</span><span style="color: rgb(0, 187, 0);">xt</span>')


`UTe´Nst`6te`Mxt`^2
$this->bbcode_second_pass_code('', '<span style="color: rgb(255, 187, 0);">Te<span style="color: rgb(255, 204, 0);">st</span><span style="color: rgb(255, 221, 0);">te</span><span style="color: rgb(255, 238, 0);">xt</span><span style="color: rgb(255, 255, 0);">2</span>')

Autor:  Chaos [ Sa 19 Feb, 2011 13:57 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

getestet nicht da ich kein logd server mehr habe, aber ich erinner mich an das script weil ich damals die gleiche idee hatte XD.

und ich hatte damals auch dieses problem.

Du hast natürlich recht aber dein script prüft eben erst nur die ` und dann die ´ das script speichert sich aber eben um die tags richtig schließen zu können ob was offen ist oder zu. und wenn bei dem ´ am ende des strings was geöffnet wird speichert er sich das er was schließen muss. Beim zweiten durchlauf mit ` setzt er dann wenn direkt am anfang schon was vorkommt einen close tag der da nicht hingehört. Das script geht aber davon aus das es dahin gehört weil ihm der letzte durchlauf gesagt hat er hat beim nächsten einsetzen nen tag zu schließen.

Wie gesagt es funktioniert, nur wird es eben früher oder später zu diesen fehlern führen, das hängt von der konstelation der farbcodes ab.

Aber ist auch möglich das ich das script falsch verstanden habe da ichs mir nicht im detail durchgelesen habe.

EDIT: ok hab mir deine ausgabe angesehen hatte recht, er macht genau das falsch
Zitat:
<span style="color: rgb(255, 187, 0);">Te<span style="color: rgb(255, 204, 0);">st</span><span style="color: rgb(255, 221, 0);">te</span><span style="color: rgb(255, 238, 0);">xt</span><span style="color: rgb(255, 255, 0);">2</span>


er eröffnet einen neuen spantag ohne den letzten geschlossen haben. das ist vllt in dem beispiel nichts weiter... aber es wird fälle geben wo das komplett zerschossen werden kann vor allem beim IE da er solche fehler gar nicht mag.


EDIT 2:
versuch das hier, ist ungetestet und nicht sonderlich schön aber sollte funktionieren
$this->bbcode_second_pass_code('', 'function appoencode($data,$priv=false) {
global $nestedtags,$appoencode;
if ($priv==false) {
$data = HTMLSpecialChars($data);
$data = str_replace('&amp;','&',$data); }
while(true){

$x = strpos($data, '`');
$y = strpos($data, '´');

if($x === false && $y===false){
break;
}elseif(($y !== false) && ($x > $y)){
$tag = substr($data, $y+1, 1);
$append = substr($data, 0, $y);
$output .= $append;
$data = substr($data, $y+2);
$sign = '´';
}else{
$tag = substr($data, $x+1, 1);
$append = substr($data, 0, $x);
$output .= $append;
$data = substr($data, $x+2);
$sign = '`';
}

if ($tag == "0") {
if ($nestedtags['color']) $data.="</span>";
unset($nestedtags['color']);
} else if ($tag == $sign) {
$data.=$sign;
} else {
if (isset($appoencode[$sign.$tag]) && $appoencode[$sign.$tag]['sign']==$sign) {
$tagrow = $appoencode[$sign.$tag];
if (empty($tagrow['color'])) {
if ($nestedtags[$tagrow['tag']] && strchr($tagrow['tag']," /")==false) {
$data.="</".$tagrow['tag'].">";
unset($nestedtags[$tagrow['tag']]);
} else if (strchr($tagrow['tag']," /")==true) {
$data.="<".$tagrow['tag'].">\n";
} else {
$data.="<".$tagrow['tag']." ".$tagrow['style'].">";
$nestedtags[$tagrow['tag']] = true; }
} else {
if ($nestedtags['color']) $data.="</span>"; else $nestedtags['color']=true;
$data.="<span style='color: #".$tagrow['color'].";'>"; }
} else {
$data.=$tag; }
}
$data.=$ende; }

return $data; }')

Autor:  Shaddar [ Sa 14 Mai, 2011 19:25 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Ich habe das ganze nun so umgesetzt und es mir noch und nochmal angeschaut. Es funktioniert wie es soll und er sollte nun auch die Tags korrekt schließen, da er diese nun nicht mehr nacheinander sondern nebeneinander abarbeitet:

$this->bbcode_second_pass_code('', 'function appoencode($data,$priv=false) {
global $nestedtags,$session,$appoencode;
// Neue Version- Funktion ok
$output = "";

while (true) {
$x = strpos($data,"`");
$y = strpos($data,"´");
if (($x===false) && ($y===false)) break;

if ($x!==false) {
$signx = substr($data,$x,1);
$tagx = substr($data,$x+1,1); }

if ($y!==false) {
$signy = substr($data,$y,1);
$tagy = substr($data,$y+1,1); }

if ($x!==false && $y!==false) {
if ($x < $y) {
$sign = $signx;
$tag = $tagx;
$z = $x;
} else {
$sign = $signy;
$tag = $tagy;
$z = $y; }

} else if ($x!==false) {
$sign = $signx;
$tag = $tagx;
$z = $x;

} else if ($y!==false) {
$sign = $signy;
$tag = $tagy;
$z = $y; }

$output .= substr($data,0,$z);
$data = substr($data,$z+2);
if ($tag == "0") {
if ($nestedtags['color']) $output .= "</span>";
unset($nestedtags['color']);
} else if ($tag == $sign) {
$output .= $sign;
} else {
if (isset($appoencode[$sign.$tag])) {
$tagrow = $appoencode[$sign.$tag];
if (empty($tagrow['color'])) {
if ($nestedtags[$tagrow['tag']] && strchr($tagrow['tag']," /")==false) {
$output .= "</".$tagrow['tag'].">";
unset($nestedtags[$tagrow['tag']]);
} else if(strchr($tagrow['tag']," /")==true) {
$output .= "<".$tagrow['tag'].">\n";
} else {
$output .= "<".$tagrow['tag']." ".$tagrow['style'].">";
$nestedtags[$tagrow['tag']] = true; }
} else {
if ($nestedtags['color']) $output .= "</span>"; else $nestedtags['color'] = true;
$output .= "<span style='color: #".$tagrow['color'].";'>"; }
} else {
$output .= $tag; }}}

if ($priv) {
$output .= $data;
} else {
$output .= HTMLSpecialChars($data); }
return $output; }')
$this->bbcode_second_pass_code('', 'function Load_Tags() {
global $db,$link;
/* (c) 2005 by Eliwood & Serra */
$result = DB_Query("SELECT SQL_CACHE * FROM appoencode",LINK);
$tags = array();
while($row = DB_Fetch_Assoc($result)) {
$tags[$row['sign'].$row['code']] = $row; }
return $tags; }')

Das nur zum Verständnis, denn ich nun komme meine eigentliche Frage oder mein Problem ...
Wir nutzen ja das Kommentarsystem von Eliwood. Dieses wollte ich nun noch an die neuen Farbcodes anpassen, doch leider tut sich nun nichts mehr. Ich habe nicht ganz soviel Ahnung davon und habe entsprechend keinen Fehler gefunden, vielleicht kann mir ja Jemand weiterhelfen - wäre echt super.

$this->bbcode_second_pass_code('', '
case 'chatpreview.withfarbhack':
global $appoencode;
# Chatvorschau, Orignal von Chaosmaker, modifziziert von blackfin. Danke an Rikka für das rausrücken vom Code *g*
# Weitere, kleine Modifikationen von Basilius Sauter.

$my_name = $this->user['name'] ;
$clearname = str_replace("`0","",$this->striptag($my_name));
$my_lastchar = substr($clearname,strlen($clearname)-1,0) ;
// $myemoteuse = $this->user['emoteuse'] ;

$includinscript = '';
reset($appoencode);
while (list($key,$val) = each($appoencode)) {
$includinscript .= '
case "'.$key.'":
if(openspan) output = output + "</span>"; else openspan = true;
output = output + "<span style=\"color: #'.$val['color'].';\">";
break;'; }

$script .= <<<JS
<script type="text/javascript">
<!--
function appoencode(data,talkline,thismycolor,thisemotecolor, thisthirdpersonemote) {
var Fundstelle = -1;
var x = -1;
var tagx = '';
var signx = '';
var y = -1;
var tagy = '';
var signy = '';
var tag = '';
var sign = '';
var suche = '';
var append = '';
var output = '';
var openspan = false;
var myname = '$my_name';
var mylchar = '$my_lastchar' ;
var mecheck = '' ;
var doppelcheck = '' ;
var xcheck = '';
var mesearch = 0 ;

if(thisemotecolor == '') thisemotecolor = '&' ;
if(thismycolor == '') thismycolor = '#' ;
if(thisthirdpersonemote == '') thisthirdpersonemote = '&';

data = data.replace('/mE','/me');
data = data.replace('/ME','/me');
data = data.replace('/Me','/me');

data = data.replace('/Em','/em');
data = data.replace('/eM','/em');
data = data.replace('/EM','/em');

data = data.replace('/mS','/ms');
data = data.replace('/MS','/ms');
data = data.replace('/Ms','/ms');

data = data.replace('/X', '/x');

var clname = myname.replace('`0','');

mecheck = data.substr(0,3).toLowerCase() ;

if(mecheck == '/me') {
data = data.replace('/me',''+myname+' `'+thisemotecolor+'');
mesearch = 1 ;
}


if(mecheck == '/ms') {

if(mylchar == 's') {
alert(mylchar) ;
data = data.replace('/ms',''+clname+'\'`'+thisemotecolor+' ');
}else {
data = data.replace('/ms',''+clname+'s`'+thisemotecolor+' ');
}
mesearch = 1 ;
}

if(mecheck == '/em') { // && myadmin == 1) {
data = data.replace('/em','`^NSC: `'+thisthirdpersonemote+' ');
data = '`&'+data+'' ;
mesearch = 1 ;
}

doppelcheck = data.substr(0,1).toLowerCase();
if(doppelcheck == ':') {
data = data.replace(':',''+myname+' `'+thisemotecolor+'');
mesearch = 1 ;
}

xcheck = data.substr(0,2).toLowerCase();
if(xcheck == '/x') {
data = data.replace('/x',''+myname+' `'+thisemotecolor+'');
mesearch = 1 ;
}


if(mesearch == 0 && data.length != 0) {
data = ''+myname+' `3' +talkline+' : `'+thismycolor+'"'+data+'`'+thismycolor+'"' ;
}

while (true) {
x = data.search(/`/);
y = data.search(/´/);
if ((x == -1) && (y == -1)) break;

if (x != -1) {
signx = data.substr(x, 1);
tagx = data.substr(x+1, 1); }

if (y != -1) {
signy = data.substr(y, 1);
tagy = data.substr(y+1, 1); }

if (x != -1 && y != -1) {
if (x < y) {
sign = signx;
tag = tagx;
Funstelle = x;
} else {
sign = signy;
tag = tagy;
Funstelle = y; }

} else if (x != -1) {
sign = signx;
tag = tagx;
Funstelle = x;

} else if (y != -1) {
sign = signy;
tag = tagy;
Funstelle = y; }

append = data.substr(0,Fundstelle);
append = append.replace(/</,'&lt;');
append = append.replace(/>/,'&gt;');
suche = sign + tag;
output = output + append;
data = data.substring(Fundstelle+2,data.length);

if (tag == '0') {
if (openspan) output = output + "</span>";
openspan = false;
} else if (tag == 'n') {
if (openspan) output = output + "</br>";
} else if (tag == sign) {
output = output + sign;
} else {
switch (suche) {
$includinscript

default:
output = output + sign + tag;
}
}
}

output += data;
if (openspan) output += '</span>';

output = output.replace(/\\n/g, '<br />');
output = output.replace(/\\\\n/gi, '<br />');

return output;
}
//-->
</script>
JS;')

Edit:
Okay, habe die Fehler nun doch noch selbst gefunden, funktioniert nun alles wie's soll -freu-

Autor:  Adreyu [ Mo 13 Jun, 2011 15:45 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Halli hallo !

Ich habe schon seit einer ganzen Weile nach einem Weg gesucht, wie man genau sowas umsetzen kann, weil ich ein absoluter Farbennarr bin und mir so langsam die Zeichen ausgehen! Ich würde die Farben vermutlich einfach ein wenig umändern, wenn ich dadurch nicht ein riesen Chaos stiften und etliche Spieler verärgern würde.. deshalb ist diese Umsetzung, wie sie hier aufgeführt wird wohl die optimalste für mich..

Hast du in den oben angegebenen Skripten deine Fehler ausgebessert ?

Wenn nicht, würdest du mich zum glücklichsten Menschen der Welt machen, wenn du sie vielleicht hier posten, oder mir per PN übersenden könntest! Ich würde glatt dafür sterben.. oder töten :,D nein, Spaß beiseite, aber das wäre wirklich eine Wucht!

Grüßelchen
:)

Autor:  Saaxa [ Di 29 Nov, 2011 20:41 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

hiho... nutze die standard funktion ohne DB
function appoencode($data,$priv=false){
.....

hab dort unten
PHP:
case "w":
$output.=$session[user][weapon];
break;

gefunden und
PHP:
case "a":
$output.=$session[user][armor];
break;

angehangen.
jetzt zu meinem problem:
kann `w und `a in addnav(); und in output(); problemlos nutzen, es wird der richtige waffen/rüstungsname in texten und links wiedergegeben, doch wenn ich in der chatleiste ":: nimmt seine `w und putzt sie fein säuberlich" o.ä. schreibe erscheint nur ein Leerzeichen.

wo muss ich was ändern, um es auch im chat nutzen zu können?

Autor:  Charon [ Di 29 Nov, 2011 22:14 ]
Betreff des Beitrags:  Re: Doppelte + Einfache Farbcodes

Hallo,
in der Funktion viewcommentary() findest du eine Zeile die etwa so aussieht:
$row['comment']=preg_replace("'[`][^123456789!@#$%&Qqr~^VvgTtKfFGklLRmMpPjJsSdDib]'","",$row['comment']);
Alle dort nicht eingetragenen Codes werden im Chat herausgefiltert.

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/