|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 29.12.2004, 11:49 Titel: C++ Syntax Highlighting |
|
|
Hi,
seit heute gibt es ja einen neuen BBCode namens CPP, mit dem man C++ Quellcode farblich hervorheben kann. Leider funktioniert er noch nicht ganz zuverlässig und hat ein paar Bugs. Z.B. werden Schlüsselwörter innerhalb von Kommentaren angezeigt.
Da ich nicht das PHP Wissen habe um all diese Aufgaben zu lösen, eröffne ich hiermit das Highlighting Projekt.
Das ist der aktuelle Sourcecode
PHP: | an style="color: #000000"><?php // START CPP Syntax Highlighter MOD
/**
* CPP MOD
* Original code/function by phpBB Group
* Modified by JW Frazier / Fubonis < php_fubonis@yahoo.com > for PHP highlighting
* Modified again by Sander Maréchal < s.marechal@jejik.com > for C/C++ highlighting
*/
function bbencode_second_pass_cpp($text, $uid, $bbcode_tpl)
{
//split the post up and grab the code blocks
$code_start_html = $bbcode_tpl['cpp_open'];
$code_end_html = $bbcode_tpl['cpp_close'];
$matches = array();
$match_count = preg_match_all("#\[cpp:1:$uid\](.*?)\[/cpp:1:$uid\]#si", $text, $matches);
//this array holds all the C++ keywords. They will be highlighted in blue
$cppcodearray = array ("__abstract", "__alignof", "__asm", "__assume",
"__based", "__box", "__cdecl", "__declspec",
"__delegate", "__event", "__except", "__fastcall",
"__finally", "__forceinline", "__gc", "__hook",
"__identifier", "__if_exists", "__if_not_exists", "__inline",
"__int8", "__int16", "__int32", "__int64",
"__interface", "__leave", "__m64", "__m128",
"__m128d", "__m128i", "__multiple_inheritance", "__nogc",
"__noop", "__pin", "__property", "__raise",
"__sealed", "__single_inheritance", "__stdcall", "__super",
"__try_cast", "__try/__except", "__try/__finally", "__unhook",
"__uuid_of", "__value", "__virtual_inheritance", "__w64",
"asm", "bool", "break", "case", "catch", "char",
"class", "const", "const_cast", "continue",
"default", "delete", "deprecated", "dllexport",
"dllimport", "do", "double", "dynamic_cast",
"else", "enum", "explicit", "extern",
"false", "float", "for", "friend",
"goto", "if", "inline", "int",
"long", "mutable", "naked", "namespace",
"new", "noinline", "noreturn", "nothrow",
"novtable", "operator", "private", "property",
"protected", "public", "register", "reinterpret_cast",
"return", "selectany", "short", "signed",
"sizeof", "static", "static_cast", "struct",
"switch", "template", "this", "thread",
"throw", "true", "try", "typedef",
"typeid", "typename", "union", "unsigned",
"using", "uuid", "virtual", "void",
"volatile", "__wchar_t", "while",
"#define", "#error", "#import", "#undef",
"#elif", "#if", "#include", "#using",
"#else", "#ifdef", "#line", "#endif",
"#ifndef", "#pragma");
for ($i = 0; $i < $match_count; $i++)
{
$before_replace = $matches[1][$i];
$after_replace = trim($matches[1][$i]);
$str_to_match = "[cpp:1:$uid]" . $before_replace . "[/cpp:1:$uid]";
$replacement = $code_start_html;
//replace the anti-HTML code with the real symbols
$after_replace = str_replace('<', '<', $after_replace);
$after_replace = str_replace('>', '>', $after_replace);
$after_replace = str_replace('&', '&', $after_replace);
//loop though all the keywords in the array and see if it is in the code text. If so,
//add <span style='color: #0000FF;'></span> to it. This function will match about
//99.9% of the keywords.
foreach ($cppcodearray as $cppcodetag)
{
$after_replace = ereg_replace("([^a-zA-Z0-9<>])(".$cppcodetag.")([^a-zA-Z0-9<>])", "\\1<span style='color:
#0000FF;'>\\2</span>\\3", $after_replace);
}
//start of a block of cpp comments (comment will becode green)
$after_replace = ereg_replace("/\\*", "<span style='color: #007700;'>\\0", $after_replace);
//end of a comment block
$after_replace = ereg_replace("\\*/", "\\0</span>", $after_replace);
//a single line comment (green)
$after_replace = ereg_replace("(//[^\\\n]*)(\\\n)", "<span style='color: #007700;'>\\1</span>\\2", $after_replace);
//anything between square brackets (for arrays) will be red
$after_replace = ereg_replace("(\\[)([^]]*)(\\])", "\\1<span style='color: #770000;'>\\2</span>\\3", $after_replace);
//highlights text-strings
$after_replace = ereg_replace("\"[^\"]*\"", "<span style='color: #007777'>\\0</span>", $after_replace);
// Replace 2 spaces with " " so non-tabbed code indents without making huge long lines.
$after_replace = str_replace(" ", " ", $after_replace);
// now Replace 2 spaces with " " to catch odd #s of spaces.
$after_replace = str_replace(" ", " ", $after_replace);
// Replace tabs with " " so tabbed code indents sorta right without making huge long lines.
$after_replace = str_replace("\t", " ", $after_replace);
// now Replace space occurring at the beginning of a line
$after_replace = preg_replace("/^ {1}/m", ' ', $after_replace);
//piece the post back together
$replacement .= $after_replace;
$replacement .= $code_end_html;
$text = str_replace($str_to_match, $replacement, $text);
}
$text = str_replace("[cpp:$uid]", $code_start_html, $text);
$text = str_replace("[/cpp:$uid]", $code_end_html, $text);
return $text;
}
// END CPP Syntax Highlighter MOD |
Vielleicht können wir hier Bugs sammeln und zusammen den Code verbessern. Manche hatten ja schon Ideen.
Was haltet ihr davon? |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 29.12.2004, 12:01 Titel: |
|
|
Syntax Higliight wurde glaube ich Zeit, hab schon Foren gesehen, wo das drin war, und es ist echt praktisch.
Code auf eigene Faust verbesser finde ich auch sehr gut, nur werd ich wohl leider nicht so viel dazu beitragen können. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 29.12.2004, 12:20 Titel: |
|
|
Ja, eine gute Idee. Vielleicht trage ich selbst auch was dazu bei.
Aber erst mal ein bisschen testen:
CPP: | #include <iostream>
int main(void)
{
//if the computer wants
if(true)
{
std::cout<<"Hello World...\nkeyword test: true";
}
/* if the computer
wants not */
else
{
DoNothing();
}
return 0;
}
|
Hmm...wäre es nicht besser, nur die Kommentare grün zu lassen und standardmäßig in schwarz/grau zu schreiben?
<edit>
Noch ein Bug: Das '<iostream>' hinter dem include wird nicht angezeigt.
</edit> _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Zuletzt bearbeitet von The Lord of Programming am 29.12.2004, 13:22, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 29.12.2004, 12:21 Titel: |
|
|
genau wollt ich auch schon sagen. Sollte wie in VC++ aussehen, Schlüsselwörter blau, Kommentare grün und Text schwarz. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 29.12.2004, 12:29 Titel: |
|
|
Das mit dem iostream liegt daran das die '<' und '>' nicht in ASCII Code umgewandelt werden. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 29.12.2004, 13:24 Titel: |
|
|
Noch ein Bug ^^
Die Keywords werden auch in Zeichenketten hervorgehoben:
CPP: | std::cout <<"false" ; |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Zuletzt bearbeitet von The Lord of Programming am 30.12.2004, 12:53, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 29.12.2004, 18:12 Titel: |
|
|
Hi,
ich hab mir den Code von dem mal angeschaut und muss sagen: grottig, vieles wird gar nicht beachtet.
Versuch doch mal den code den ich dir gegeben habe mit dem anderen zu erweitern so das dieser auch 3 Parameter hat Müsste nicht schwer sein da ja alles modular gehalten wurde.
denn >< und co müssen ersetzt werden genau wie zeichenketten usw. So wie er jetzt ist, ist es naja... _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 30.12.2004, 12:00 Titel: |
|
|
Patrick hat Folgendes geschrieben: | denn >< und co müssen ersetzt werden genau wie zeichenketten usw. So wie er jetzt ist, ist es naja... |
Meinst du diese 'tokens' ?
Was ist das überhaupt genau. Ich hab gesehen, dass da irgendwas mit md5 Funktionen gemacht wird.
Das stelle ich mir ziemlich rechenaufwändig vor? Gibt es da noch eine andere Möglichkeit?
Und was '<', '>' und '&' angeht. Diese 'anti-HTML' Codes werden am Anfang extra durch reale Symbole ausgetauscht. Das muss ja einen Sinn haben - wahrscheinlich für das highlighting.
Man kann sie ja später wieder rückersetzen...wie BlackLordOfDragons schon sagte.
Achja.. weiß jemand wozu das ist?
PHP: | an style="color: #000000"><?php // Replace 2 spaces with " " so non-tabbed code indents without making huge long lines.
$after_replace = str_replace(" ", " ", $after_replace);
// now Replace 2 spaces with " " to catch odd #s of spaces.
$after_replace = str_replace(" ", " ", $after_replace); |
Wenn ich das richig verstanden habe, wird hier 2 mal nach " " (2 Leerzeichen) gesucht und durch etwas anderes ersetzt. Erstmal verstehe ich nicht ganz warum man ein 2. Mal nach Doppelleerzeichen sucht, wenn man eine Zeile vorher schon alle ersetzt hat. Und dann verstehe ich nicht warum nicht einfach alle Leerzeichen mit aufgefüllt werden. |
|
Nach oben |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 30.12.2004, 12:07 Titel: |
|
|
Zitat: |
PHP: | an style="color: #000000"><?php // Replace 2 spaces with " " so non-tabbed code indents without making huge long lines.
$after_replace = str_replace(" ", " ", $after_replace);
// now Replace 2 spaces with " " to catch odd #s of spaces.
$after_replace = str_replace(" ", " ", $after_replace); |
|
ist ein Leerzeichen, &sdfsdf; sind Sonderzeichen die in html benutz werden, durch die Funktion ersetzt man doppelte Leerzeichen, und macht ein einzelnes daraus.
Danach werden die einzelnen durch ersetzt. Wenn man am anfang einer Zeile in html ein normales Leerzeichen macht wird es ignoriert, wird niemals ignoriert. (das braucht man bei [code] tags für die Einrückungen)
> ist das gleiche wie > nur eben das html Sonderzeichen, dadurch wird verhindert das man das ganze mit einem html tag verwechselt. _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 30.12.2004, 12:18 Titel: |
|
|
BlackLordOfDragons hat Folgendes geschrieben: | ... durch die Funktion ersetzt man doppelte Leerzeichen, und macht ein einzelnes daraus. |
Die erste Funktion ersetzt ein Doppelleerzeichen durch " ".
Das ist aber mehr ein ein einzelnes Leerzeichjen. Oder sehe ich da was falsch? Einmal ' ', gefolgt von einem "normalen" Leerzeichen.
BlackLordOfDragons hat Folgendes geschrieben: | Danach werden die einzelnen durch ersetzt. |
Wo genau werden denn einzelne Leerzeichen ersetzt? In der zweiten Funktion werden auch "2 spaces" ersetzt.
Zuletzt bearbeitet von KI am 30.12.2004, 13:13, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 30.12.2004, 12:55 Titel: |
|
|
@KI: Hmm...du könntest Recht haben. Ich hab das mal probiert - es ist kein Unterschied zu vorher sichtbar:
The Lord of Programming hat Folgendes geschrieben: | CPP: | std::cout <<"false" ; |
|
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 05.01.2005, 03:03 Titel: |
|
|
The Lord of Programming hat Folgendes geschrieben: | Hmm...wäre es nicht besser, nur die Kommentare grün zu lassen und standardmäßig in schwarz/grau zu schreiben? |
Erledigt. Der "normale" Code ist jetzt schwarz. Es gibt keine Codeänderung.
(Ich hab eine neue Klasse in die entsprechenden CSS Dateien getan)
Was mir noch aufgefallen ist:
Wie man sieht, werden Schlüsselwörter, wie void, nur hervorgehoben, wenn davor und dahinter anderer Text ist. Wer wüsste woran das liegen könnte
edit:
dies gilt auch für
|
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 19.01.2005, 22:52 Titel: Re: C++ Syntax Highlighting |
|
|
PHP: | an style="color: #000000"><?php //replace the anti-HTML code with the real symbols
$after_replace = str_replace('<', '<', $after_replace);
$after_replace = str_replace('>', '>', $after_replace);
$after_replace = str_replace('&', '&', $after_replace); |
Das hab ich jetzt auskommentiert. Keine Hanung wozu das gut war. Jetzt verschwindet wenigstens <iostream> nicht mehr. |
|
Nach oben |
|
|
C++Builder Senior JLI'ler
Anmeldedatum: 04.10.2003 Beiträge: 235
Medaillen: Keine
|
Verfasst am: 20.01.2005, 13:44 Titel: |
|
|
siehe php.net/str_replace
das heißt mit dem Code wird das HTML codierte < in ein richtiges < umgewandelt so das es jeder Browser <iostream> wie ein HTML Tag interpretiert, daraus folgt das <iostream> nicht angezeigt wird. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|