1

作業中のWebサイトにPygmentsを使用することにしましたが、端末の知識が不足していることは驚くべきことです。

ブログ投稿の構文を強調表示するために使用したいのですpygmentizeが、それらはデータベースに保存されているため、ファイル名を渡すことはできません。文字列を渡す方法はありますか?

そうでない場合は、投稿の内容を一時ファイルに保存し、それを pygmentize してデータベースにロードする必要がありますが、これにより、可能な限り避けたいオーバーヘッドが追加されます。

CLI ドキュメントでそれについて何も述べられていません。

4

1 に答える 1

2

マニュアルページには、infileが省略されている場合はstdinから読み取り、outfileが省略されている場合はstdoutに書き込むと記載されています。

したがって、コマンドラインで次のように入力します。

$ pymentize -l php -f html
<?php

echo 'hello world!';
^D // type: Control+D

pymentizeは次のように出力します。

<div class="highlight"><pre><span class="cp">&lt;?php</span>

<span class="k">echo</span> <span class="s1">&#39;hello world!&#39;</span><span class="p">; </span>
</pre></div>

proc_open()これをPHPから実行する場合は、stdinに書き込む必要があるため、を使用してpygmentizeを開始する必要があります。これを行う方法の簡単な例を次に示します。

echo pygmentize('<?php echo "hello world!\n"; ?>');

/**
 * Highlights a source code string using pygmentize
 */
function pygmentize($string, $lexer = 'php', $format = 'html') {
    // use proc open to start pygmentize
    $descriptorspec = array (
        array("pipe", "r"), // stdin
        array("pipe", "w"), // stdout
        array("pipe", "w"), // stderr
    );  

    $cwd = dirname(__FILE__);
    $env = array();

    $proc = proc_open('/usr/bin/pygmentize -l ' . $lexer . ' -f ' . $format,
        $descriptorspec, $pipes, $cwd, $env);

    if(!is_resource($proc)) {
        return false;
    }   

    // now write $string to pygmentize's input
    fwrite($pipes[0], $string);
    fclose($pipes[0]);

    // the result should be available on stdout
    $result = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    // we don't care about stderr in this example

    // just checking the return val of the cmd
    $return_val = proc_close($proc);
    if($return_val !== 0) {
        return false;
    }   

    return $result;
}

ところで、pygmentizeはかなりクールなものです!私も使っています:)

于 2013-01-24T00:35:35.307 に答える