介绍与快速入门

欢迎使用 Pygments!本文档解释了基本概念和术语,并提供了一些使用该库的示例。

架构

有四种类型的组件协同工作以突出显示代码片段

  • 词法分析器将源代码拆分为标记,源代码的片段,其标记类型确定文本在语义上的含义(例如,关键字、字符串或注释)。对于 Pygments 支持的每种语言或标记格式,都有一个词法分析器。

  • 标记流可以通过过滤器传递,过滤器通常修改标记类型或文本片段,例如将所有关键字大写。

  • 格式化程序然后接收标记流并将其写入输出文件,格式为 HTML、LaTeX 或 RTF 等。

  • 在写入输出时,样式决定如何突出显示所有不同的标记类型。它将它们映射到属性,如“红色和粗体”。

示例

以下是一个突出显示 Python 代码的小示例

from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter

code = 'print "Hello World"'
print(highlight(code, PythonLexer(), HtmlFormatter()))

它打印类似于以下的内容

<div class="highlight">
<pre><span class="k">print</span> <span class="s">&quot;Hello World&quot;</span></pre>
</div>

如您所见,Pygments 使用 CSS 类(默认情况下,但您可以更改),而不是内联样式,以避免重复输出冗余的样式信息。可以由以下内容生成包含输出中可能使用的所有 CSS 类的 CSS 样式表

print(HtmlFormatter().get_style_defs('.highlight'))

传递给 get_style_defs() 的参数用作附加 CSS 选择器:输出可能类似于以下内容

.highlight .k { color: #AA22FF; font-weight: bold }
.highlight .s { color: #BB4444 }
...

选项

The highlight() 函数支持第四个名为 outfile 的参数,如果给出,它必须是文件对象。然后,格式化的输出将写入此文件,而不是作为字符串返回。

词法分析器和格式化程序都支持选项。它们作为关键字参数传递给它们,要么传递给类,要么传递给查找方法

from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import HtmlFormatter

lexer = get_lexer_by_name("python", stripall=True)
formatter = HtmlFormatter(linenos=True, cssclass="source")
result = highlight(code, lexer, formatter)

这使得词法分析器从输入中去除所有前导和尾随空白(stripall 选项),让格式化程序输出行号(linenos 选项),并将包装 <div> 的类设置为 source(而不是 highlight)。

重要的选项包括

encoding对于词法分析器和格式化程序

由于 Pygments 在内部使用 Unicode 字符串,因此这决定了将用于转换为或从字节字符串转换的编码。

style对于格式化程序

写入输出时使用的样式名称。

有关内置词法分析器和格式化程序及其选项的概述,请访问 词法分析器格式化程序 列表。

有关过滤器的文档,请参阅 此页面

词法分析器和格式化程序查找

如果您想通过其别名或文件名查找内置词法分析器,您可以使用以下方法之一

>>> from pygments.lexers import (get_lexer_by_name,
...     get_lexer_for_filename, get_lexer_for_mimetype)

>>> get_lexer_by_name('python')
<pygments.lexers.PythonLexer>

>>> get_lexer_for_filename('spam.rb')
<pygments.lexers.RubyLexer>

>>> get_lexer_for_mimetype('text/x-perl')
<pygments.lexers.PerlLexer>

所有这些函数都接受关键字参数;它们将作为选项传递给词法分析器。

格式化程序也有类似的 API:使用 get_formatter_by_name()get_formatter_for_filename() 来自 pygments.formatters 模块来实现此目的。

猜测词法分析器

如果您不知道文件的内容,或者您想突出显示扩展名不明确的文件,例如 .html(它可能包含纯 HTML 或一些模板标签),请使用以下函数

>>> from pygments.lexers import guess_lexer, guess_lexer_for_filename

>>> guess_lexer('#!/usr/bin/python\nprint "Hello World!"')
<pygments.lexers.PythonLexer>

>>> guess_lexer_for_filename('test.py', 'print "Hello World!"')
<pygments.lexers.PythonLexer>

.guess_lexer() 将给定内容传递给词法分析器类的 analyse_text() 方法,并返回返回最高数字的词法分析器。

所有词法分析器都有两个不同的文件名模式列表:主要列表和次要列表。The get_lexer_for_filename() 函数只使用主要列表,其条目应该在所有词法分析器中是唯一的。然而,guess_lexer_for_filename() 首先将遍历所有词法分析器,并查看文件名匹配时主要和次要文件名模式。如果只有一个词法分析器匹配,则返回它,否则使用 guess_lexer() 的猜测机制,并使用匹配的词法分析器。

像往常一样,这些函数的关键字参数将作为选项传递给创建的词法分析器。

命令行使用

您可以使用命令行中的 Pygments,使用 pygmentize 脚本

$ pygmentize test.py

将使用 ANSI 转义序列(又名终端颜色)突出显示 Python 文件 test.py,并将结果打印到标准输出。

要输出 HTML,请使用 -f 选项

$ pygmentize -f html -o test.html test.py

将 test.py 的 HTML 突出显示版本写入文件 test.html。请注意,它将只是一个 HTML 片段,如果您想要完整的 HTML 文档,请使用“full”选项

$ pygmentize -f html -O full -o test.html test.py

这将生成包含包含样式表的完整 HTML 文档。

可以使用 -O style=<name> 选择样式。

如果您需要使用 Pygments CSS 类为现有 HTML 文件创建样式表,可以使用

$ pygmentize -S default -f html > style.css

其中 default 是样式名称。

可以在 命令行参考 中找到更多选项和技巧。