Les guerres d'un Responsable Informatique

Vous êtes passionnés comme moi de machines basse-consommation, ARM, Atom : rendez visite à mon partenaire !

Syntax highlight en PHP avec GeSHI

vendredi 18 mars 2011 à 20:15 | Dev
mise en oeuvre de GeSHI

La performance et l'optimisation de site web tenant chez moi de l’obsession, j'ai poursuivi mes recherches, afin de minimiser les temps de chargement des pages web. Jusqu'à présent pour la colorisation syntaxique de mes exemples j'utilisais du Javascript: temps de chargement moyen 2.1 sec, plus la mise en oeuvre côté browser (~environs 2 sec).

En effet, la partie traitement de la colorisation syntaxique, côté serveur, est négligeable. Elle peut le cas échéant être mise en cache. Cela permet de fournir au browser un fichier html, qui intègre la colorisation de la syntaxe de votre code.

Mon moteur de blog, utilise PHP, je cherchais donc, une librairie en PHP. J'ai mis peu de temps à trouver (il en existe peu) ... Tout a convergé vers GeSHI, une librairie qui "reconnait" plusieurs dizaines de langages, qui permet la mise en oeuvre simple de thème via une feuille de style CSS.

Passons directement au coding :) Je stocke dans $str du code html, avec une partie de code. Le script repère la zone à modifier avec la fonction preg_replace_callback, qui appelle la fonction replaceCode.

enable_classes permet d'indiquer les styles dans une feuille de style CSS. Dans le code qui suit, j'ai mis en oeuvre un style molokia, que j'utilise aussi pour VIM.

<? require('geshi/geshi.php'); $str = ' <html> <head> <style> pre { color: #f8f8f2; background-color: #272822;font: 80% "Lucida Console", monospace;width: auto;} .kw1, .kw2, .kw3, kw4 { color: #F92672; font-weight: bold } .st0, .st_h { color: #E6DB74 } .nu0 { color: #ae81ff } .br0, .sy0 { color: #999 } .vim .sy0 { color: #red } .re0, .re1, .re5 { color: #FD971F } .co0, .co1, .coMULTI { color: #75715e } pre.ol { background-color: #232526;} pre.li { background-color: #272822;} </style> </head> <body> <p>Test</p> <code class="ruby"> #!/usr/bin/env ruby require "rubygems" require "progressbar" require "net/http" if ARGV.size < 1 puts "usage vimeo.rb <id_video>" exit 1 else id = ARGV[0] match=1 end </code> function replaceCode($match) { $geshi = new GeSHi($match[2], $match[1]); $geshi->enable_classes(); $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS); return $geshi->parse_code(); } $mod=preg_replace_callback("#<code class=\"(.*)\">(.*?)</code>#s", "replaceCode", $str); print $mod; ?> colorisation syntaxique avec GeSHI

Voilà le résultat. Je compte le mettre en oeuvre dans la prochaine version de mon blog.

A propos de Vincent RABAH

Directeur des systemes d'information

Je suis DSI depuis 10 ans. Spécialiste en systèmes d'information et réseaux.
Expert en management, GreenIT et virtualisation de serveurs. Vous pouvez consulter l'ensemble de mon parcours.

I do speak English even if my blog is written in French ... Feel free to leave comments, I'll answer you !


Partagez cet article :



Fil des commentaires de cet article

4 commentaire(s) Commentaires »

  1. MagicFrog, après recherche, la page http://php.net/manual/fr/function.highlight-string.php indique que : highlight_string — Applique la syntaxe colorisée à du code PHP. Et à du code PHP uniquement ! Ce qui fait que si on veut coloriser de la syntaxe Ruby = MARCHE PAS :(

    Cordialement,
    Vincent

  2. MagicFrog, je ne connaissais pas cette fonction ... Je vais creuser! Si elle fait la même chose, je l'adopte ...

  3. Pour la coloration syntaxique du PHP, il est probablement plus simple d'utiliser le fonction native : highlight_string, non ?

  4. Un peu plus d'explications sur ce site : http://www.frasq.org/fr/coloration-syntaxique-des-fichiers-sources.
    Pour apprendre à écrire un CMS en PHP : http://www.frasq.org/fr/manuel/ecrire-un-cms-en-php.

Laisser un Commentaire

Quelle est la dernière lettre du mot zvqwdo ? :