【问题标题】:Pygments pygmentize pass stringpygments pygmentize 传递字符串
【发布时间】:2013-01-23 23:48:02
【问题描述】:

我决定将Pygments 用于我正在开发的网站,但我缺乏终端知识令人惊讶。

我想使用pygmentize 来突出博客文章中的语法,但由于它们存储在数据库中,我不能只将文件名传递给它。有什么办法可以把字符串传进去吗?

如果没有,我将不得不将帖子内容保存在临时文件中,对其进行 pygmentize 并加载到数据库中,但这会增加开销,我真的希望尽可能避免。

我没有看到 CLI documentation 对此发表任何评论。

【问题讨论】:

    标签: php shell pygments


    【解决方案1】:

    man page 表示如果 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>
    

    如果您使用 PHP 运行它,您必须使用 proc_open() 启动 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 是很酷的东西!我也在用它:)

    【讨论】:

    • 是的,我意识到这一点,并认为找到一种将它与 PHP 一起使用的方法会比使用 JavaScript 解决方案更好。如果它有效,那么惊人的答案,一旦我测试它就接受!
    • 很好 :) 玩得开心。如果 pygments 因任何原因失败,您也应该从 stderr 读取错误消息
    • 我一定会的。如果它确实失败了,我会在它进来时返回干净的源代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多