PHP sözdizimi vurgulama

9 Cevap php

Ben bir PHP syntax highlighting engine Bu özelleştirilebilir (yani benim own tokenizers yeni diller için sağlayabilir) ve birkaç dil simultaneously (yani işleyebilir Arıyorum Aynı çıkış sayfa). Bu motor CSS classes, bu class nitelikleri ile bezenmiştir <span> elemanları takarak çıkışı biçimlendirmek gerekir yani birlikte iyi çalışmak zorundadır. Genişletilebilir bir şema için bonus puan.

I not komut dosyası (JavaScript) vurgulayarak, bir istemci tarafı sözdizimi için arama yapın.

Şimdiye kadar, ben GeSHi ile şaşırıp. Ne yazık ki, GeSHi çeşitli nedenlerle abysmally başarısız olur. Temel nedeni farklı dil dosyaları tamamen farklı, tutarsız stilleri tanımlamak olmasıdır. Ben bir ortak payda aşağı farklı dil tanımlarını refactor çalışıyorum saat çalıştık ama çoğu tanım dosyaları kendilerini oldukça kötü olduğundan, nihayet geçmek istiyorum.

İdeal olarak, CodeRay, Pygments veya JavaScript dp.SyntaxHighlighter benzer bir API var istiyorum.

Clarification:

Ben yazılmış bir kod vurgulama yazılım arıyorum in PHP, değil for PHP (PHP içinde onu kullanmak gerekir çünkü).

9 Cevap

Hiçbir mevcut araç benim ihtiyaçlarını tatmin beri, benim kendi yazdı. Lo ve ne görsün:

Hyperlight

Sadece kullanın: Kullanımı son derece kolaydır

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

kodunu vurgulayın. Yeni dil tanımlarını yazarken de, nispeten kolaydır - düzenli ifadeler ve güçlü ama basit bir durum makinesi kullanılarak. Bu arada, ben hala need tanımların çok çok katkıda çekinmeyin.

Şimdilik, ben işbirliğinin çok kolay Google kod kaynak kodu (yukarıdaki bağlantıya bakınız) ev sahipliği ettik.

[Eğer JavaScript arıyor özellikle not çünkü ben Community Wiki Bu cevap işaretlenmiş]

Kütüphane vurgulayarak http://softwaremaniacs.org/soft/highlight/ is a PHP (plus the following list of other languages supported) sözdizimi:

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

Bu <span class="keyword"> stil biçimlendirme kullanır.

O da (bir dojox proje olarak: dojox.lang.highlight) dojo toolkit entegre edilmiştir

Bir web sunucusu çalıştırmak için en popüler yolu, kesinlikle konuşma olsa, Javascript değil sadece istemci tarafında uygulanan, ancak Server-Side Javascript engine/platform combinations too da vardır.

Bu Pear_TextHighlighter bakarak değer (documentation) olabilir

(Yani farklı render / ayrıştırıcılarını oluşturabilirsiniz) Ben varsayılan çıkış html tarafından istediğiniz olmaz tam olarak nasıl düşünüyorum, ama özelleştirme için geniş olanaklar sağlıyor

Ben tam olarak aynı problem vardı ama ben zamanında çok kısa oldu ve gerçekten iyi kod kapsama gerektiği gibi etrafa Pygments kitaplık bir PHP sarıcı yazmaya karar verdim.

Bu deniyor PHPygmentizator. Kullanması gerçekten çok basit. Ben bir çok temel manual yazdı. PHP öncelikle, ben bu gerçeği yapısını tabi ve çok kolay web sitesi hemen hemen her türlü uygulamaya yapılan Web Geliştirme dili gibi.

Bu configuration files destekler ve bu yeterli değildir ve eğer birileri o da patlar sürecinde şeyler değiştirmek gerekiyor events.

Nasıl işlediğini demo kaynak kodu içeren benim blogun temelde herhangi bir yazı, bulunabilir this one for example.

Varsayılan yapılandırma ile sadece bunu bu biçimde bir dize sağlayabilir:

Any text here.

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

Any text.

Yani etiketleri arasındaki kodu (etiketleri yapılandırma dosyasında özelleştirilebilir) vurgular ve el değmemiş kalan bırakır.

Ayrıca ben zaten Sözdizimi tanıma library otomatik olarak yazılır ve kolayca birine asılabildiği dil kod bloğu tanır (ki bu muhtemelen Bayesian probability olarak sınıflandırılmış olacaktır algoritması kullanır) yapılan PHPygmentizator olaylar otomatik dil tanıma sağlamak. Ben bu yapıyı biraz güzelleştirmek ve bazı temel belgelerine yazmak gerekir çünkü ben muhtemelen bu hafta kamu biraz zaman yapacaktır. Eğer yeterli "öğrenme" verilerle arz eğer ben bile minified Javascript'leri ve benzer anahtar kelimeleri ve yapıları vardır dillerini test edilmiş ve o asla hata yapmamış, inanılmaz iyi dilleri tanır.

Başka bir seçenek en platformları için geçerli Andre Simon tarafından GPL Highlight GUI bir program kullanmaktır. Bu daha sonra kesilmiş ve istediğiniz sayfanın içine yapıştırın vb HTML, RTF, XML, PHP (ve diğer diller) dönüştürür. Bu şekilde, işlem sadece bir kez yapılır.

HTML de tabanlı CSS, yani sizin gibi stilini lütfen değiştirebilirsiniz.

Şahsen ben dp.SyntaxHighlighter kullanmak, ancak sizin ihtiyaçlarınızı karşılamak değil böylece, istemci tarafında Javascript kullanır. Ben yararlı olsa hangi güzel bir Windows Live eklentisi var.

Burada uymak, ama kütüphane vurgulayarak kendi PHP sözdizimi üzerinde çalışıyoruz biraz geç. Bu erken aşamalarında hala, ama benim blog tüm kod örnekleri için bunu kullanıyorum.

Sadece Hyperlight kontrol etti. Bu oldukça serin görünüyor, ama bazı çılgınca şeyler yapıyor. İç içe döngüler, satır işleme hattı, vs çekirdek sınıf kod 1000 satır.

If you are interested in something simple and lightweight check out Nijikodo: http://www.craigiam.com/nijikodo

Neden PHP sözdizimi vurgulayıcı build-in kullanmak değil mi?

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

Krijn Hoetmer en PHP Highlighter PHP sözdizimi vurgulamak için tamamen özelleştirilebilir bir PHP sınıfını sağlar. Ürettiği HTML, sıkı doctype altında doğrular, ve CSS ile tamamen stylable.

Ben PHP here yazılı bu basit genel sözdizimi vurgulayıcı bulundu ve biraz değiştirilmiş:

<?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/code/1sf-htn