Пигменты пигментируют строку передачи

Я решил использовать Pygments для веб-сайта, над которым я работаю, но мое отсутствие знаний о терминалах поражает.

Я хочу использовать pygmentize для выделения синтаксиса в сообщениях блога, но, поскольку они хранятся в базе данных, я не могу просто передать ему имя файла. Есть ли способ передать в него строку?

Если нет, мне придется сохранить содержимое сообщения во временном файле, pygmentize его и загрузить в базу данных, но это добавляет накладные расходы, которых я действительно хотел бы избежать, если это вообще возможно.

Я не вижу, чтобы документация CLI что-либо говорила об этом.


person Community    schedule 23.01.2013    source источник


Ответы (1)


На справочной странице говорится, что он читает со стандартного ввода, если входной файл опущен, и записывает на стандартный вывод, если выходной файл опущен.

Итак, в командной строке вы должны ввести:

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

Если вы запустите это с помощью PHP, вам придется начать pygmentize, используя proc_open()< /a> так как вам придется писать об этом на стандартный ввод. Вот краткий пример, как это сделать:

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

Кстати, пигментирование — это довольно крутая штука! Я тоже им пользуюсь :)

person hek2mgl    schedule 24.01.2013
comment
Да, я это понял и решил, что лучше найти способ использовать его с PHP, чем довольствоваться решениями на JavaScript. Удивительный ответ, если он работает, принимаю, как только я его протестирую! - person ; 24.01.2013
comment
Хорошо :) Получайте удовольствие от этого. Вы также должны читать из stderr, чтобы получать сообщения об ошибках, если pygments терпит неудачу по какой-либо причине. - person hek2mgl; 24.01.2013
comment
Я обязательно. Если это не удастся, я просто верну исходный код в том виде, в котором он был получен. - person ; 24.01.2013