将字符串流式传输到 pygments 词法分析器?

Posted

技术标签:

【中文标题】将字符串流式传输到 pygments 词法分析器?【英文标题】:Stream a string into pygments lexer? 【发布时间】:2016-06-29 15:11:35 【问题描述】:

我想使用 pygments 即时为我突出显示代码 - 基本上是一个巨大的 JSON 对象列表。这是我尝试过的:

from pygments.lexers import JsonLexer
from pygments.formatters import htmlFormatter
from pygments import highlight
import StringIO
f = StringIO.StringIO()
f.write('a')
f.seek(0)
print highlight(f, JsonLexer(), HtmlFormatter())

这给了我以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/d33tah/virtualenv/lib/python2.7/site-packages/pygments/__init__.py", line 87, in highlight
    return format(lex(code, lexer), formatter, outfile)
  File "/home/d33tah/virtualenv/lib/python2.7/site-packages/pygments/__init__.py", line 45, in lex
    return lexer.get_tokens(code)
  File "/home/d33tah/virtualenv/lib/python2.7/site-packages/pygments/lexer.py", line 151, in get_tokens
    text, _ = guess_decode(text)
  File "/home/d33tah/virtualenv/lib/python2.7/site-packages/pygments/util.py", line 309, in guess_decode
    text = text.decode('utf-8')
AttributeError: StringIO instance has no attribute 'decode'

显然这是错误的界面。什么是正确的?

【问题讨论】:

【参考方案1】:

highlight 期望 f 是一个字符串,它有一个 decode 属性。 StringIO 没有那个属性。

In [30]: type(f)
Out[30]: instance

In [31]: type(f.read())
Out[31]: str

只需使用直字符串即可。

In [34]: pygments.highlight('a', lexer, formatter)
Out[34]: u'<div class="highlight"><pre><span></span><span class="err">a</span>\n</pre></div>\n'

【讨论】:

以上是关于将字符串流式传输到 pygments 词法分析器?的主要内容,如果未能解决你的问题,请参考以下文章

pygments 如何猜测词法分析器?

如何在 pygments 中安装新的词法分析器?

用于 AspectJ 的 Pygments 词法分析器

将附加扩展与现有的词法分析器相关联

在 Trac 中使用没有 mime 类型的 Pygments 词法分析器?

简单的 CSV 词法分析器