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

使用pygments.formatters.html_get_ttype_class()在Python中生成带有数字高亮的HTML代码

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

pygments是一个用于语法高亮的Python库,可以将代码以HTML格式呈现。其中的formatters模块提供了各种格式化输出的工具。html_get_ttype_class()函数用于为HTML标记生成匹配的语法高亮类。

下面是一个使用pygments.formatters.html_get_ttype_class()生成带有数字高亮的HTML代码的例子:

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

def highlight_with_number(html_code):
    # 创建一个自定义的HtmlFormatter
    class MyHtmlFormatter(HtmlFormatter):
        def wrap(self, source, outfile):
            # 调用Pygments的默认标记格式化
            answer = HtmlFormatter.wrap(self, source, outfile)
            # 搜索数字并为匹配到的数字添加自定义的class
            highlighted = answer[:]
            for i, line in enumerate(answer):
                highlighted[i] = _get_ttype_class(line, line[-1])
                pos = 0
                while True:
                    pos = line.find('<span', pos)
                    if pos == -1:
                        break
                    pos = line.find('>', pos + 1)
                    if pos == -1:
                        break
                    pos += 1
                    html_code_pos = html_code.index(line[pos:], pos)
                    if html_code_pos != -1:
                        digit_start = html_code_pos + pos
                        digit_end = digit_start + len(line[pos:]) - 7
                        digit = html_code[digit_start:digit_end]
                        try:
                            float_value = float(digit)
                            nonlocal highlighted
                            highlighted[i] = highlighted[i].replace(
                                f'<span class="n">{digit}</span>', 
                                f'<span class="n"><b>{digit}</b></span>'
                            )
                        except ValueError:
                            pass
                    pos += 1
            return highlighted

    # 高亮Python代码
    code = """
        x = 123
        y = 3.14
        print(x + y)
    """
    lexer = PythonLexer()
    formatter = MyHtmlFormatter()
    highlighted_code = highlight(code, lexer, formatter)

    return highlighted_code


# 调用highlight_with_number()并打印结果
html_code = highlight_with_number()
print(html_code)

在上述代码中,我们首先定义了一个自定义的HtmlFormatter子类MyHtmlFormatter。在wrap()方法中,我们调用了HtmlFormatter.wrap()来获取Pygments的默认HTML格式化结果。然后,我们遍历每一行的代码,搜索数字,并为匹配到的数字添加自定义的class来实现高亮。

最后,我们使用了highlight()函数来高亮Python代码,并将生成的HTML代码打印出来。注意,在实际使用中,你需要将生成的HTML代码插入到HTML页面中进行展示。