Syntaxhighlighter will nicht so recht



  • Ich wollte einen Syntaxhighlighter schreiben, der geht allerdings gar nicht.
    Hier mal der Code:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    	<title>New document</title>
    <meta name="generator" content="TSW WebCoder">
    </head>
    <link rel="stylesheet" href="Style.css" />
    <body>
    ...
    <?php 
    
    $content = "<code>
    		   #include <iostream>
    		   using namespace std;
    
    		   int main()
    		   {
    		   		cout << \"Hello World\" << endl;
    		   		return 0;
    		   }
    		   </code>";
    
    $keywords = array("float", "int", "double", "long", "short", "unsigned", "signed", "void", "new", "delete", "static_cast",
    "dynamic_cast", "virtual", "inline", "extern", "class", "struct", "for", "while", "do", "if", "this", "return", "operator", "const_cast", "reinterpret_cast", "public", "protected", "private", "const", "volatile", "static", "throw", "catch", "template", "typedef", "typename", "enum", "friend", "bool", "char", "signed", "typeid", "namespace", "break", "continue", "switch", "case", "else", "else if", "explicit", "export", "true", "false", "and", "or_eq", "and_eq", "using", "not", "bitand", "not_eq", "wchar_t", "bitor", "xor", "mutable", "or", "xor_eq","default", "goto", "auto", "union", "register", "compl");
    foreach($keywords as $key)
    {
    $content = preg_replace("/".$key."/", "<div class=\"keyword\">".$key."</div>", $content);
    }
    echo $content;
    
    ?>	
    <br /><br />	   
    ...
    </body>
    </html>
    

    1. Ich musste den Text außerhalb des Code Bereichs aus dem String raußschmeißen, kann man es auch so einstellen, dass nur in <code> Abschnitten gesucht wird?

    2. Das kommt dan raus:

    #include ord">using ord">namespace std; ord">class="keyword">int main() { cout << "Hello World" << endl; ord">return 0; }

    Wie bekomm ich diese Fehler weg und welche sind noch drinnen?



  • Glamdrink schrieb:

    Ich wollte einen Syntaxhighlighter schreiben, der geht allerdings gar nicht.

    aber meiner geht.
    http://www.volkard.de/Software/Clientsided Syntax-Highligter/

    edit: ups, du benutzt a php. dann hilft dir meiner nix.


  • Mod

    1. verwende str_replace
    2. mit preg_match kannst du den Inhalt von <code>-Tags auslesen - alternativ und vermutlich besser geht es mit strpos und substr
    3. dein Highlighter ist Fehlerhaft: denn ein keyword ist nicht immer keyword. zB wenn es in einem string steht oder nur ein Teil eines Wortes ist - dann darf es nicht gehighlightet werden.

    schau dir mal http://www.beautifier.org/ an



  • Noch mehr Probleme:

    1. Dein Ersetzungsstring beinhaltet selbst wieder Schlüsselwörter (z.B. 'class') damit machst du dir dann alles kaputt.

    Ein lösung mit PREGS wäre etwas wie

    $preg = '~[^A-Za-z_0-9]+(' . implode('|', $keywords) . ')[^A-Za-z_0-9]+~i';
    $content = preg_replace($preg, '<div class="...">\\1</div>', $content);
    

    Dann brauchst du auch kein foreach. Gebe jetzt aber keine Garantie für's Funktionieren. Nur der Grundgedanke sollte dir klar sein.

    @Shade of Nine: Bei 2) Kann ich dir absolut nicht zustimmen. Für solche Aufgaben sind pregs wie geschaffen. Solange es nicht in irgendwelche kontextsensitiven und verschachtelten Ebenen geht. Und 1) bringt nichts - siehe mein 4). :p


Anmelden zum Antworten