web-dev-qa-db-fra.com

PHP mise en évidence de la syntaxe

Je recherche un PHP moteur de coloration syntaxique pouvant être personnalisé (c'est-à-dire que je peux fournir mes propres tokenizers pour les nouvelles langues) et pouvant gérer plusieurs langues simultanément (c'est-à-dire sur la même page de sortie). Ce moteur doit bien fonctionner avec classes CSS, c'est-à-dire qu'il doit formater la sortie en insérant des éléments <span> ornés d'attributs class. Points bonus pour un schéma extensible.

Je recherche pas un script de mise en évidence de la syntaxe côté client (JavaScript).

Jusqu'à présent, je suis coincé avec GeSHi . Malheureusement, GeSHi échoue de façon catastrophique pour plusieurs raisons. La raison principale est que les différents fichiers de langue définissent des styles complètement différents et incohérents. J'ai passé des heures à essayer de reformuler les différentes définitions de langage en un dénominateur commun, mais comme la plupart des fichiers de définition sont en eux-mêmes assez mauvais, j'aimerais enfin basculer.

Idéalement, j'aimerais avoir une API similaire à CodeRay , Pygments ou à JavaScript dp.SyntaxHighlighter .

Clarification:

Je recherche un logiciel mettant en évidence le code écrit en PHP, pas pour PHP (car je dois l'utiliser depuis PHP).

37
Konrad Rudolph

Puisqu'aucun outil existant ne répondait à mes besoins, j'ai écrit le mien. Et voilà:

Hyperlight

L'utilisation est extrêmement facile: il suffit d'utiliser

 <?php hyperlight($code, 'php'); ?>

mettre en évidence le code. Écrire de nouvelles définitions de langage est également relativement facile: vous devez utiliser des expressions régulières et une machine à états simple mais puissante. À propos, j’ai encore besoin beaucoup de définitions, alors n'hésitez pas à contribuer.

48
Konrad Rudolph

[J'ai marqué cette réponse par Wiki de la communauté parce que vous êtes spécifiquement pas à la recherche de Javascript]

http://softwaremaniacs.org/soft/highlight/est une bibliothèque de surlignage de syntaxe PHP (plus la liste des autres langues prises en charge} :

Python, Ruby, Perl, PHP, XML, HTML, CSS, Django, Javascript, VBScript, Delphi, Java, C++, C #, LISP, RenderMan (RSL et RIB), langage intégré Maya, SQL, Smalltalk, Axapta, 1C, Ini, Diff, DOS .bat, Bash

Il utilise le balisage de style <span class = "keyword">.

Il a également été intégré à dojo toolkit (en tant que projet dojox: dojox.lang.highlight )

Bien qu’il ne s’agisse pas du moyen le plus courant d’exécuter un serveur Web, à proprement parler, le langage Javascript n’est pas implémenté côté client, il existe également des combinaisons Des combinaisons moteur/plate-forme Javascript côté serveur .

10
micahwittman

J'ai trouvé ce surligneur de syntaxe générique simple écrit en PHP ici et je l'ai modifié un peu:

<?php

/**
 * Original => http://phoboslab.org/log/2007/08/generic-syntax-highlighting-with-regular-expressions
 * Usage => `echo SyntaxHighlight::process('source code here');`
 */

class SyntaxHighlight {
    public static function process($s) {
        $s = htmlspecialchars($s);

        // Workaround for escaped backslashes
        $s = str_replace('\\\\','\\\\<e>', $s); 

        $regexp = array(

            // Comments/Strings
            '/(
                \/\*.*?\*\/|
                \/\/.*?\n|
                \#.[^a-fA-F0-9]+?\n|
                \&lt;\!\-\-[\s\S]+\-\-\&gt;|
                (?<!\\\)&quot;.*?(?<!\\\)&quot;|
                (?<!\\\)\'(.*?)(?<!\\\)\'
            )/isex' 
            => 'self::replaceId($tokens,\'$1\')',

            // Punctuations
            '/([\-\!\%\^\*\(\)\+\|\~\=\`\{\}\[\]\:\"\'<>\?\,\.\/]+)/'
            => '<span class="P">$1</span>',

            // Numbers (also look for Hex)
            '/(?<!\w)(
                (0x|\#)[\da-f]+|
                \d+|
                \d+(px|em|cm|mm|rem|s|\%)
            )(?!\w)/ix'
            => '<span class="N">$1</span>',

            // Make the bold assumption that an
            // all uppercase Word has a special meaning
            '/(?<!\w|>|\#)(
                [A-Z_0-9]{2,}
            )(?!\w)/x'
            => '<span class="D">$1</span>',

            // Keywords
            '/(?<!\w|\$|\%|\@|>)(
                and|or|xor|for|do|while|foreach|as|return|die|exit|if|then|else|
                elseif|new|delete|try|throw|catch|finally|class|function|string|
                array|object|resource|var|bool|boolean|int|integer|float|double|
                real|string|array|global|const|static|public|private|protected|
                published|extends|switch|true|false|null|void|this|self|struct|
                char|signed|unsigned|short|long
            )(?!\w|=")/ix'
            => '<span class="K">$1</span>',

            // PHP/Perl-Style Vars: $var, %var, @var
            '/(?<!\w)(
                (\$|\%|\@)(\-&gt;|\w)+
            )(?!\w)/ix'
            => '<span class="V">$1</span>'

        );

        $tokens = array(); // This array will be filled from the regexp-callback

        $s = preg_replace(array_keys($regexp), array_values($regexp), $s);

        // Paste the comments and strings back in again
        $s = str_replace(array_keys($tokens), array_values($tokens), $s);

        // Delete the "Escaped Backslash Workaround Token" (TM)
        // and replace tabs with four spaces.
        $s = str_replace(array('<e>', "\t"), array('', '    '), $s);

        return '<pre><code>' . $s . '</code></pre>';
    }

    // Regexp-Callback to replace every comment or string with a uniqid and save
    // the matched text in an array
    // This way, strings and comments will be stripped out and wont be processed
    // by the other expressions searching for keywords etc.
    private static function replaceId(&$a, $match) {
        $id = "##r" . uniqid() . "##";

        // String or Comment?
        if(substr($match, 0, 2) == '//' || substr($match, 0, 2) == '/*' || substr($match, 0, 2) == '##' || substr($match, 0, 7) == '&lt;!--') {
            $a[$id] = '<span class="C">' . $match . '</span>';
        } else {
            $a[$id] = '<span class="S">' . $match . '</span>';
        }
        return $id;
    }
}

