JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=d51b6bc587a0e592a5ec606829a0c254Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

C++ Syntax Highlighting
Gehe zu Seite 1, 2, 3, 4  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Projekte
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
KI
JLI Master


Alter: 38
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 29.12.2004, 12:49    Titel: C++ Syntax Highlighting Antworten mit Zitat

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 Arrow
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('&lt;''<'$after_replace); 
      
$after_replace str_replace('&gt;''>'$after_replace); 
      
$after_replace str_replace('&amp;''&'$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 "&nbsp; " so non-tabbed code indents without making huge long lines. 
      
$after_replace str_replace("  ""&nbsp; "$after_replace); 
      
// now Replace 2 spaces with " &nbsp;" to catch odd #s of spaces. 
      
$after_replace str_replace("  "" &nbsp;"$after_replace); 

      
// Replace tabs with "&nbsp; &nbsp;" so tabbed code indents sorta right without making huge long lines. 
      
$after_replace str_replace("\t""&nbsp; &nbsp;"$after_replace); 

      
// now Replace space occurring at the beginning of a line 
      
$after_replace preg_replace("/^ {1}/m"'&nbsp;'$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. Smile Manche hatten ja schon Ideen.
Was haltet ihr davon?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 29.12.2004, 13:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 29.12.2004, 13:20    Titel: Antworten mit Zitat

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, 14:22, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 29.12.2004, 13:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 29.12.2004, 13:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
abc_d
JLI Master Trainee


Alter: 34
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 29.12.2004, 13:58    Titel: Antworten mit Zitat

Das liegt an strip_tags, man muss zuerst $text= str_replace('>','&gt;',$text); und &lt; machen.
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 29.12.2004, 14:24    Titel: Antworten mit Zitat

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, 13:53, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 29.12.2004, 19:12    Titel: Antworten mit Zitat

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 Smile Müsste nicht schwer sein da ja alles modular gehalten wurde. Smile

denn >< und co müssen ersetzt werden genau wie zeichenketten usw. So wie er jetzt ist, ist es naja... Very Happy
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 38
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 30.12.2004, 13:00    Titel: Antworten mit Zitat

Patrick hat Folgendes geschrieben:
denn >< und co müssen ersetzt werden genau wie zeichenketten usw. So wie er jetzt ist, ist es naja... Very Happy

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? Arrow
PHP:
an style="color: #000000"><?php       // Replace 2 spaces with "&nbsp; " so non-tabbed code indents without making huge long lines. 
      
$after_replace str_replace("  ""&nbsp; "$after_replace); 
      
// now Replace 2 spaces with " &nbsp;" to catch odd #s of spaces. 
      
$after_replace str_replace("  "" &nbsp;"$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 &nbsp; aufgefüllt werden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
abc_d
JLI Master Trainee


Alter: 34
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 30.12.2004, 13:07    Titel: Antworten mit Zitat

Zitat:

PHP:
an style="color: #000000"><?php       // Replace 2 spaces with "&nbsp; " so non-tabbed code indents without making huge long lines. 
      
$after_replace str_replace("  ""&nbsp; "$after_replace); 
      
// now Replace 2 spaces with " &nbsp;" to catch odd #s of spaces. 
      
$after_replace str_replace("  "" &nbsp;"$after_replace); 



&nbsp; 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 &nbsp; ersetzt. Wenn man am anfang einer Zeile in html ein normales Leerzeichen macht wird es ignoriert, &nbsp; wird niemals ignoriert. (das braucht man bei [code] tags für die Einrückungen)

&gt; 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 38
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 30.12.2004, 13:18    Titel: Antworten mit Zitat

BlackLordOfDragons hat Folgendes geschrieben:
... durch die Funktion ersetzt man doppelte Leerzeichen, und macht ein einzelnes daraus.

Die erste Funktion ersetzt ein Doppelleerzeichen durch "&nbsp; ".
Das ist aber mehr ein ein einzelnes Leerzeichjen. Oder sehe ich da was falsch? Einmal '&nbsp;', gefolgt von einem "normalen" Leerzeichen.

BlackLordOfDragons hat Folgendes geschrieben:
Danach werden die einzelnen durch &nbsp; 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, 14:13, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 30.12.2004, 13:55    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 38
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 05.01.2005, 04:03    Titel: Antworten mit Zitat

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:
CPP:
void

CPP:
bla void

CPP:
void bla

CPP:
bla void bla

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 Question

edit:
dies gilt auch für
CPP:
void void void
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 38
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 19.01.2005, 23:52    Titel: Re: C++ Syntax Highlighting Antworten mit Zitat

PHP:
an style="color: #000000"><?php       //replace the anti-HTML code with the real symbols 
      
$after_replace str_replace('&lt;''<'$after_replace); 
      
$after_replace str_replace('&gt;''>'$after_replace); 
      
$after_replace str_replace('&amp;''&'$after_replace); 


Das hab ich jetzt auskommentiert. Keine Hanung wozu das gut war. Jetzt verschwindet wenigstens <iostream> nicht mehr.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
C++Builder
Senior JLI'ler



Anmeldedatum: 04.10.2003
Beiträge: 235

Medaillen: Keine

BeitragVerfasst am: 20.01.2005, 14:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Projekte Alle Zeiten sind GMT
Gehe zu Seite 1, 2, 3, 4  Weiter
Seite 1 von 4

 
Gehe zu:  
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

Impressum