Design für Print und Web

Alternative zu highlight_file()

04.03.2009 um 15:08 Uhr
Emersacker
abgelegt unter PHP

Emersacker. Die Funktion highlight_file ist eine ganz nette Erfindung von PHP für Menschen, die ihren Code mt der Menschheit teilen wollen; ein hübsch buntes Syntax-Highlighting gibt es dabei gratis. Leider benutzt PHP4 für das syntaktische Farbenspiel das böse font-tag, in PHP5 gibt es das nettere span mit inline-styles für die Farben. Da habe ich mir jetzt was noch Netteres gezimmert, mit niedlichen kleinen class-Attributen für das Code-Styling!

Alternative zu highlight_file()

Ich bin selbst noch ganz verzückt von dieser kleinen barocken Spielerey, die es endlich erlaubt, den Quelltext auch noch mit verschieden großen Schriftarten, Fettschrift und Kursiv aufzumotzen. Besonders beliebt bei Jung und Alt, wenn der Code eher dürftig ist, hä,hä! :-)

Aber ich muss über mein kleines Funktiönchen noch ein wenig schwaffeln...

Also: zuerst einmal die PHP-Version herauskitzeln und mit version_compare() in ein schönes if() else einbiegen. So bereiten wir dem bösen font-tag bald ein spätes, aber plötzliches Ende! (wenn es nicht doch schon ein kleines span ist... duz-duz!

Als nächstes bereiten wir einen kleinen Angriff auf die ini-Einstellungen vor und schreiben die interessanten Knotentypen in ein Array. Das bg, na, das lassen wir mal außen vor, das brauchen wir heut' nicht.

Das eigentlich Pfiffige an der ganzen Geschichte ist, dass wir in der foreach-Schleife den einzelnen Syntax-Knoten jetzt ihre eigenen Namen als Highlight-Farbe verpassen. Juhu! Genialer Schachzug! Mit diesen Einstellungen übergeben wir den (hoffentlich gültigen) Dateinamen an highlight_file(), mit dem Parameter true damit es bloß kein Echo gibt. :-)

So können wir unseren String natürlich noch nicht ausgeben, das wäre jetzt etwas unbunt. Um es jetzt aber so richtig bunt treiben zu können (so das bringt wieder einen Haufen Trafic, hä,hä!) natürlich mit CSS (ich schau' sonst keine andere an, Baby!) müssen wir die Schleife nochmal durchlaufen.

Nachher hauen wir dann fett mit dem class-Attribut rein und raus mit dem font und allem was keine Miete zahlt!

Nebenbei die "ini" wieder sauber aufräumen mit ini_restore(), ist eh klar, wir sind schließlich keine Vandalen.

Und schon war's das, jetzt geht's schon an die Ausgabe, schön ordentlich wie es sich gehört, wir können den string nämlich wie das Original auch gleich mit echo rausbrüllen wenn es sein muss.

Habt Spaß!

Code Listing:

  • Listing 1: my_highlight_file.php
    <?php
    // Diese Alternative zur function highlight_file()
    // ersetzt das font-tag mit span in phpversion<5
    // und setzt ein Klassen-Attribut fr das CSS-Styling:

    function my_highlight_file($input_filename$return=false) {

        if( 
    version_comparephpversion(),'5' )== -) {
            
    $tag ='font';
            
    $attr='color="';
            
    $match = array('</font>');
            
    $replace = array('</span>');
        } else {    
            
    $tag 'span';
            
    $attr ="style=\"color: ";
            
    $match = array();
            
    $replace = array();
        }
        
        
    $nodetypes = array(
            
    'string',
            
    'comment',
            
    'keyword',
            
    'default',
            
    'html'
        
    );

        foreach (
    $nodetypes as $nodetype) {
            
    ini_set("highlight.$nodetype"$nodetype);
        }
      
        
    $string highlight_file($input_filename,true);

        foreach (
    $nodetypes as $nodetype) {
            
    $match[] = '<'.$tag.' '.$attr.$nodetype.'">';
            
    $replace[] = '<span class="'.$nodetype.'">';
            
    ini_restore("highlight.$nodetype");
        }

        
    $string str_replace($match,$replace,$string);

        if(
    $return) {
            return 
    $string;
        } else echo 
    $string;
    }
    // example:
    $code my_highlight_file(__FILE__,true);
    ?>
    <!DOCTYPE HTML>
    <html>
    <title>Alternative zur function highlight_file() mit CSS-Styling</title>
    <head>
    <style type="text/css">
    span.string {
    color:#d00;
    }
    span.comment {
    font-family:'Courier New',Courier,sans-serif;
    color:#ff8000;
    }
    span.keyword {
    color:#070;
    font-weight:bold;
    }
    span.default {
    color:#00b;
    }
    span.html {
    color:#000;
    font-size:8pt;
    font-family:Verdana;
    }
    </style>
    </head>
    <body>
    <?php echo $code;?>
    </body>
    </html>

    my_highlight_file.php (1,5 KB): Beispiel aufrufen