39 votes

La mise en évidence de la syntaxe

Je suis à la recherche de PHP de la syntaxe du moteur qui peuvent être personnalisés (c'est à dire que je peux fournir mon propre des générateurs de jetons pour de nouvelles langues) et qui peut gérer plusieurs langues simultanément (c'est à dire sur la même page de sortie). Ce moteur a bien travailler avec des classes CSS, c'est à dire qu'il doit le format de sortie par l'insertion, <span> éléments qui sont ornés class attributs. Les points de Bonus pour un extensible de schéma.

Je n'ai pas de recherche pour un client du côté de la syntaxe de script (JavaScript).

Jusqu'à présent, je suis coincé avec GeSHi. Malheureusement, GeSHi échoue lamentablement échoué pour plusieurs raisons. La raison principale est que les différents fichiers de langue de définir complètement différentes, incompatibles les styles. J'ai travaillé des heures à essayer de revoir les différents la définition de la langue vers le bas à un dénominateur commun, mais puisque la plupart des fichiers de définition sont en eux-mêmes tout à fait mauvaise, j'avais enfin passer à un autre.

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

Précisions:

Je suis à la recherche d'un code mettant en avant un logiciel écrit en PHP, pas de PHP (car j'ai besoin de l'utiliser à partir de l'intérieur de PHP).

48voto

Konrad Rudolph Points 231505

Car aucun outil existant satisfait mes besoins, j'ai écrit mon propre. Et voilà:

Hyperlight

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

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

pour mettre en évidence le code. L'écriture de nouveaux la définition de la langue est relativement facile, trop – à l'aide d'expressions régulières et d'un moteur puissant mais simple machine d'état. Par ailleurs, j'ai encore besoin de beaucoup de définitions, alors n'hésitez pas à contribuer.

Pour l'instant, j'ai hébergé le code source sur Google code (voir le lien ci-dessus), ce qui rend la collaboration très facile.

10voto

micahwittman Points 6943

[J'ai marqué que cette réponse Wiki de la Communauté parce que vous êtes particulièrement pas à la recherche pour le Javascript]

http://softwaremaniacs.org/soft/highlight/ est un PHP (en plus de la liste ci-dessous des autres langues prises en charge) de la syntaxe de la bibliothèque:

Python, Ruby, Perl, PHP, XML, HTML, CSS, Django, Javascript, VBScript, Delphi, Java, C++, C#, Lisp, RenderMan (RSL et RIB), Maya Embedded Language, SQL, SmallTalk, Axapta, 1C, Ini, la Diff DOS .chauve-souris, Bash

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

Il a également été intégré dans le dojo toolkit (comme un dojox projet: dojox.lang.mettez en surbrillance)

Mais pas le moyen le plus populaire pour lancer un serveur web, à proprement parler, le Javascript n'est pas seulement mis en œuvre sur le côté client, mais il y a aussi de Serveur-Côté moteur Javascript/combinaisons de plate-forme aussi.

9voto

Taufik Nurrohman Points 572

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

 <?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

3voto

Tom Haigh Points 32314

Il vaut peut-être la peine de regarder Pear_TextHighlighter ( documentation )

Je pense que, par défaut, le HTML ne restitue pas exactement comme vous le souhaitez, mais il offre des fonctionnalités étendues de personnalisation (vous pouvez créer différents moteurs de rendu / parseur).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X