介绍与快速入门¶
欢迎使用 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">"Hello World"</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
是样式名称。
可以在 命令行参考 中找到更多选项和技巧。