?>

Démo: http://phpfiddle.org/lite/code/1sf-htn


Mettre à jour

Je viens de créer un port PHP de mon surligneur de syntaxe générique JavaScript ici → https://github.com/tovic/generic-syntax-highlighter/blob/master/generic-syntax-highlighter.php

Comment utiliser:

<?php require 'generic-syntax-highlighter.php'; ?>
<pre><code><?php echo SH('&lt;div class="foo"&gt;&lt;/div&gt;'); ?></code></pre>
9
Taufik Nurrohman

Il pourrait être intéressant de regarder Pear_TextHighlighter ( documentation )

Je pense que, par défaut, le HTML ne produira pas exactement ce que vous souhaitez, mais il offre des fonctionnalités étendues de personnalisation (c.-à-d. Que vous pouvez créer différents rendus/analyseurs syntaxiques).

3
Tom Haigh

J'avais exactement le même problème, mais comme je n'avais que très peu de temps et qu'il me fallait une bonne couverture de code, j'ai décidé d'écrire un PHP wrapper autour de Pygments library.

Cela s'appelle PHPygmentizator . C'est vraiment simple à utiliser. J'ai écrit un très basique manuel . Comme PHP est principalement le langage de développement Web, j'ai subordonné la structure à ce fait et il a été très facile à implémenter dans presque tous les types de sites Web.

Il supporte les fichiers de configuration et si cela ne suffit pas et que quelqu'un a besoin de modifier certaines choses dans le processus, il déclenche également les événements .

Une démonstration de son fonctionnement peut être trouvée sur pratiquement n'importe quel post de mon blog qui contient du code source, celui-ci par exemple .

Avec la configuration par défaut, vous pouvez simplement lui fournir une chaîne dans ce format:

Any text here.

[pygments=javascript]
var a = function(ar1, ar2) {
    return null;
}
[/pygments]

Any text.

Donc, il met en évidence le code entre les balises (les balises peuvent être personnalisées dans le fichier de configuration) et laisse le reste inchangé.

De plus, j’ai déjà fait une reconnaissance de syntaxe bibliothèque (elle utilise un algorithme qui serait probablement classé comme probabilité bayésienne ), qui reconnaît automatiquement le bloc de code de langue écrit pouvant être facilement raccordé à l’un des PHPygmentizator events pour fournir une reconnaissance automatique de la langue. Je vais probablement le rendre public quelque temps cette semaine car je dois embellir un peu la structure et écrire de la documentation de base. Si vous lui fournissez suffisamment de données "d'apprentissage", il reconnaît étonnamment bien les langues. J'ai même testé des javascripts et des langages minifiés, dotés de mots-clés et de structures similaires, et cela ne s'est jamais trompé.

2
user2742648

Pourquoi ne pas utiliser le surligneur de syntaxe intégré de PHP?

http://php.net/manual/en/function.highlight-string.php

1
Gabor de Mooij

Je suis un peu en retard, mais je travaille sur ma propre bibliothèque de coloration syntaxique PHP. Il en est encore à ses débuts, mais je l’utilise pour tous les exemples de code sur mon blog.

Je viens de vérifier Hyperlight. Ça a l'air cool, mais ça fait des trucs assez fous. Boucles imbriquées, traitement ligne par ligne, etc. La classe principale comprend plus de 1000 lignes de code. 

Si vous êtes intéressé par quelque chose de simple et léger, consultez Nijikodo: http://www.craigiam.com/nijikodo

1
Craig

Une autre option consiste à utiliser le programme GPLHighlight GUId'André Simon, disponible pour la plupart des plateformes. Il convertit PHP (et d’autres langages) en HTML, RTF, XML, etc. que vous pouvez ensuite couper et coller dans la page de votre choix. De cette façon, le traitement n'est effectué qu'une seule fois.

Le code HTML est également basé sur CSS, vous pouvez donc changer le style à votre guise.

Personnellement, j'utilisedp.SyntaxHighlighter, mais cela utilise Javascript côté client, donc il ne répond pas à vos besoins. Il possède un plugin Nice Windows Live que je trouve utile.

1
Rob Prouse

Le PHP Surligneur de Krijn Hoetmer fournit une classe PHP entièrement personnalisable pour mettre en surbrillance la syntaxe PHP. Le code HTML qu'il génère, valide sous un doctype strict et est totalement stylable avec CSS.

0
Mathias Bynens

PHP Prettify Fonctionne bien jusqu'à présent et a plus de personnalisation que highlight_string

0
Chrys Ugwu