欢迎访问宙启技术站
智能推送

Python中利用pygments.formatters.html_get_ttype_class()函数实现代码数字高亮功能

发布时间:2024-01-18 08:11:53

pygments是一个通用的代码高亮库,可以支持多种语言和多种输出格式。pygments.formatters.html_get_ttype_class()函数是pygments库中的一个功能函数,用于获取代码的标记类型,并返回相应的CSS类名称,以实现代码高亮。

下面是一个使用pygments.formatters.html_get_ttype_class()函数实现代码数字高亮功能的例子:

1. 首先,我们需要安装pygments库,可以使用pip命令进行安装:

pip install pygments

2. 在Python代码中导入必要的库:

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

3. 创建一个简单的Python代码字符串:

code = """
def fibonacci(n):
    if n <= 0:
        return 'Invalid input'
    elif n == 1:
        return 0
    elif n == 2:
        return 1
    else:
        a, b = 0, 1
        for _ in range(n - 2):
            a, b = b, a + b
        return b
"""

4. 定义一个函数,用于将代码字符串高亮并添加数字高亮功能:

def highlight_with_number(code):
    lexer = PythonLexer()
    formatter = HtmlFormatter(cssclass='syntax')
    result = []

    for i, line in enumerate(code.split('
')):
        line_with_number = f'<span class="line-number">{i+1}</span>{line}'
        tokens = lexer.get_tokens(line_with_number)
        result.append(highlight(line_with_number, lexer, formatter))

    return '
'.join(result)

5. 调用highlight_with_number()函数对代码进行高亮并添加数字高亮功能:

highlighted_code = highlight_with_number(code)

6. 创建一个HTML文件,在文件中显示高亮后的代码:

html = f'''
<!doctype html>
<html>
<head>
    <style>
        .line-number {{
            display: inline-block;
            width: 30px;
            background-color: #f0f0f0;
            padding-right: 5px;
            text-align: right;
            margin-right: 5px;
            border-right: 1px solid gray;
        }}
        .syntax {{
            background-color: #f0f0f0;
            padding: 10px;
            font-family: "Courier New", Courier, monospace;
            white-space: pre-wrap;
        }}
        {HtmlFormatter().get_style_defs('.syntax')}
    </style>
</head>
<body>
    {highlighted_code}
</body>
</html>
'''

with open('highlighted_code.html', 'w') as f:
    f.write(html)

以上代码中,我们首先使用PythonLexer对代码进行词法分析,获取到代码中每个符号的标记类型。然后,将代码按行分割,并在每行开头添加行号。通过调用highlight()函数对每行代码进行高亮,并传入HtmlFormatter对象生成相应的HTML代码。最后,将高亮后的代码,以及适当的CSS样式写入HTML文件中。

需要注意的是,在生成HTML时,我们使用了pygments库中的默认CSS样式,可以通过调用HtmlFormatter().get_style_defs('.syntax')获取到,其中'.syntax'是我们设置给代码框的CSS类名,也可以自定义其他样式。

最后,运行上述代码,将会生成一个名为'highlighted_code.html'的HTML文件,其中包含高亮并带有行号的代码。通过打开该文件,即可看到数字高亮的效果。