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
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;
?>
Voilà le résultat. Je compte le mettre en oeuvre dans la prochaine version de mon blog.
A propos de Vincent RABAH
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 !
- Oreilly Velocity : Node.js
- Un SlideShow 3D avec HTML5 et CSS3
- Microsoft et Joyent portent Node.js sur Windows
- Node.js v0.6.0 est sorti
- Real-time log monitoring avec Node.js et Log.io
- Première release NodeJS pour Windows
- Vim-css-color plugin
- Video screen capture avec ffmpeg
- RSS avec NodeJS Socket.IO et Express
- Rewrite rules Nginx
Vous pouvez lire également :
Partagez cet article :





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
MagicFrog, je ne connaissais pas cette fonction ... Je vais creuser! Si elle fait la même chose, je l'adopte ...
Pour la coloration syntaxique du PHP, il est probablement plus simple d'utiliser le fonction native : highlight_string, non ?
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.