Domanda

Sto cercando un motore di evidenziazione della sintassi PHP che può essere personalizzato (cioè posso fornire i miei tokenizzatori personali per nuove lingue) e in grado di gestire diverse lingue < em> simultaneamente (cioè sulla stessa pagina di output). Questo motore deve funzionare bene insieme a classi CSS , ovvero dovrebbe formattare l'output inserendo <span> elementi che sono adornati con class attributi. Punti bonus per uno schema estensibile.

non cerco uno script di evidenziazione della sintassi sul lato client (JavaScript).

Finora sono bloccato con GeSHi . Sfortunatamente, GeSHi fallisce in modo abissale per diversi motivi. Il motivo principale è che i diversi file di lingua definiscono stili completamente diversi e incoerenti. Ho lavorato ore cercando di trasformare le diverse definizioni linguistiche in un comune denominatore, ma poiché la maggior parte dei file di definizione è di per sé piuttosto male, vorrei finalmente passare.

Idealmente, vorrei avere un'API simile a CodeRay , Pygments o JavaScript dp.SyntaxHighlighter .

Chiarimento:

Sto cercando un software per evidenziare il codice scritto in PHP, non per PHP (dato che devo usarlo dall'interno di PHP).

È stato utile?

Soluzione

Poiché nessuno strumento esistente ha soddisfatto le mie esigenze, ho scritto il mio. Ecco ed ecco:

Hyperlight

L'utilizzo è estremamente semplice: basta usare

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

per evidenziare il codice. Scrivere nuove definizioni linguistiche è anche relativamente facile & # 8211; usando espressioni regolari e una macchina a stati potente ma semplice. A proposito, ho ancora bisogno di molte definizioni, quindi sentitevi liberi di contribuire.

Altri suggerimenti

[Ho contrassegnato questa risposta come Community Wiki perché in particolare non stai cercando Javascript]

http://softwaremaniacs.org/soft/highlight/ è una libreria di evidenziazione della sintassi PHP ( più il seguente elenco di altre lingue supportate ):

  

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

Utilizza < span class = " parola chiave " > markup di stile.

È stato anche integrato nel dojo toolkit (come progetto dojox: dojox.lang.highlight )

Sebbene non sia il modo più popolare per eseguire un server web, a rigor di termini, Javascript non è solo implementato sul lato client, ma ci sono anche Anche combinazioni motore / piattaforma Javascript lato server .

Ho trovato questo semplice evidenziatore di sintassi generico scritto in PHP qui e modificato un po ':

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

?>

Demo: http://phpfiddle.org/lite/ codice / 1SF-HTN


Aggiornamento

Ho appena creato una porta PHP del mio evidenziatore di sintassi generico JavaScript qui & # 8594; https://github.com/tovic/ generic-sintassi-evidenziatore / blob / master / generic-sintassi-highlighter.php

Come usare:

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

Potrebbe valere la pena di guardare Pear_TextHighlighter ( documentazione )

Penso che l'output HTML non sarà esattamente come lo desideri, ma fornisce ampie funzionalità per la personalizzazione (ovvero puoi creare diversi renderer / parser)

Avevo esattamente lo stesso problema, ma dato che avevo poco tempo e che avevo bisogno di una copertura del codice davvero buona, ho deciso di scrivere un wrapper PHP intorno a Pygments libreria.

Si chiama PHPygmentizator . È davvero semplice da usare. Ho scritto un manuale molto semplice . Poiché PHP è principalmente il linguaggio di sviluppo Web, ho subordinato la struttura a tale fatto e reso molto facile l'implementazione in quasi ogni tipo di sito Web.

Supporta file di configurazione e in caso contrario abbastanza e qualcuno ha bisogno di modificare roba nel processo che spara anche events .

La demo di come funziona può essere trovata praticamente su qualsiasi post del mio blog che contiene codice sorgente, questo ad esempio .

Con la configurazione predefinita puoi semplicemente fornire una stringa in questo formato:

Any text here.

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

Any text.

Quindi evidenzia il codice tra i tag (i tag possono essere personalizzati nel file di configurazione) e lascia il resto intatto.

Inoltre ho già effettuato il riconoscimento della sintassi libreria (utilizza un algoritmo che probabilmente verrebbe classificato come Probabilità bayesiana ) che riconosce automaticamente in quale blocco di codice lingua è scritto e può essere facilmente agganciato a uno degli eventi PHPygmentizator per fornire il riconoscimento automatico della lingua. Probabilmente lo renderò pubblico qualche volta questa settimana poiché devo abbellire un po 'la struttura e scrivere un po' di documentazione di base. Se gli fornisci abbastanza & Quot; learning & Quot; dati che riconosce le lingue incredibilmente bene, ho testato anche javascript e lingue minimizzati che hanno parole chiave e strutture simili e non ha mai commesso un errore.

Un'altra opzione è utilizzare la GPL Highlight GUI programma di Andre Simon che è disponibile per la maggior parte delle piattaforme. Converte PHP (e altre lingue) in HTML, RTF, XML, ecc. Che è quindi possibile tagliare e incollare nella pagina desiderata. In questo modo, l'elaborazione viene eseguita una sola volta.

L'HTML è anche basato su CSS, quindi puoi cambiare lo stile come preferisci.

Personalmente, utilizzo dp.SyntaxHighlighter , ma che utilizza client Javascript laterale, quindi non soddisfa le tue esigenze. Ha un bel plugin per Windows Live che trovo utile.

Un po 'tardi per suonare qui, ma ho lavorato sulla mia libreria di evidenziazione della sintassi PHP. È ancora nelle sue fasi iniziali, ma lo sto usando per tutti gli esempi di codice sul mio blog.

Ho appena verificato Hyperlight. Sembra piuttosto bello, ma sta facendo cose piuttosto pazze. Loop nidificati, elaborazione riga per riga, ecc. La classe principale è oltre 1000 righe di codice.

Se sei interessato a qualcosa di semplice e leggero, controlla Nijikodo: http://www.craigiam.com/nijikodo

Perché non usare l'evidenziatore di sintassi incorporato di PHP?

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

Evidenziatore PHP di Krijn Hoetmer fornisce una classe PHP completamente personalizzabile per evidenziare la sintassi PHP . L'HTML che genera, si convalida con un doctype rigoroso ed è completamente stylable con CSS.

PHP Prettify Funziona bene finora e ha più personalizzazione di highlight_string

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top